<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.innovaphone.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tfu</id>
	<title>innovaphone wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.innovaphone.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tfu"/>
	<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Special:Contributions/Tfu"/>
	<updated>2026-05-25T01:15:23Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Courseware:IT_Plus_Overview&amp;diff=79851</id>
		<title>Courseware:IT Plus Overview</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Courseware:IT_Plus_Overview&amp;diff=79851"/>
		<updated>2026-05-19T08:14:24Z</updated>

		<summary type="html">&lt;p&gt;Tfu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;innovaphone Plus&#039;&#039; is a series of courses, each covering advanced aspects of the configuration of innovaphone devices in separate topics.  Each topic can be worked through on individually or in any order.  Further topics will be added over time.  Each topic is based on the latest firmware at the time of creation.  All topics based on the same firmware version (e.g. 14r2) are included in the same course of the series.  &lt;br /&gt;
&lt;br /&gt;
Access to &#039;&#039;innovaphone Plus&#039;&#039; requires a valid innovaphone &#039;&#039;Plus&#039;&#039; corporate subscription. See [https://www.innovaphone.com/en/partner/training/innovaphone-plus-training.html innovaphone Plus Training] for details.&lt;br /&gt;
&lt;br /&gt;
The rest of this article gives you an overview of the topics covered and in which course they can be found. &lt;br /&gt;
__NOEDITSECTION__ &lt;br /&gt;
{{#invoke-url: https://class.innovaphone.com/moodle-debug/itplus-overview.php?wiki=true}}&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_Contact_Search_by_Connector_for_Microsoft365&amp;diff=79595</id>
		<title>Howto16r1:Configure Contact Search by Connector for Microsoft365</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_Contact_Search_by_Connector_for_Microsoft365&amp;diff=79595"/>
		<updated>2026-04-24T15:34:07Z</updated>

		<summary type="html">&lt;p&gt;Tfu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Applies To==&lt;br /&gt;
This information applies to&lt;br /&gt;
Connector for Microsoft 365 from version 16r1&lt;br /&gt;
&lt;br /&gt;
==More Information==&lt;br /&gt;
&lt;br /&gt;
This article outlines a configuration scheme for Connector for Microsoft365 functionality.&amp;lt;br&amp;gt;&lt;br /&gt;
In preparation, you first will need to configure one Application in your Azure Portal. &amp;lt;br&amp;gt;&lt;br /&gt;
After that, you will install the App in your Application Platform, and configure everything.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===System Requirements===&lt;br /&gt;
&lt;br /&gt;
* Licenses &#039;&#039;&#039;innovaphone Connector for Microsoft 365&#039;&#039;&#039; per user who wants to use the innovaphone myApps Connector for Microsoft 365.&lt;br /&gt;
* &#039;&#039;&#039;account in Azure Portal of Microsoft&#039;&#039;&#039; (for each of the technical communication users, no permission role needed)&amp;lt;br&amp;gt;&lt;br /&gt;
* Must have access from the internet to your App Platform&lt;br /&gt;
** This can be done by using a reverse proxy or other firewall&lt;br /&gt;
* The public endpoint &#039;&#039;&#039;must have &#039;&#039;&#039; a &#039;&#039;&#039;valid, public signed certificate&#039;&#039;&#039; (in order to make a trusted SSL connection from the Azure cloud to the Application Platform possible)&lt;br /&gt;
** A valid certificate is required in all involved network entities - at least in the App Platform and if used in the Reverse Proxy; to ensure transmission of MS365 HTTPS POST requests to the app service in order to send notifications.&lt;br /&gt;
* Admin account for Azure Portal (only necessary for granting needed permission for registered app during setup)&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
===Configuration in Azure Portal===&lt;br /&gt;
&lt;br /&gt;
====Create an App to search for contacts====&lt;br /&gt;
* &#039;&#039;&#039;In the Azure Portal of Microsoft you have to add an app registration&#039;&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;You only have to give a name for the app&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:App_Registration_Connector_for_Microsoft365.png|thumb|none|600px|App Registration|app_registration_connector_for_microsoft365.png/]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Switch to Certificates &amp;amp; Secrets on the left&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;You only have to configure a client secret and save the value for the configuration of the app&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:Authentication_Connector_for_Microsoft365_Calendar.png|thumb|none|600px|authentication_connector_for_microsoft365_calendar.png/]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Switch to api permissions on the left&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;You have to configure application permission (Contacts.Read) and (User.Read.All) as shown in the picture&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Grant access to the api permissions, if not possible you have to ask an admin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:Azure_Select_Api-Permission.png|thumb|none|600px|azure_select_api-permission.png/]]&lt;br /&gt;
[[Image:Azure_Select_Api-Permission_Application.png|thumb|none|600px|azure_select_api-permission_application.png/]]&lt;br /&gt;
[[Image:APIPermission Connector for Microsoft365 ContactSearch.png|thumb|none|600px|APIPermission Connector for Microsoft365 ContactSearch/]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installing and configuring App Platform and PBX===&lt;br /&gt;
====Installing the connector app====&lt;br /&gt;
* First you need to install the connector app from the App Store:&lt;br /&gt;
[[Image:Microsoft365_install_app_1.png|thumb|none|600px|microsoft365_install_app_1.png/]]&lt;br /&gt;
* Install the app by selecting&lt;br /&gt;
# All apps&lt;br /&gt;
# innovaphone AG&lt;br /&gt;
# innovaphone myApps Connector for Microsoft 365&lt;br /&gt;
# select the current Version &lt;br /&gt;
# Click install&lt;br /&gt;
[[Image:Microsoft365_install_app_2.png|thumb|none|600px|microsoft365_install_app_2.png/]]&lt;br /&gt;
====Creating an instance for the connector app====&lt;br /&gt;
* For creating an Instance, in the AP Manager you need to &lt;br /&gt;
# select &#039;&#039;&#039;innovaphone myApps Connector for Microsoft 365&#039;&#039;&#039;&lt;br /&gt;
# click &#039;&#039;&#039;add&#039;&#039;&#039;&lt;br /&gt;
[[Image:Microsoft365_create_instance_1.png|thumb|none|600px|microsoft365_create_instance_1.png/]]&lt;br /&gt;
* Insert the following information and save&lt;br /&gt;
# The technical Instance Name (we suggest microsoft365)&lt;br /&gt;
# Your Domain (This should be the domain you have already configured in your PBX and your Application Platform)&lt;br /&gt;
# define a password for the communication between the PBX and the app instance&lt;br /&gt;
# define a password for the communication between the app instance and the database&lt;br /&gt;
&#039;&#039;All other fields should be filled automatically&#039;&#039;&lt;br /&gt;
[[Image:Microsoft365_create_instance_2.png|thumb|none|600px|microsoft365_create_instance_2.png/]]&lt;br /&gt;
&lt;br /&gt;
====Creating the PBX app object using the PBX Manager Plugin====&lt;br /&gt;
* Open the PBX Manager and &lt;br /&gt;
# select the &#039;&#039;&#039;AP &amp;lt;code&amp;gt;InstanceName&amp;lt;/code&amp;gt;&#039;&#039;&#039; Tile&lt;br /&gt;
# Click &#039;&#039;&#039;Add an app&#039;&#039;&#039;&lt;br /&gt;
# Click &#039;&#039;&#039;Microsoft365 App&#039;&#039;&#039;&lt;br /&gt;
[[Image:Microsoft365_pbx_manager_1.png|thumb|none|600px|microsoft365_pbx_manager_1.png/]]&lt;br /&gt;
* Specify the &#039;&#039;&#039;Name&#039;&#039;&#039; and the &#039;&#039;&#039;SIP&#039;&#039;&#039; (We suggest using &#039;&#039;&#039;&amp;lt;code&amp;gt;microsoft365&amp;lt;/code&amp;gt;&#039;&#039;&#039; for this technical names)&lt;br /&gt;
[[Image:Microsoft365_pbx_manager_2.png|thumb|none|600px|microsoft365_pbx_manager_2.png/]]&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Important:&#039;&#039;&#039; Please also add the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; to a suitable Config-Template: Every user who should be able to search via the Connector for Microsoft 365 has to have access to the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Creating the API object using the PBX Manager Plugin====&lt;br /&gt;
* Open the PBX Manager and &lt;br /&gt;
# select the &#039;&#039;&#039;AP &amp;lt;code&amp;gt;InstanceName&amp;lt;/code&amp;gt;&#039;&#039;&#039; Tile&lt;br /&gt;
# Click &#039;&#039;&#039;Add an app&#039;&#039;&#039;&lt;br /&gt;
# Click &#039;&#039;&#039;Microsoft365 API&#039;&#039;&#039;&lt;br /&gt;
[[Image:Microsoft365_pbx_manager_1.png|thumb|none|600px|microsoft365_pbx_manager_1.png/]]&lt;br /&gt;
* The &#039;&#039;&#039;Name&#039;&#039;&#039; and &#039;&#039;&#039;SIP&#039;&#039;&#039; has to be &#039;&#039;&#039;&amp;lt;code&amp;gt;microsoft365-api&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
[[Image:Microsoft_365_Settings_API.png|thumb|none|600px|microsoft_365_Settings_API.png/]]&lt;br /&gt;
&lt;br /&gt;
====Add the admin app to a user or a template====&lt;br /&gt;
To be able to configure the connector app, you need users to have access to the admin app.&amp;lt;br&amp;gt;&lt;br /&gt;
You can achieve this by adding the app to a user, or to a template. &amp;lt;br&amp;gt;&lt;br /&gt;
In this Howto - as an example - we will add the app to the &amp;lt;code&amp;gt;Config Admin&amp;lt;/code&amp;gt; template. &amp;lt;br&amp;gt;&lt;br /&gt;
* In the PBX Manager &lt;br /&gt;
# select the &amp;lt;code&amp;gt;Templates&amp;lt;/code&amp;gt; tile &lt;br /&gt;
# click on the &amp;lt;code&amp;gt;Config Admin&amp;lt;/code&amp;gt; template&lt;br /&gt;
[[Image:Microsoft365_template_1.png|thumb|none|600px|microsoft365_template_1.png/]]&lt;br /&gt;
* In the &amp;lt;code&amp;gt;Config Admin&amp;lt;/code&amp;gt; template&lt;br /&gt;
# open Apps&lt;br /&gt;
# Check the &amp;lt;code&amp;gt;app name&amp;lt;/code&amp;gt; checkbox&lt;br /&gt;
# Save the changes&lt;br /&gt;
[[Image:Microsoft365_template_2.png|thumb|none|600px|microsoft365_template_2.png/]]&lt;br /&gt;
&lt;br /&gt;
====Configure the connector with the admin app====&lt;br /&gt;
Now your admins (designated groups or configured user) should have access to the connector admin app. &amp;lt;br&amp;gt;&lt;br /&gt;
* A user with access to the app can now see a new tile in the &#039;&#039;&#039;All Apps&#039;&#039;&#039; area&lt;br /&gt;
* The name depends on the configured &amp;lt;code&amp;gt;app name&amp;lt;/code&amp;gt; from the PBX Manager plugin&lt;br /&gt;
[[Image:Microsoft365_admin_app_1.png|thumb|none|600px|microsoft365_admin_app_1.png/]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Configuration of the Contact Search=====&lt;br /&gt;
* For the contact search you select &#039;&#039;&#039;Configuration for Contact Search&#039;&#039;&#039; in the admin app&lt;br /&gt;
# &#039;&#039;&#039;ClientIDContactSearch&#039;&#039;&#039; - Please insert the Application ID (Client ID) from Azure Portal from the in preparation created Contact Search app&lt;br /&gt;
# &#039;&#039;&#039;TenantContactSearch&#039;&#039;&#039; - Please insert the Directory ID (Tenant) from Azure Portal from the in preparation created Contact Search app&lt;br /&gt;
# &#039;&#039;&#039;ClientSecretContactSearch&#039;&#039;&#039; - Please insert the shared secret from the in preparation created Contact Search app&lt;br /&gt;
# &#039;&#039;&#039;NotificationURL&#039;&#039;&#039; - You need to specify the address Microsoft can send presence updates to&lt;br /&gt;
## You need to make sure that you define a URL where you can reach your App Platform from the public internet &amp;lt;code&amp;gt;public.dns&amp;lt;/code&amp;gt;&lt;br /&gt;
## Next you need the domain you have configured in the app instance before (3.2.2) &amp;lt;code&amp;gt;your.domain&amp;lt;/code&amp;gt;&lt;br /&gt;
## Next you need the name of the instance you have configured before (3.2.2) &amp;lt;code&amp;gt;microsoft365&amp;lt;/code&amp;gt;&lt;br /&gt;
## The URL will always be terminated by &amp;lt;code&amp;gt;subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
##* &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
[[Reference16r1:Concept App Service Connector for Microsoft 365|Concept App Service Connector for Microsoft 365]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure User Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure Calendar Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=79594</id>
		<title>Reference16r1:Concept App Service Connector for Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=79594"/>
		<updated>2026-04-24T15:33:52Z</updated>

		<summary type="html">&lt;p&gt;Tfu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept|Apps]]&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* Connector for Microsoft 365 from Version 16r1&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Connector for Microsoft 365 synchronizes Microsoft Teams presences with the innovaphone PBX and back, and optionally additionally Calendar presence from Exchange Online (part of the Microsoft 365 Cloud Services).&lt;br /&gt;
It is also possible to search for your own contacts. &lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX&lt;br /&gt;
* innovaphone Application Platform (minimum version 120004)&lt;br /&gt;
* V16r1&lt;br /&gt;
* App(Connector for Microsoft 365)&lt;br /&gt;
* PBX-App(innovaphone-microsoft365) license per user - order no. 02-00050-009&lt;br /&gt;
&lt;br /&gt;
== Concept ==&lt;br /&gt;
&lt;br /&gt;
=== User Presence ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure User Presence Sync by Connector for Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
If the Connector for Microsoft 365 app is fully configured, the app connects to Microsoft to obtain a token. With the token, the app gets the teams users (with a Teams license) through the Microsoft Graph API.&lt;br /&gt;
A presence subscription to Microsoft is started with the licensed users of the PBX to get presence changes in Microsoft Teams for these users. A user subscription is also started to get changes of the users (adding, deleting or update). If a user has changed, the Teams users are retrieved again. If the presence has changed, it is forwarded to the PBX. The presences of Teams are mapped to the presences of the PBX.&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Presence subscriptions are renewed every 10 minutes.&lt;br /&gt;
* License Check is made periodically.&lt;br /&gt;
&lt;br /&gt;
The app synchronises the PBX presence with Teams through the Graph Api. The on-the-phone presence will be renewed every 5 minutes. The other presences have a lifetime of 1 day but the away has a lifetime of 7 days.&lt;br /&gt;
The lifetimes are described [https://learn.microsoft.com/en-us/graph/api/presence-setuserpreferredpresence?view=graph-rest-1.0&amp;amp;tabs=http here]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please be aware:&#039;&#039;&#039; The actual change of presence or line state will be live, the above-mentioned subscriptions are needed to register against the Microsoft API for changes. &lt;br /&gt;
After successful subscription Microsoft will trigger the Connector for Microsoft 365 App every time a presence or line state for a user has changed.&lt;br /&gt;
The subscription will then be renewed in the above-mentioned time interval to receive further live updates.&lt;br /&gt;
&lt;br /&gt;
===== User Matching =====&lt;br /&gt;
You now can choose the fields used for user matching on either side from the following options:&lt;br /&gt;
* PBX&lt;br /&gt;
** CN (Long Name property from the PBX user object)&lt;br /&gt;
** h323 (Name property from the PBX user object)&lt;br /&gt;
* Azure Portal&lt;br /&gt;
** displayName&lt;br /&gt;
** mail&lt;br /&gt;
** mailNickname&lt;br /&gt;
** onPremisesDistinguishedName&lt;br /&gt;
** onPremisesSamAccountName&lt;br /&gt;
** onPremisesUserPrincipalName&lt;br /&gt;
** userPrincipalName&lt;br /&gt;
&lt;br /&gt;
Additionally, you have the possibility to remove a possibly contained domain from the Azure fields content. &amp;lt;br&amp;gt;&lt;br /&gt;
Example: &#039;user@domain.tld&#039; is transformed to &#039;user&#039;, if this option is checked.&lt;br /&gt;
&lt;br /&gt;
===== Mapping Table =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Teams Presence&lt;br /&gt;
! PBX Presence&lt;br /&gt;
|-&lt;br /&gt;
| Away&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| BeRightBack&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| Busy&lt;br /&gt;
| busy&lt;br /&gt;
|-&lt;br /&gt;
| DoNotDisturb&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| InACall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAMeeting&lt;br /&gt;
| meeting&lt;br /&gt;
|-&lt;br /&gt;
| Inactive&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| PresenceUnknown&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Available&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offline&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offwork&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| OutOfOffice&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| UrgentInterruptionsOnly&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| Presenting&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAConferenceCall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value &amp;quot;online&amp;quot; unsets the Teams presence in the PBX.&lt;br /&gt;
&lt;br /&gt;
===== Master/Slave =====&lt;br /&gt;
&lt;br /&gt;
For Master/Slave combination the &amp;quot;Connector for Microsoft 365&amp;quot; App has to be added to the slave (if no full replication is on). The slave websocket connection is needed to display &amp;quot;on-the-phone&amp;quot; presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Calendar Presence ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure_Calendar_Presence_Sync_by_Connector_for_Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
Introduced in 15r1 the Connector for Microsoft 365 will offer a possibility to sync Azure Portal calendar events (Teams, Exchange online) via the Graph API with the PBX presence.&amp;lt;br&amp;gt;&lt;br /&gt;
For now the [https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Calendar Calendar App] is (along with other functions) also capable of syncing calendar events, but using the old EWS mechanism, which Microsoft announced as end of life starting from 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; Please make sure to not use both apps for syncing calendar events in parallel, this is not supported and will most likely lead to conflicts and unexpected behaviours.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When the configuration of the connector for Microsoft 365 Calendar Presence Sync is complete, the app connects to Microsoft to receive a token with the calendar app registered in the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
With the token, the app can pick up the users from the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
These are matched against the users in the PBX, based on the configured &amp;quot;User Assignment&amp;quot; settings.&amp;lt;br&amp;gt;&lt;br /&gt;
For each matched user with a valid Connector for Microsoft 365 licence applied, a subscription for calendar events is created at Microsoft to receive event changes in Microsoft Calendar for these users.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user subscription is also started to receive user changes (add, delete or update).&amp;lt;br&amp;gt;&lt;br /&gt;
If a user has changed, the users are retrieved again. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a calendar event has been started or ended, it is forwarded to the PBX.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Event subscriptions are renewed every day.&lt;br /&gt;
* License Check is made every hour.&lt;br /&gt;
&lt;br /&gt;
=== Contact Search ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto16r1:Configure Calendar Presence Sync by Connector for Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
Introduced in 16r1 the Connector for Microsoft 365 will offer a possibility to search for your own contacts (Teams, Exchange online) via the Graph API.&lt;br /&gt;
&lt;br /&gt;
When the configuration of the connector for Microsoft 365 Contact Search is complete, the app connects to Microsoft to receive a token with the contact search app registered in the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
With the token, the app can pick up the users from the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
These are matched against the users in the PBX, based on the configured &amp;quot;User Assignment&amp;quot; settings.&amp;lt;br&amp;gt;&lt;br /&gt;
For each matched user with a valid Connector for Microsoft 365 licence applied, the user can search with the Phone App, for example (a myApps search provider will be provided for all apps looking using search providers looking up contacts). The search string is made available to the Connector for Microsoft 365 via the microsoft365-api. The results are sent to the consumer, e.g. the Phone App and presented there.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user subscription is started to receive user changes (add, delete or update).&amp;lt;br&amp;gt;&lt;br /&gt;
If a user has changed, the users are retrieved again. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* License Check is made every hour.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be aware:&#039;&#039;&#039; Since the Connector for Microsoft 365 is an app in the Scope of myApps App Platform, IP Phones and other services not using Apps cannot benefit from this search service.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
&lt;br /&gt;
=Known Limitation=&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&#039;&#039;Applies to the User Presence and the Calendar Presence&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Synchronization Delay ===&lt;br /&gt;
In the official Graph-API documentation, Microsoft is providing an overview about expected latencies for change notifications.&amp;lt;br&amp;gt;&lt;br /&gt;
You can find a whole overview table here:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/change-notifications-overview#latency&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For the user presences the resource &amp;quot;presence&amp;quot; is used and an average latency of 10 seconds but a maximum up to 1 minute is provided.&amp;lt;br&amp;gt;&lt;br /&gt;
Such a delay in syncing changed presences from Teams down to the PBX are considered normal and are caused by the Microsoft Graph-API.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In case of calendar events the average is provided as &amp;quot;less than 1 minute&amp;quot; and the maximum to 3 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Presence ==&lt;br /&gt;
=== Line states set by the PBX does not block calls in Teams ===&lt;br /&gt;
Line states set by a 3rd party application (like the Connector for Microsoft 365) through the graph API are currently &#039;&#039;&#039;only for display purpose and do not block new calls&#039;&#039;&#039; in Teams.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://techcommunity.microsoft.com/t5/teams-developer/ms-graph-setpresence-problems/m-p/2798805/highlight/true#M3957&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the above linked discussion, there once existed a feature request on Microsoft Voice, which is no longer available since it was not voted.&lt;br /&gt;
=== Maximum number of supported users ===&lt;br /&gt;
The connector now supports multiple Microsoft Teams communication users, which is the prerequisite to subscribe for more than 650 users. There is a new ribbon (Manage Teams Accounts) that allows you to configure as many communication users as you need. Every configured communication user can be used to subscribe 650 users, for example:&lt;br /&gt;
&lt;br /&gt;
*3 configured communication users x 650 licensed users = 1950 users can be subscribed&lt;br /&gt;
&#039;&#039;&#039;Please be aware&#039;&#039;&#039;: Each communication user must have a Teams license applied.&lt;br /&gt;
&lt;br /&gt;
This limitation is caused by Microsoft.&amp;lt;br&amp;gt;&lt;br /&gt;
In the documentation of the Graph-API you will find a hint to this limitation:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/changenotifications-for-presence#subscribe-to-multiple-users-presence&amp;lt;br&amp;gt;&lt;br /&gt;
Trying to subscribe more than 650 users (with one communication user) by using the presence subscription API will be declined by the graph API with an error message, that too many users are requested.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Communication User (UserSynctoPbx) ===&lt;br /&gt;
Users with MFA (multi-factor-authentication) are not supported as technical communication user for the Connector.&lt;br /&gt;
&lt;br /&gt;
=== Multiple sites / instances require multiple communication users ===&lt;br /&gt;
Each instance or each site must have separate communication users, as Microsoft only allows one concurrent subscription per communication user. (otherwise an HTTP 409 conflict will occur)&lt;br /&gt;
&lt;br /&gt;
This means that if you want to subscribe to the same Azure Portal backend from two different sites (or instances), you will need to have multiple communication users (each with an applied Teams licence) in order to be able to subscribe from all endpoints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Subscription Timeout ===&lt;br /&gt;
&lt;br /&gt;
==== Situation ====&lt;br /&gt;
Due to a current limitation in the Graph API it is not possible to cancel or delete an active presence subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the [https://learn.microsoft.com/en-us/graph/api/subscription-delete?view=graph-rest-1.0&amp;amp;tabs=http|documentation of the current Graph API (1.0)] the “Delete subscription” chapter does not include presence subscriptions.&amp;lt;br&amp;gt;&lt;br /&gt;
It is also not possible to have multiple subscription in parallel. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make sure to only request a new presence subscription when the old one is not valid anymore, the app will store the state of the presence subscription and the time until it is valid in the database.&amp;lt;br&amp;gt;&lt;br /&gt;
As mentioned in the chapter “Technical Overview” we are creating presence subscriptions with a validity of 10 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
The presence subscription will be renewed as soon as it is no longer valid which will be 10 minutes after initial subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Impact ====&lt;br /&gt;
If settings are changed or the app instance is restarted it will check the corresponding database entry on startup.&amp;lt;br&amp;gt;&lt;br /&gt;
In case the last presence subscription was completed less than 10 minutes ago, there is still an active presence subscription and the app has to wait for it to become invalid. &amp;lt;br&amp;gt;&lt;br /&gt;
Some Changes (e.g., to the “Notification-URL”) will only take effect after a new created subscription. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The current Beta Version of the Graph API is already providing a function to delete presence subscriptions, so we hope we can improve this behavior in the future.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
===Creating an app trace===&lt;br /&gt;
For further analysis and creating a support ticket it will be useful to have a suitable app trace. &amp;lt;br&amp;gt;&lt;br /&gt;
Before creating the trace please make sure the following trace flags are activated for the app instance:&lt;br /&gt;
* App&lt;br /&gt;
* Database&lt;br /&gt;
* HTTP client&lt;br /&gt;
* TLS&lt;br /&gt;
* TCP&lt;br /&gt;
* App WebSocket&lt;br /&gt;
* Config&lt;br /&gt;
* Webserver&lt;br /&gt;
&lt;br /&gt;
After setting the config flags, please make sure to&lt;br /&gt;
* stop the instance&lt;br /&gt;
* deleting the current instance log&lt;br /&gt;
* start the instance&lt;br /&gt;
&#039;&#039;&#039;Now please wait at least 5 Minutes before you save the log&#039;&#039;&#039;, otherwise we could not have the whole picture in the trace.&lt;br /&gt;
&lt;br /&gt;
The restart and deletion of the the old log is useful the see the complete initialization process right away.&lt;br /&gt;
&lt;br /&gt;
===SSL Certificate for notification URL===&lt;br /&gt;
It also is useful to make sure the notification URL has a valid and public signed certificate.&amp;lt;br&amp;gt;&lt;br /&gt;
You can do that, using an SSL-Checker, for example: https://www.sslshopper.com/ssl-checker.html &amp;lt;br&amp;gt;&lt;br /&gt;
Without a valid, public signed certificate, Microsoft will decline the connection since it will not be possible to establish a trust relationship for the SSL/TLS secure channel.&lt;br /&gt;
&lt;br /&gt;
===Correctness of notification URL===&lt;br /&gt;
You can try to open the notification URL in your Browser&amp;lt;br&amp;gt;&lt;br /&gt;
Most likely you will see a HTTP 404 (Not Found) error message, which is the expected behavior since we are not providing an HTML website, the HTTP GET request from the browser will not be answered with content.&amp;lt;br&amp;gt;&lt;br /&gt;
This is perfectly fine since Microsoft will send presence updates with HTTP POST and will not try to request content from our app.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
What you can find out by trying to open the URL in your browser are the two following things: &amp;lt;br&amp;gt;&lt;br /&gt;
* If you receive a HTTP 404 error message you are most likely connected to an App Platform, if not you need to check your DNS (and maybe also reverse proxy) settings.&lt;br /&gt;
* If the URL is modified and the used build number is added, an app has answered your request&lt;br /&gt;
** Example: &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/subscriptions&amp;lt;/code&amp;gt; is modified to &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/&amp;lt;b&amp;gt;1510411&amp;lt;/b&amp;gt;/subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
** If this is not the case, your URL is wrong. (Be aware: The URL depends on the settings of the web server path of your app instance)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be aware:&#039;&#039;&#039; The URL-Recognition in the Application Platform is &#039;&#039;&#039;case sensitive&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Activation of &amp;quot;Public client flow&amp;quot; for the registered app in Azure Portal===&lt;br /&gt;
If the subscription is not working at all, please make sure &amp;quot;Public client flow&amp;quot; is activated for the registered app in the Azure portal (as described in our [[Howto16r1:Configure User Presence Sync by Connector for Microsoft365#Create_an_App_for_syncing_Teams_to_PBX|HowTo article]]).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The App Service trace will contain the following message if this is not the case:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;AADSTS7000218: The request body must contain the following parameter: &#039;client_assertion&#039; or &#039;client_secret&#039;.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Presence == &lt;br /&gt;
===GUI Feedback===&lt;br /&gt;
The app itself shows required states with green and red as connections to the Master PBX, Authentication and Presence Subscription to identify if there are problems. &amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes it needs a little bit time until the states are changed. &amp;lt;br&amp;gt;&lt;br /&gt;
If the states remain, it is mandatory to enable logs on the app platform and check for more information. &amp;lt;br&amp;gt;&lt;br /&gt;
([[Howto13r3:Configure Connector for Microsoft365#Creating an app trace|Concept App Service Connector for Microsoft 365: Creating an app trace]])&lt;br /&gt;
&lt;br /&gt;
====No connection to Master PBX====&lt;br /&gt;
Check the MasterPBX name.&amp;lt;br&amp;gt;&lt;br /&gt;
The field must only contain the name [&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;pbx&amp;lt;/span&amp;gt;], &#039;&#039;&#039;not the full domain&#039;&#039;&#039; [&amp;lt;span style=&amp;quot;color:red;text-decoration: line-through;&amp;quot;&amp;gt;pbx.domain.tld&amp;lt;/span&amp;gt;]. ([[Howto13r3:Configure Connector for Microsoft365#Synchronization from Teams to the PBX|Synchronization from Teams to the PBX - Master PBX field]])&lt;br /&gt;
&lt;br /&gt;
====Presence subscription failed====&lt;br /&gt;
There are many reasons why the &amp;quot;Presence subscription failed&amp;quot; message could be displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
We try to list the most common reasons:&lt;br /&gt;
* The permission for the registered app in the Azure portal are not correctly set ([[Howto13r3:Configure Connector for Microsoft365#Create an App for syncing Teams to PBX|Howto: Create an App for syncing Teams to PBX]])&lt;br /&gt;
* The Notification URL is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The App service is not reachable from the internet ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The certificate for the public endpoint (e.g. reverse proxy) is not valid, or not publicly signed ([[Reference13r3:Concept App Service Connector for Microsoft 365#SSL Certificate for notification URL|Concept App Service Connector for Microsoft 365: SSL Certificate for notification URL]])&lt;br /&gt;
* The user from PBX and the Azure Portal cannot be matched ([[Reference13r3:Concept App Service Connector for Microsoft 365#User Matching|Concept App Service Connector for Microsoft 365: User Matching]])&lt;br /&gt;
* The App Platforms clock time is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#App Platform clock time is wrong|Concept App Service Connector for Microsoft 365: App Platform clock time is wrong]])&lt;br /&gt;
* No user has a valid Connector for Microsoft 365 App license ([[Reference13r3:Concept App Service Connector for Microsoft 365#Requirements|Concept App Service Connector for Microsoft 365: Requirements]])&lt;br /&gt;
&lt;br /&gt;
===Teams License for communication user===&lt;br /&gt;
If presence subscription does not work, please check if all of the configured communication users have a Microsoft Teams license applied and no multifactor authentication is in use for this particular user. &amp;lt;br&amp;gt;&lt;br /&gt;
Also please make sure you can login with the configured credentials. (If you have set a password as an Administration, the user needs to change the password during the first login, therefore the given password will be invalid for API access).&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Sometimes, after changing setting or after the instance has restarted it can take up to 12 minutes until the presence subscription is working correctly. (Due to the subscription timeout)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
== Special Characters In Password ==&lt;br /&gt;
If you are using special characters (*, &amp;amp;, (, ), etc.) in your password you could run into a problem with the authentication of the communication user.&amp;lt;br&amp;gt;&lt;br /&gt;
The authentication failed status is being displayed. &amp;lt;br&amp;gt;&lt;br /&gt;
For the moment the only workaround is to eliminate special characters from your password.&lt;br /&gt;
&lt;br /&gt;
==App Platform clock time is wrong==&lt;br /&gt;
If the clock time at the App Platform is not correct, this will lead to an unstable behaviour of the Connector for Microsoft 365.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the Connector for Microsoft 365 is using the Microsoft Graph APIs presence subscription function, it needs to provide in its request a precise time until the subscription validity will be expired.&amp;lt;br&amp;gt;&lt;br /&gt;
The app service is handling subscription and will automatically recreate a new subscription each time the previous one has expired.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A wrong clock time will lead to false expiration times and thus&lt;br /&gt;
*  the subscription will be expired earlier than expected (synchronisation is not working because there is no valid subscription)&lt;br /&gt;
*  the subscription will be valid longer than expected (the app service is trying to create a new subscription because it is expecting the previous one to be expired - will lead to a 409 conflict error, because only one subscription can be valid at a time)&lt;br /&gt;
&lt;br /&gt;
If you are not sure about the current time of the App Platform, you can login via SSH into the App Platform and execute the &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; command to check the current time.&amp;lt;br&amp;gt;&lt;br /&gt;
You will receive an output like: &lt;br /&gt;
 Tue Mar 12 13:38:57 UTC 2024&lt;br /&gt;
Please be aware: The time is displayed in UTC, so please make sure to convert to your local time zone.&lt;br /&gt;
&lt;br /&gt;
==Geoblocking==&lt;br /&gt;
Since there might be no reliable country assignment for Microsoft addresses, all Microsoft addresses must be enabled on the upstream firewall in the event of geoblocking in order to ensure functionality of the Office365 Connector.&amp;lt;br&amp;gt;&lt;br /&gt;
As an alternative you might be able to configure your firewall to bypass the geoblocking for the configured notification URL.&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
[[Howto16r1:Configure User Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure Calendar Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure Contact Search by Connector for Microsoft365]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_myApps_platform_services&amp;diff=79526</id>
		<title>Reference16r1:Concept myApps platform services</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_myApps_platform_services&amp;diff=79526"/>
		<updated>2026-04-21T09:12:06Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Device handling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|myApps]]&lt;br /&gt;
&lt;br /&gt;
myApps platform services provide various operating system specific services which can be used by other &#039;&#039;Apps&#039;&#039; running in the [[{{NAMESPACE}}:Concept myApps|myApps client]]. Those services typically are not available in the browser&#039;s JavaScript environment and hence must be implemented in native platform code. Therefore, the platform services are installed as native executable on the respective platform.&lt;br /&gt;
&lt;br /&gt;
When myApps is started in a web browser (and hence has no access to the platform services), some Apps will use [https://en.wikipedia.org/wiki/WebRTC WebRTC] services implemented by the browser instead.  For ease of reference, features available in this scenario are also described here.&lt;br /&gt;
&lt;br /&gt;
On windows, the platform services also come with their own web browser in which the myApps web App will be started then.  This browser is based on google&#039;s [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium] open source software.&lt;br /&gt;
= Applies To =&lt;br /&gt;
&lt;br /&gt;
* [[{{NAMESPACE}}:Concept myApps|myApps]]&lt;br /&gt;
* myApps for Windows&lt;br /&gt;
* myApps for macOS&lt;br /&gt;
* myApps for iOS&lt;br /&gt;
* myApps for Android&lt;br /&gt;
* myApps Web App (WebRTC)&lt;br /&gt;
* myApps for IP270&lt;br /&gt;
version 16r1&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
Not all features are available or required on all platforms.&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Feature&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
| || || Windows || iOS || Android || macOS || Browser&amp;lt;ref&amp;gt;This refers to the myApps web application running in a browser with no platform services available&amp;lt;/ref&amp;gt;&lt;br /&gt;
|IP270&lt;br /&gt;
|-&lt;br /&gt;
| [[#Device handling|Audio Devices]]|| manage local audio devices to record and playback audio conversations || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (audio available but devices managed by web browser) || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Video || manage local displays and cameras to capture and render video live stream || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (video available but devices managed by web browser) || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Ringer || manage local ringing device || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Application sharing|Application sharing]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; presenter || share an application || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; consumer  || view an application shared by the peer || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Hot keys|Hot keys]]|| capture key presses for quick invocation of phone apps (e.g. dial selected number) || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#URL Handler|tel: and sip: URI handler]]|| intercept clicks on tel: and sip: links in web sites to invoke phone apps || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#User activity|User activity]]|| set presence state according to user activity ||  &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;limited, see [[#User activity|User activity]] below&amp;lt;/ref&amp;gt; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Docking || myApps can be docked persistently to the right or left edge of your screens ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| Multi-windowing || Apps can be launched in separate windows||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Recording|Recording]]|| Calls can be recorded to recording app||  &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Notifications|Notifications]]|| ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; display notifications || display notifications with OS standard mechanism ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; push notifications || receive push notifications while myApps is not running  ||  &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The browser needs to be running in order to receive push notifications.&amp;lt;/ref&amp;gt; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; chat and apps || display notifications for chat and other apps  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; calls || display notifications for incoming calls  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&amp;lt;ref&amp;gt;Call notifications are only displayed locally while the phone or softphone app is started.&amp;lt;/ref&amp;gt; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Local phonebook access|Local phonebook]]|| access local phone book ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Microsoft Office Integration|Office presence provider]]|| maps PBX presence state to Microsoft office presence state ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Call an external application for calls|External application start]]|| start arbitrary external applications for calls || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#App Proxy|App Proxy]]|| a caching proxy that provides app persistence  || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Auto update|Auto update]]|| automatically updates myApps platform services to the same version the PBX has || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The then-current web app is always loaded from the PBX upon startup and hence up-to-date by definition&amp;lt;/ref&amp;gt; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Three party conference || initiate 3-pty-conference using Softphone-App || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Exclude VPN || disable use of VPN connections for audio and appsharing || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| Screen lock || myApps screen lock against unauthorised use || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
* innovaphone PBX 16r1 and up&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Recommended hardware requirements&lt;br /&gt;
* Processor: Dual-core 2Ghz or higher&lt;br /&gt;
* RAM: 4 Gb&lt;br /&gt;
&lt;br /&gt;
== myApps for Windows ==&lt;br /&gt;
* Windows 11 and up&lt;br /&gt;
* Windows Server 2016 and later versions&lt;br /&gt;
&lt;br /&gt;
=== 32 &amp;amp; 64 bit Windows ===&lt;br /&gt;
* 32 bit Windows: install the myAppsSetup32.msi from the App Store&lt;br /&gt;
* 64 bit Windows: install the myAppsSetup.msi from the App Store&lt;br /&gt;
** the 64 bit variant still installs into Program Files (x86), as the main myApps.exe is still a 32bit application&lt;br /&gt;
** the 64 bit variant just contains an additional 64 bit binary for the outlook search&lt;br /&gt;
&lt;br /&gt;
=== Windows N editions ===&lt;br /&gt;
&lt;br /&gt;
Windows N editions are missing the &#039;&#039;Media Feature Pack&#039;&#039; which is pre installed on other Windows versions.&lt;br /&gt;
&lt;br /&gt;
Please install the pack from [https://www.microsoft.com/en-us/software-download/mediafeaturepack Microsoft (Windows 10 pack)] before you install myApps. The installer will check if the file &amp;lt;code&amp;gt;C:\Windows\SysWOW64\mfplat.dll&amp;lt;/code&amp;gt; exist on your system.&lt;br /&gt;
&lt;br /&gt;
Make sure to install the correct pack depending on your Windows version! There are different packs for Windows 10 1703, 1803, 1809 and 32bit or 64bit etc.&lt;br /&gt;
&lt;br /&gt;
NB: Sometimes the myApps installation will not work even though the media pack is already installed. This is because the installer has no read access to check if the package is already installed. If the above-mentioned file exists and the installer asks to install the Windows Media Feature Pack nevertheless, you have to start the myApps install with administrative rights.&lt;br /&gt;
&lt;br /&gt;
=== Terminal Server environments ===&lt;br /&gt;
&lt;br /&gt;
Audio driver was removed if myApps discovers that it is running in a terminal server environment like Citrix.&lt;br /&gt;
&lt;br /&gt;
The audio driver is needed for the Softphone App but the Softphone App should not use an audio driver at the server side because the audio devices are plugged locally and there would be a delay sending and receiving audio data with the server.&lt;br /&gt;
&lt;br /&gt;
If a customer wants to use the Softphone App at the server side he needs to make use of the myApps Plugin for virtual desktops solution:&lt;br /&gt;
&lt;br /&gt;
[[{{NAMESPACE}}:MyApps_Plugin_for_Virtual_Desktops|Reference15r1:MyApps_Plugin_for_Virtual_Desktops]]&lt;br /&gt;
&lt;br /&gt;
== myApps for macOS ==&lt;br /&gt;
* macOS 13 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for iOS ==&lt;br /&gt;
* iOS 16 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for Android ==&lt;br /&gt;
* Android 13 or higher.&lt;br /&gt;
&lt;br /&gt;
== myApps for IP270 ==&lt;br /&gt;
Exclusively used in IP270.&lt;br /&gt;
&lt;br /&gt;
= Licenses =&lt;br /&gt;
* No license needed for myApps platform services&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
myApps platform services is a native executable that is installed using the standard mechanisms on the respective operating system. It provides various advanced services which can be used by the myApps web client code as well as the Apps running in the myApps context. &lt;br /&gt;
&lt;br /&gt;
Also, on Windows, the platform services come with their own, dedicated browser to run myApps in.  This browser is based on [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium].  On iOS, macOS and Android, it is based upon native embedded web view facilities (such as WKWebView) instead.&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
=== RTP service for audio and appsharing ===&lt;br /&gt;
The RTP service provides audio and appsharing as a video stream. VoIP RTP endpoints (e.g. for softphones).  It supports STUN, TURN, ICE, SRTP, DTLS. Note however that unlike WebRTC, these endpoints do not &#039;&#039;require&#039;&#039; ICE and DTLS. In other words, they can communicate also with non-compliant (i.e. older) VoIP devices.&lt;br /&gt;
&lt;br /&gt;
Note that the available capabilities when not running the myApps platform services depend on the used browser&#039;s WebRTC implementation. See your browser documentation for details.&lt;br /&gt;
&lt;br /&gt;
Apps can request RTP channels using the [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol]&#039;s &#039;&#039;AllocChannel&#039;&#039; message.&lt;br /&gt;
&lt;br /&gt;
==== RTP ports ====&lt;br /&gt;
{|&lt;br /&gt;
|  audio || 50000 -&amp;gt; 50099&lt;br /&gt;
|-&lt;br /&gt;
| video (app sharing) || 50100 -&amp;gt; 50199&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The RTP service will enumerate all local interfaces and create local HOST candidates for ICE.  There is an option however to disregard VPN interfaces (more precisely such interfaces with type of &#039;&#039;IF_TYPE_PPP&#039;&#039; or &#039;&#039;IF_TYPE_TUNNEL&#039;&#039;).  This can eliminate quality issues when RTP data is transmitted through TCP based VPN tunnels.&lt;br /&gt;
&lt;br /&gt;
SRFLX and RELAY candidates are obtained using the STUN and TURN server configuration passed by the App (e.g the &#039;&#039;softphone&#039;&#039; App) as part of the &#039;&#039;AllocChannel&#039;&#039; request.&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;AllocChannel&amp;quot;,&amp;quot;channel&amp;quot;:&amp;quot;81429cba-396d-43de-8a76-ec020ba8796e&amp;quot;,&amp;quot;iceServers&amp;quot;:[{&amp;quot;urls&amp;quot;:&amp;quot;turn:myturn.domaincom:4077?transport=udp&amp;quot;,&amp;quot;username&amp;quot;:&amp;quot;turnuser&amp;quot;,&amp;quot;credential&amp;quot;:&amp;quot;pwd&amp;quot;,&amp;quot;credentialType&amp;quot;:&amp;quot;password&amp;quot;},{&amp;quot;urls&amp;quot;:&amp;quot;stun:mystun.domain.com:4077&amp;quot;}],&amp;quot;dn&amp;quot;:&amp;quot;Foo Bar&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;RemoteRtp&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;video&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Codecs ====&lt;br /&gt;
The installed myApps launchers provide codecs that can be used by softphone apps for media streams. When running in a web browser the codecs depend on the browser version and operating system. See the documentation of your browser for details.&lt;br /&gt;
&lt;br /&gt;
The following codecs are supported:&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align:left;width:100px;&amp;quot;|Codec&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Windows-Launcher&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Android&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|iOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|macOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Firefox (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Chrome (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Edge (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Safari (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Opera (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|IP270&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;11&amp;quot;|Audio&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|G711A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G711u&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G722&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-NB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-WB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; |Video&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP8 VP8]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP9 VP9]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=H264 H264]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;11&amp;quot;|Application Sharing&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Share&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|Watch&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;* small presentation only&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;** only for 1:1 calls, not for conferences&lt;br /&gt;
&lt;br /&gt;
==== Video capture ====&lt;br /&gt;
The default resolution for video capture is 1920x1080 if available.  Otherwise, 1280x720, 640x480, 352x288 or 320x240 will be used.  The frame rate is 30 fps if available, otherwise 15 fps. The resulting average bandwidth could reach 1 Mbps.&lt;br /&gt;
&lt;br /&gt;
==== Application sharing ====&lt;br /&gt;
Screen content will be transmitted as video stream by the presenter&lt;br /&gt;
&lt;br /&gt;
==== Device handling ====&lt;br /&gt;
The RTP service enumerates microphones, loudspeaker, cameras and ringing devices and notifies apps when devices come and go. It is up to the apps using the devices to store preferences.&lt;br /&gt;
&lt;br /&gt;
The RTP service also enables some extended features (such as hook switch or volume control) for supported USB headsets or Bluetooth headsets connected to myApps.&lt;br /&gt;
The supported headset-SDKs determine which headset vendors are recommended to be used with the myApps softphone app. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this to work, the following vendor specific development kits are integrated in our myApps client. Be aware that the SDK are updated within our Service release :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SDK Vendor !! Supported OS !! SDK Version !! innovaphone Service Release&lt;br /&gt;
|-&lt;br /&gt;
| Jabra|| MacOS || 1.16.4.0 || 14r2sr11&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 1.16.4.0 || 15r1sr3&lt;br /&gt;
|-&lt;br /&gt;
| Epos &#039;&#039;(formerly Sennheiser)&#039;&#039; || MacOS || 12.4.0.5478 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || n.a. - [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|to be installed separately]]|| 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Poly &#039;&#039;(formerly Plantronics)&#039;&#039; || MacOS || 3.25.53799.37131 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.25.53800.37131 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Yealink || MacOS || 3.1.1.23 || 14r2sr1&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.1.1.23 || 14r2sr2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* It is possible to inhibit the start of the Sennheiser SDK (SenncomSDK.exe) using the &amp;lt;code&amp;gt;DISABLEHEADSETS&amp;lt;/code&amp;gt; directive of the installer (see [[#MSI Parameters and install options|  MSI parameters]]  below).&lt;br /&gt;
&lt;br /&gt;
* Starting with V13r3sr10, the Epos-SDK needs to be installed separately using the Epos Connect software to ensure full compatibility between current Epos headset models and native myApps-Windows client. For details [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|refer to this article]].&lt;br /&gt;
&amp;lt;!--Keywords: myapps softphone supported headsets sdk--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
myApps-IP270 supports use of [[Reference9:Concept USB Headset|USB devices known for innovpahone desk phones]].&lt;br /&gt;
&lt;br /&gt;
==== Ring tones ====&lt;br /&gt;
Ring tones can be played. Apps can choose the tone from a pre-defined list of ring tones.&lt;br /&gt;
&lt;br /&gt;
On Windows, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;ringtones&amp;lt;/code&amp;gt; sub-directory of myApps&#039; roaming directory (which usually is in &amp;lt;code&amp;gt;%appdata%\innovaphone\myApps\ringtones&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
On Android, custom ring tones can be added to the system via Android settings.&lt;br /&gt;
&lt;br /&gt;
On iOS, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;Ringtones&amp;lt;/code&amp;gt; subdirectory of the myApps file share that is available in iTunes if the iPhone has been connected via USB.&lt;br /&gt;
&lt;br /&gt;
On macOS, custom ring tones can be uploaded as .mp3 files to &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-macos/Data/Documents/Ringtones&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Debugging ====&lt;br /&gt;
For extended debugging, turn on the &#039;&#039;Audio&#039;&#039;, &#039;&#039;Media&#039;&#039; and &#039;&#039;AppSharing&#039;&#039; traces in myApps.&lt;br /&gt;
=== Hot keys ===&lt;br /&gt;
On Windows and macOS systems, myApps platform services can listen for hot keys and invoke certain functions. Invocation is done by sending API messages to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
The hot keys can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below. Any of the function keys F1 to F11 (optionally combined with up to two modifier keys &#039;&#039;alt&#039;&#039;, &#039;&#039;ctrl&#039;&#039;, &#039;&#039;shift&#039;&#039; or &#039;&#039;win&#039;&#039;) can be chosen for each function. If you do not want to start the call with &amp;quot;Hotkey+Enter&amp;quot; because you would have to wait for the focus, the hotkey can also be pressed twice and the number is dialled directly.&lt;br /&gt;
&lt;br /&gt;
; dial selected number : Initiates a call using the currently selected text as target.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;text&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;mt&amp;quot;:&amp;quot;PrepareCall&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;13&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; accept call : Accepts a currently alerting call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;ConnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;ConnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; reject/disconnect call : Rejects a currently alerting call or disconnects an active call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;DisconnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;DisconnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== URL Handler ===&lt;br /&gt;
&lt;br /&gt;
On Windows systems, two URI-handler are installed with the myApps platform services.  Windows will call up this URI handler when a user clicks on an appropriate link, for example in a web site.&lt;br /&gt;
&lt;br /&gt;
The handler will the send an API message to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
; tel URI : call a number, e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;num&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;num&amp;quot;:&amp;quot;4711&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; sip URI : call a SIP name, e.g. &amp;lt;code&amp;gt;sip:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; im URI : start chat with SIP name, e.g. &amp;lt;code&amp;gt;im:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;StartChat&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm &#039;&#039;com.innovaphone.chat&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.chat&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartChat&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On macOS systems myApps might be made the default application to handle tel URI e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt; via Apple FaceTime. Open the &amp;quot;FaceTime&amp;quot; menu &amp;quot;Settings...&amp;quot; and select myApps as &amp;quot;Default for phone calls&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On iOS &#039;&#039;tel&#039;&#039; URIs are always dialed via GSM. Therefore myApps iOS also reacts to URI schemes &#039;&#039;com.innovaphone.tel&#039;&#039;, &#039;&#039;com.innovaphone.sip&#039;&#039; and &#039;&#039;com.innovaphone.im&#039;&#039;, e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.tel:4711&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.sip:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.im:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== User activity ===&lt;br /&gt;
On Windows and macOS systems, the myApps platform services can monitor user keyboard/mouse activity and change the user&#039;s presence state after a certain amount of inactivity.  The timeout can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below.&lt;br /&gt;
&lt;br /&gt;
myApps will then send a [https://sdk.innovaphone.com/doc/appwebsocket/myApps.htm#SetUserActivity&#039;&#039;SetUserActivity&#039;&#039;] message to the PBX using the &#039;&#039;myApps&#039;&#039; protocol.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;SetUserActivity&amp;quot;,&amp;quot;inactive&amp;quot;:true}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will change the &#039;&#039;status&#039;&#039; property of the &#039;&#039;im:&#039;&#039; contact for the user&#039;s own presence and hence result in a presence update from the PBX to myApps&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;UpdateOwnPresence&amp;quot;,&amp;quot;presence&amp;quot;:[{...},{&amp;quot;contact&amp;quot;:&amp;quot;im:&amp;quot;,&amp;quot;activity&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;closed&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
The &#039;&#039;closed&#039;&#039; status is reflected in the grey status color when displaying a contact [[Image:myapps-inactive.png|myapps-inactive.png/|myapps-inactive.png/]].&lt;br /&gt;
&lt;br /&gt;
On iOS and Android, the state is set to &#039;&#039;inactive&#039;&#039; as soon as the App is brought to background.&lt;br /&gt;
When myApps platform services are not available (i.e. when running the web application in a browser solely) a limited user activity monitoring is available: the state is set to active when the web page is not used for more than 5 minutes.&lt;br /&gt;
&lt;br /&gt;
=== Recording ===&lt;br /&gt;
&lt;br /&gt;
The new launcher offers the possibility to record the audio of incoming and outgoing calls. In order to activate that functionality the URL of the recording instance must be configured in either the PBX (PBX-&amp;gt;myApps-&amp;gt;Config: Recording URL) or the softphone App (Settings-&amp;gt;Audio Recording (URL)) &lt;br /&gt;
&lt;br /&gt;
[[Image:PBX-Recording-Settings.png|pbx-recording-settings.png/|pbx-recording-settings.png/]] [[Image:Recording-Softphone-Settings.png|recording-softphone-settings.png/|recording-softphone-settings.png/]]. &lt;br /&gt;
&lt;br /&gt;
As long as that URL is configured the audio data of all calls are stored as pcap-files under that URL.&lt;br /&gt;
If the URL points to a CF device in the PBX, write access must be granted for that URL (PBX-&amp;gt;Services-&amp;gt;HTTP-&amp;gt;Server:Public compact flash access) and if the URL points to the recording app, the files can be accessed via the recording app [[{{NAMESPACE}}:Concept_App_Service_Recordings|recording]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under PBX-&amp;gt;myApps the administrator can set a certain default behaviour of the audio recording like whether or not the recording should start automatically at the beginning of the call (Recording by Default ON/OFF), only calls with external numbers should be recorded (Record external calls only) or whether or not the user should be able to start/stop the recording himself (Allow user incall recording control). Except for the last parameter these parameters can also be modified by the user in its softphone settings if the administrator doesn&#039;t set the FORCE flag.&lt;br /&gt;
&lt;br /&gt;
If the user was allowed by the admin to control the recording a recording switch is active during the call when the &amp;quot;Media&amp;quot; Panel is opened. There the audio recording may be stopped and continued at will. A red recording notice is shown in the top right corner when the recording actually takes place.&lt;br /&gt;
 &lt;br /&gt;
[[Image:Recording-incall-switch.png|recording-incall-switch.png/|recording-incall-switch.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services can use the OS specific notification mechanism (e.g. &#039;&#039;desktop notifications&#039;&#039; on Windows) to display messages (e.g. &#039;&#039;incoming new chat message&#039;&#039;) to the user.&lt;br /&gt;
&lt;br /&gt;
Note that the actual rendering of the notification is under control of the OS.  Therefore, myApps must be allowed to show notifications and its appearance can be restricted by OS native settings.&lt;br /&gt;
&lt;br /&gt;
==== Microsoft Windows Notifications ====&lt;br /&gt;
&lt;br /&gt;
Microsoft Windows Server editions (2016, 2019, 2022) are just capable of showing a single &#039;&#039;IncomingCall&#039;&#039; notification at the same time (we couldn&#039;t find a workaround for this limitation).&amp;lt;br/&amp;gt;&lt;br /&gt;
An &#039;&#039;IncomingCall&#039;&#039; notification is visible the whole time instead of being moved to the action center after a certain time.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
A notification about a missed call uses the &#039;&#039;IncomingCall&#039;&#039; type so that this notification is visible until the user returns.&amp;lt;br/&amp;gt;&lt;br /&gt;
Due to the above limitation, on a new arriving call such a missed call notification is transformed to a default notification which will be moved to the action center automatically.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On non server editions, you can have multiple IncomingCall notifications at the same time (so two parallel incoming calls will be indeed notified at the same time), but the missed call notification handling is the same on both platforms!&lt;br /&gt;
&lt;br /&gt;
 Thus there will be always just &#039;&#039;&#039;one&#039;&#039;&#039; missed call notification visible and previous missed calls can be found inside your action center!&lt;br /&gt;
&lt;br /&gt;
To see myApps notifications, ensure:&lt;br /&gt;
* System -&amp;gt; Notifications &lt;br /&gt;
** enable notifications&lt;br /&gt;
** disable &amp;quot;Do not disturb&amp;quot; or allow myApps as priority application while &amp;quot;Do not disturb&amp;quot; is active&lt;br /&gt;
** enable notifications for myApps in the list of applications&lt;br /&gt;
* System -&amp;gt; Focus &lt;br /&gt;
** if a focus session is active and the &amp;quot;Do not disturb&amp;quot; is activated during a focus session, make sure that myApps is a priority application (see above)&lt;br /&gt;
&lt;br /&gt;
==== macOS Notifications ====&lt;br /&gt;
Notifications are the same as on Windows.&lt;br /&gt;
The difference is, that for macOS, notifications need to be allowed in the system settings.&lt;br /&gt;
Go to Notifications - myApps, select Banner and enable all check marks.&lt;br /&gt;
&lt;br /&gt;
=== Local phonebook access ===&lt;br /&gt;
&#039;&#039;&#039;Contact Search:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm &#039;&#039;com.innovaphone.search&#039;&#039; API]]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Search&#039;&#039; request to the API:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;Search&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;search&amp;quot;:&amp;quot;john doe&amp;quot;},&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
Search results are delivered as &#039;&#039;SearchInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;SearchInfo&amp;quot;,&amp;quot;relevance&amp;quot;:2000,&amp;quot;adjust&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;contact&amp;quot;:{&amp;quot;givenname&amp;quot;:&amp;quot;John&amp;quot;,&amp;quot;sn&amp;quot;:&amp;quot;Doe&amp;quot;,&amp;quot;company&amp;quot;:&amp;quot;ACME&amp;quot;,&amp;quot;position&amp;quot;:&amp;quot;Head of everything&amp;quot;,&amp;quot;telephonenumber&amp;quot;:[&amp;quot;11111&amp;quot;,&amp;quot;22222&amp;quot;],&amp;quot;homephone&amp;quot;:[&amp;quot;+4944444&amp;quot;,&amp;quot;33333&amp;quot;],&amp;quot;mobile&amp;quot;:[&amp;quot;+49 (123) 55555&amp;quot;]}},&amp;quot;api&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reverse Lookup:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.phonelookup/lib1_api_phonelookup.htm &#039;&#039;com.innovaphone.phonelookup&#039;&#039; API]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Lookup&#039;&#039; request to the API: &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{ mt: &amp;quot;Lookup&amp;quot;, prefixIntl: &amp;quot;000&amp;quot;, prefixNtl: &amp;quot;00&amp;quot;, prefixExt:&amp;quot;0&amp;quot;, area: &amp;quot;7031&amp;quot;, country: &amp;quot;49&amp;quot;, lookup: &amp;quot;0004970311234567&amp;quot; },&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.lookup&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search results are delivered as &#039;&#039;LookupInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{mt: &amp;quot;LookupInfo&amp;quot;, dn: &amp;quot;Jake Blues&amp;quot;, contact: { telephonenumber: [&amp;quot;0004970311234567&amp;quot;], givenname: &amp;quot;Jake&amp;quot;, sn: &amp;quot;Blues&amp;quot;, company: &amp;quot;Blues Brothers&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
On Windows, the search and lookup are performed in all of the user&#039;s Outlook contact folders.  As opposed to the search implemented in the &#039;&#039;Contacts&#039;&#039; and &#039;&#039;Users&#039;&#039; App, all items are returned which match any of the search words (i.e. searching for &#039;&#039;a b&#039;&#039; will return items matching either &#039;&#039;a&#039;&#039; or &#039;&#039;b&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
; searched properties : firstname, lastname&lt;br /&gt;
; returned properties : Following Outlook contact phone number properties are returned  (if available):&lt;br /&gt;
&lt;br /&gt;
:* OFFICE_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* OFFICE2_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* HOME_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* HOME2_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* MOBILE_TELEPHONE_NUMBER as &#039;&#039;mobile&#039;&#039;&lt;br /&gt;
:* BUSINESS_FAX_NUMBER as &#039;&#039;facsimiletelephonenumber&#039;&#039;&lt;br /&gt;
Note that contact information is cached in the search provider.  Updated contacts may therefore become effective after a while only.&lt;br /&gt;
Outlook search will create its own trace file &amp;lt;code&amp;gt;myAppsOutlookSearch-&amp;lt;/code&amp;gt;&#039;&#039;date-time&#039;&#039;&amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; in the standard trace directory.&lt;br /&gt;
&lt;br /&gt;
This search provider is always installed and can be disabled.  There is no need (nor possibility) to enable it in the &#039;&#039;Apps&#039;&#039; tab of the PBX&#039;s user object.  Also, no &#039;&#039;App&#039;&#039; object needs to be created for it.&lt;br /&gt;
&lt;br /&gt;
==== Android/iOS ====&lt;br /&gt;
The search and lookup are performed in the contacts.&lt;br /&gt;
&lt;br /&gt;
==== macOS ====&lt;br /&gt;
The search and lookup are performed in the contacts. If you wish to disable local contact lookup, go to system settings - Security &amp;amp; Privacy and disable the access to contacts for myapps.&lt;br /&gt;
=== Microsoft Office integration ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services has a &#039;&#039;office presence provider&#039;&#039; that can provide the user&#039;s presence state to Office applications.  See [[{{NAMESPACE}}:Concept_myApps_Office_Integration|myApps Office Integration]] for details.&lt;br /&gt;
&lt;br /&gt;
This feature is installed by default.  However, it can be disabled using the &#039;&#039;OFFICEPRESENCE&#039;&#039; MSI Parameter.  Also, a check-mark is available in the setup dialog.&lt;br /&gt;
&lt;br /&gt;
=== Call an external application for calls ===&lt;br /&gt;
&lt;br /&gt;
Phone Apps (such as the phoneapp or softphone) can initiate the start of an external application when a new call appears (either incoming or outgoing).  The actual spawning of the application is done by the myApps platform service.  Also, the application properties (such as e.g. the executable&#039;s path) is configured in the myApps platform services (see [[#UI elements|Advanced settings]] in the &#039;&#039;UI elements&#039;&#039; section below).&lt;br /&gt;
&lt;br /&gt;
A number of arguments can be passed to the application by substituting $-variables in the &#039;&#039;Parameter&#039;&#039; field:&lt;br /&gt;
&lt;br /&gt;
; $n : phone number as dialed (called party number for outgoing calls) or received (calling party number for incoming calls)&lt;br /&gt;
&lt;br /&gt;
; $N : called or calling party number in &#039;&#039;national&#039;&#039; format (e.g. 07031730090)&lt;br /&gt;
&lt;br /&gt;
; $I : called or calling party number in &#039;&#039;international&#039;&#039; format (e.g. +497031730090)&lt;br /&gt;
&lt;br /&gt;
: note that both $N and $I only work if $n includes both subscriber number and area code (e.g. 07031730090). Otherwise they are equal to $n&lt;br /&gt;
&lt;br /&gt;
; $d : display name of peer (if known)&lt;br /&gt;
&lt;br /&gt;
; $u : URI name of the peer (if available eg with a federation call)&lt;br /&gt;
&lt;br /&gt;
; $c : conference id&lt;br /&gt;
&lt;br /&gt;
: this is a globally unique ID for this call and may be used to relate the call to the &#039;&#039;guid&#039;&#039; found in the CallInfo structure in the [http://wiki.innovaphone.com/index.php?title=Reference10:SOAP_API#CallInfo SOAP-API] and [http://sdk.innovaphone.com/doc/appwebsocket/RCC.htm RCC-API ].  Also, corresponding [[Reference10:Call Detail Record CDR PBX|CDRs]] can be related using the &#039;&#039;event&#039;&#039; tag&#039;s &#039;&#039;conf&#039;&#039; attribute.&lt;br /&gt;
The start of an external application can be requested using the &#039;&#039;com.innovaphone.externalapps&#039;&#039; API.&lt;br /&gt;
&lt;br /&gt;
Some setup examples are [[Howto:Integrate External Apps in innovaphone UC clients|shown here]].&lt;br /&gt;
&lt;br /&gt;
=== Push ===&lt;br /&gt;
&lt;br /&gt;
Mobile operating systems usually inhibit network operation of apps which run in the background or are closed by the user.  This is done in order to reduce battery consumption.  Unfortunately, this also stops such apps to maintain a registration by regularly sending &#039;&#039;keep alive&#039;&#039; messages to a server (in our case to the PBX).  As a result, myApps will be disconnected from the PBX.   When the PBX determines that there is an event for the application which needs a response, it needs to wake up the app using a dedicated channel provided by the operating system.  This mechanism is know as &#039;&#039;push&#039;&#039;. When running on iOS or Android, myApps supports &#039;&#039;push&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;push&#039;&#039; to work, a [[{{NAMESPACE}}:PBX/Objects/Push|&#039;&#039;push object&#039;&#039;]] needs to be configured in the PBX .  Also, it needs to be enabled on the mobile phone for the myApps app.&lt;br /&gt;
This mechanism is quite similar in v12 and v13, so you can refer to [[{{NAMESPACE}}:Concept_Push_Notifications_for_iOS_and_Android|the concept for push notifications for iOS and Android]] for more details. &lt;br /&gt;
&lt;br /&gt;
Also, helpful hints can be found in [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]].&lt;br /&gt;
&lt;br /&gt;
=== App Proxy ===&lt;br /&gt;
&lt;br /&gt;
myApps runs further &#039;&#039;Apps&#039;&#039; (such as e.g. the &#039;&#039;phoneapp&#039;&#039;) as a web page in an IFRAME of the browser myApps is running in.  The App&#039;s page code is loaded either from the PBX or from an &#039;&#039;application platform&#039;&#039; (AP).   This however would mean that the App&#039;s IFRAME would remain empty (a dead white screen) when the PBX or AP is not available. To make sure the App can start-up anyway, the myApps platform services feature the so-called &#039;&#039;App Proxy&#039;&#039;.  This is a caching proxy that caches all the App code so it is available even in case of network failure. When myApps runs in the context of the platform services, Apps are therefore not loaded from the App source directly, but from the local App proxy. &lt;br /&gt;
&lt;br /&gt;
The cached files are stored in the PCs local file system in the &amp;lt;code&amp;gt;%LOCALAPPDATA%\innovaphone\myApps\appproxy&amp;lt;/path&amp;gt;&amp;lt;/code&amp;gt;.  There is no configuration required.  However, if myApps seems to run with outdated or corrupt cached copies of the App, you can safely delete the entire directory.&lt;br /&gt;
&lt;br /&gt;
=== Auto update ===&lt;br /&gt;
&lt;br /&gt;
On Windows and on macOS, the myApps platform services can auto-update themselves to a common version.  This is controlled by the [[{{NAMESPACE}}:PBX/Config/myApps#Launcher_Software_Update | &#039;&#039;Launcher Software Update&#039;&#039;]] settings under &#039;&#039;PBX/Config/myApps&#039;&#039; in the PBX. &lt;br /&gt;
&lt;br /&gt;
When myApps is started or the user logs in or myApps needs to re-connect to the PBX, the platform services will use the [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client API] to learn the desired version (&#039;&#039;launcherUpdateBuild&#039;&#039;, which is part of the API&#039;s &#039;&#039;model&#039;&#039;). If this differs from the current version, the platform services will try to download the respective new version. &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;mt&amp;quot;: &amp;quot;ApiUpdate&amp;quot;,&lt;br /&gt;
    &amp;quot;apis&amp;quot;: {&lt;br /&gt;
        &amp;quot;com.innovaphone.client&amp;quot;: {&lt;br /&gt;
            &amp;quot;@client&amp;quot;: {&lt;br /&gt;
                &amp;quot;title&amp;quot;: &amp;quot;innovaphone myApps&amp;quot;,&lt;br /&gt;
                &amp;quot;model&amp;quot;: {&lt;br /&gt;
                    &amp;quot;launcher&amp;quot;: true,&lt;br /&gt;
                    &amp;quot;launcherUpdateBuild&amp;quot;: &amp;quot;134906&amp;quot;,&lt;br /&gt;
                    &amp;quot;appStoreUrl&amp;quot;: &amp;quot;http://store.innovaphone.com/release/download/&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The installation of the downloaded version is done by the &#039;&#039;innovaphonemyAppsUpdateService&#039;&#039;. This service is installed and enabled during the initial installation of the myApps platform services.  To disable auto-update, either leave the &#039;&#039;Launcher Software Update&#039;&#039; settings empty or set the service&#039;s start mode to &#039;&#039;disabled&#039;&#039; in the Windows &#039;&#039;services control panel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that on Windows the update service does not work on terminal servers. Administrators must do myApps base services updates using standard windows mechanisms.&lt;br /&gt;
&lt;br /&gt;
Note that on macOS if myApps has been installed from the Apple Store it is assumed that auto update from the PBX is not desired and disabled therefore.&lt;br /&gt;
&lt;br /&gt;
On Android/iOS/macOS updates can be downloaded from the respective app store.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Devices&#039;&#039; app can not update software installed on Windows PCs directly. However, when the PBX is updated using an &#039;&#039;update job&#039;&#039; in the &#039;&#039;Devices&#039;&#039; App, the &#039;&#039;Launcher Software Update&#039;&#039; settings will be updated accordingly and hence the myApps base services will ultimately also be updated to the same version.&lt;br /&gt;
&lt;br /&gt;
==== Auto update flow on Windows ====&lt;br /&gt;
&lt;br /&gt;
* On start of myApps, myApps checks if an update is available and ready for installation&lt;br /&gt;
** if yes, the update is installed directly, without user interaction (a popup is shown during the installation)&lt;br /&gt;
** if not, myApps starts&lt;br /&gt;
* if an update is available while myApps is already running, an update notification will be shown which let&#039;s the user choose to install the update now or later (the notification will then popup again after one hour)&lt;br /&gt;
&lt;br /&gt;
==UI elements ==&lt;br /&gt;
There are a few user interfaces provided by the platform services:&lt;br /&gt;
===tray-icon (Windows only) ===&lt;br /&gt;
::[[Image:myapps-tray.png|myapps-tray.png/|myapps-tray.png/]]&lt;br /&gt;
:Allows to&lt;br /&gt;
:* terminate myApps&lt;br /&gt;
:* toggle the &#039;&#039;autostart&#039;&#039; state&lt;br /&gt;
:* toggle the &#039;&#039;show in task bar&#039;&#039; state&lt;br /&gt;
:* open the trace folder&lt;br /&gt;
:&lt;br /&gt;
=== PBX connect form===&lt;br /&gt;
:: [[Image:myapps-connect.png|myapps-connect.png/|myapps-connect.png/]]&lt;br /&gt;
: Allows the user to specify the connect data for the PBX (i.e. IP address or DNS name)&lt;br /&gt;
:&lt;br /&gt;
=== Advanced settings===&lt;br /&gt;
::[[Image:myapps-settings0.png|myapps-settings0.png/|myapps-settings0.png/]]&lt;br /&gt;
::[[Image:myapps-settings.png|myapps-settings.png/|myapps-settings.png/]] [[Image:myapps-settings2.png|myapps-settings2.png/|myapps-settings2.png/]] [[Image:myapps-settings3.png|myapps-settings3.png/|myapps-settings3.png/]]&lt;br /&gt;
&lt;br /&gt;
: Allows to modify various platform dependant settings (such as e.g. the hotkey selection on Windows)&lt;br /&gt;
&lt;br /&gt;
== Interfaces ==&lt;br /&gt;
=== Provided APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm com.innovaphone.search] : access to local phone book entries by the [[#Local phonebook access|Local phonebook access]] component.&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.launcher/com.innovaphone.launcher.htm com.innovaphone.launcher] : display of OS specific user notifications and receipt of related user actions&lt;br /&gt;
; com.innovaphone.notificationhandler : reports back click on a notification.&lt;br /&gt;
; com.innovaphone.externalapps : to start external applications, see [[#Call an external application for calls|Call an external application for calls]]  above&lt;br /&gt;
&lt;br /&gt;
=== Used APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm com.innovaphone.phone] : used to initiate new or manipulate existing calls by the [[#Hot keys|Hot keys]] and [[#URL handler|URL handler]] components.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm com.innovaphone.chat] : used to start a new chat by the [[#URL handler|URL handler]] component.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client] : the model is used to learn the update settings, see [[#Auto update|Auto update]] above&lt;br /&gt;
&lt;br /&gt;
=== Protocols ===&lt;br /&gt;
&lt;br /&gt;
; [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol] : used by apps to allocate RTP channels, see [[#RTP service for audio.2C video and data|RTP service for audio, video and data]] above&lt;br /&gt;
&lt;br /&gt;
== Related App Services ==&lt;br /&gt;
&lt;br /&gt;
none&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
; Incoming call as banner on myApps for iOS : Since iOS 14 the iOS CallKit presents incoming calls as a banner leaving the original green answer button of myApps visible. Use only the blue button of the banner to accept the call or change iPhone Settings, App &amp;quot;Phone&amp;quot;, &amp;quot;Incoming Calls&amp;quot; to &amp;quot;Full Screen&amp;quot; to hide the myApps user interface again during call answering.&lt;br /&gt;
&lt;br /&gt;
; Call answer in speakerphone mode even with active Bluetooth headset on myApps for iOS : This causes unwanted speakerphone operation if the smartphone is used with a Bluetooth car audio system. The behaviour can be changed by selecting &#039;&#039;Bluetooth Headset&#039;&#039; in this setting:&lt;br /&gt;
:&#039;&#039;iOS Settings-&amp;gt;Accessibility-&amp;gt;Touch-&amp;gt;Call Audio Routing: Automatic / Bluetooth Headset / Speaker&#039;&#039;&lt;br /&gt;
:&#039;&#039;iOS Einstellungen-&amp;gt;Bedienungshilfen-&amp;gt;Tippen-&amp;gt;Anrufaudioausgabe: Automatisch / Bluetooth-Headset / Lautsprecher&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Windows Server 2016 (Windows 10 Build 1607) : windows just shows the first notification. Further notifications aren&#039;t displayed until the previous ones are removed from the notification center. Current windows builds do not show this behaviour anymore.&lt;br /&gt;
&lt;br /&gt;
; Problems on Mac computers with Yealink USB headsets&lt;br /&gt;
: we have received reports that myApps quits unexpectedly on some Mac computers when a Yealink headset is plugged in.  Unfortunately, we could not find out the cause yet.  If you use Yealink USB headsets and have a similar issue, please open a support ticket and send myApps traces.&lt;br /&gt;
&lt;br /&gt;
; Poly / Plantronics headset buttons only functional if myApps is started with Rosetta&lt;br /&gt;
: myApps macOS supports Apple M1/M2 hardware natively. However, the Poly / Plantronics headset SDK is only available for Intel platform and thus myApps needs to be started via Apple&#039;s Intel emulator Rosetta if a Poly / Plantronics headset is used. This is done with right-click on the myApps executable, &#039;&#039;Information&#039;&#039;, &#039;&#039;Open with Rosetta&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Windows surface devices may not work correctly&lt;br /&gt;
: Chromium does not get touch keyboard events. USB Keyboards may not be recognized either.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Windows using the .msi file found in the &#039;&#039;myApps Windows&#039;&#039; package from [https://store.innovaphone.com/release/download.htm store.innovaphone.com].&lt;br /&gt;
&lt;br /&gt;
myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
=== MSI Parameters and install options ===&lt;br /&gt;
&lt;br /&gt;
The MSI installer of myApps for Windows supports the following parameters and can be edited with [https://docs.microsoft.com/en-us/windows/win32/msi/orca-exe Microsoft Orca]. You can add your parameters in the table &#039;&#039;property&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; SERVER (REG_SZ): the PBX&#039;s server address (without protocol like https://)&lt;br /&gt;
; OFFICEPRESENCE (REG_DWORD): &#039;&#039;&#039;false&#039;&#039;&#039; to disable presence integration in Microsoft Office&lt;br /&gt;
: this is also available as a check-mark when running the install manually&lt;br /&gt;
&lt;br /&gt;
; DISABLEHEADSETS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable headsets support, see [[#Device handling|Device handling]] above&lt;br /&gt;
&lt;br /&gt;
; EXTERNALAPPS (REG_SZ): pre-define external applications, see [[#Call an external application for calls|Call an external application for calls]] above&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;&amp;quot;{&amp;quot;&amp;quot;externalApps&amp;quot;&amp;quot;:[{&amp;quot;&amp;quot;id&amp;quot;&amp;quot;:0,&amp;quot;&amp;quot;name&amp;quot;&amp;quot;:&amp;quot;&amp;quot;Wireshark&amp;quot;&amp;quot;,&amp;quot;&amp;quot;path&amp;quot;&amp;quot;:&amp;quot;&amp;quot;C:\\Program Files\\Wireshark\\Wireshark.exe&amp;quot;&amp;quot;,&amp;quot;&amp;quot;param&amp;quot;&amp;quot;:&amp;quot;&amp;quot;test $I&amp;quot;&amp;quot;}]}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FORCERESTART (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; (or any string ...) kills myApps during the installation and restarts it for the currently logged in user, if it was running&lt;br /&gt;
&lt;br /&gt;
; DISABLELOCALHOST (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable use of &#039;&#039;&#039;localhost&#039;&#039;&#039; string to access the local webserver. Use &#039;&#039;&#039;127.0.0.1&#039;&#039;&#039; instead&lt;br /&gt;
&lt;br /&gt;
; EXCLUDEINTERFACES (REG_SZ): some VPN interfaces are not detected by Windows as IF_TYPE_PPP or IF_TYPE_TUNNEL and therefore the &#039;&#039;&#039;media outside VPN&#039;&#039;&#039; setting is not taking effect. With this option interfaces can be pre-defined that will not be used for media. Interfaces must be comma separated&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;EXCLUDEINTERFACES=&amp;quot;172,192.168,10.10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FASTERDOWNLOADS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to have faster downloads without artificially slowing down the download of an update (which is done to avoid audio lags if clients have slow networks).&lt;br /&gt;
&lt;br /&gt;
Current settings are stored in the registry at &amp;lt;code&amp;gt;Computer\HKEY_CURRENT_USER\Software\innovaphone\myApps&amp;lt;/code&amp;gt; or at &amp;lt;code&amp;gt;Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\innovaphone\myApps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Boolean values like OfficePresence are stored in registry entries with type REG_DWORD and values 1 or 0. 0 disables the setting and 1 enables it.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on iOS by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;App Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== macOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services might be installed directly from the Apple store. An installer package &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; and a disk image &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; is also available from the innovaphone app store. Install &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; by double-click on the file and follow the instructions of the installer. myApps becomes available in the Applications folder and can be opened by double-click. Or download and open &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; and double klick myApps. If desired integrate it into the app dock by right click, &#039;&#039;Options, Keep in the dock&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If installed from the innovaphone app store, myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
If installed from the Apple store, macOS notifies about updates on the Apple store. myApps [[#Auto update|Auto update]] is disabled then.&lt;br /&gt;
&lt;br /&gt;
If a clean-install of the client is necessary, the folder &amp;quot;/Users/username/Library/Containers/myapps&amp;quot; needs to be deleted. To be on the safe side also delete it from the trash bin.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Preferences ===&lt;br /&gt;
&lt;br /&gt;
macOS supports preference settings that can be set via a shell command or via Mac remote management&lt;br /&gt;
&lt;br /&gt;
 defaults write com.innovaphone.client-ios-14r1 server &amp;quot;PBX-server-URL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following parameters and can be set through this method:&lt;br /&gt;
&lt;br /&gt;
; server: the PBX&#039;s server URL&lt;br /&gt;
&lt;br /&gt;
=== Setting myApps as Default App for SIP-URLs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add &#039;{&lt;br /&gt;
   LSHandlerURLScheme = sip;&lt;br /&gt;
   LSHandlerRoleAll = &amp;quot;&amp;lt;CFBundleIdentifier&amp;gt;&amp;quot;;&lt;br /&gt;
}&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To find the “CFBundleIdentifier”, proceed as follows:&lt;br /&gt;
* In the Finder under “Applications”, search for the desired myApps client that you want to set as the default app.&lt;br /&gt;
* Right-click on “Show package contents” -&amp;gt; you will find the “CFBundleIdentifier” in the Info.plist file.&lt;br /&gt;
&lt;br /&gt;
A restart of the MAC is required.&lt;br /&gt;
&lt;br /&gt;
=== Using Sennheiser headsets ===&lt;br /&gt;
If you use Sennheiser headsets, you should also install the then-current &amp;lt;code&amp;gt;DSEA_SDK_v&amp;lt;/code&amp;gt;&#039;&#039;version&#039;&#039;&amp;lt;code&amp;gt;.pkg&amp;lt;/code&amp;gt; package, after you installed the myApps client.  Without that, audio will still work, but not the controls on the headset.  You will need to keep that up-to-date yourself, as it is not updated by myApps&#039;s auto-update function.&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Android by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;Play Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying a property &amp;quot;server&amp;quot; with string value &amp;quot;pbx.example.com&amp;quot; in the MDM.&lt;br /&gt;
&lt;br /&gt;
== IP270 ==&lt;br /&gt;
For configuration instructions, refer to the [[Reference16r1:Concept IP270|IP270 concept article]].&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
When opening myApps for the first time, the user is prompted for the Server. Usually only the hostname (DNS host name or IP address) needs to be configured.&lt;br /&gt;
&lt;br /&gt;
But there are more options for special PBX configurations.&lt;br /&gt;
&lt;br /&gt;
; Non-standard HTTPS port&lt;br /&gt;
: If the PBX uses a non-standard HTTPS port, it must be appended to the host name separated by a colon (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com:4444&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com:4444/PBX0/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; DynPBX module name&lt;br /&gt;
: If the PBX is a DynPBX, the module id must be appended to PBX0 separated - (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com/PBX0-1&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0-1/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; Softphone physical location&lt;br /&gt;
: If user defined physical location shall be used for softphone, you can append it using a parameter &amp;lt;code&amp;gt;#phys=&amp;lt;/code&amp;gt;.&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com#phys=slave&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0/APPCLIENT/appclient.htm#phys=slave&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Example 1: PBX pbx.example.com with standard configuration&lt;br /&gt;
 pbx.example.com&lt;br /&gt;
&lt;br /&gt;
Example 2: PBX slave.example with DynPBX module ID 1, HTTPS port 4444 and physical location master&lt;br /&gt;
 slave.example.com:4444/PBX0-1#phys=master&lt;br /&gt;
&lt;br /&gt;
=== HTTP proxy support ===&lt;br /&gt;
&lt;br /&gt;
myApps platform services do support operation via HTTP proxy now. If one or more proxies have been configured in the network settings of the operating system for the active network connection, HTTP CONNECT tunnels are established.&lt;br /&gt;
&lt;br /&gt;
On Windows user name and password can be specified for the tunnel servers as generic credentials in the credentials manager (Anmeldeinformationsverwaltung). The name of the credentials must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
On Android user name and password can be specified through Android &#039;&#039;Settings, Accounts&#039;&#039; by adding a myApps &#039;&#039;HTTP Proxy Credentials&#039;&#039; account. The name of the account must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
== Platform specific settings ==&lt;br /&gt;
When myApps runs under the myApps platform services, it will show various platform specific settings as part of its &#039;&#039;burger menu&#039;&#039;, so the user can set them.  See &#039;&#039;Advanced settings&#039;&#039; in [[#UI elements|UI elements]] above.&lt;br /&gt;
&lt;br /&gt;
Some options can also be set globally for all myApps clients in the PBX&#039;s [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps &#039;&#039;Client Settings&#039;&#039;]]&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Option&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Where to set&lt;br /&gt;
&lt;br /&gt;
!&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || User menu || PBX &#039;&#039;Client Settings&#039;&#039; || Windows || iOS || Android || macOS&lt;br /&gt;
|IP270&amp;lt;ref&amp;gt;myApps-IP270 offers device specific settings explained in [[Reference16r1:Concept IP270|IP270 concept article]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Autostart || Launch myApps on login || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Appear offline after || controls after which idle time a user is considered &#039;&#039;inactive&#039;&#039;. See [[#User activity|User activity]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Hotkeys || Hotkeys for call dial, accept, reject. See [[#Hot keys|Hot keys]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Docking || Docking mode (left, right, none). See [[#???|??]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Desktop notifications|| Turn on/off platform notifications. See [[#Notifications|  Notifications]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| VPN || Disable VPN address for ICE candidate selection. See [[#RTP ports| RTP ports]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Show in taskbar|| Show myApps in the taskbar in addition to it&#039;s tray icon.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Log flags || turn on/off certain trace levels. See [[#Troubleshooting|Troubleshooting]] below.  || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| External applications || define the applications available for Apps to be started. See [[#Call an external application for calls|Call an external application for calls]] above.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Ring in headset || send ring tone for incoming to headset instead of loudspeaker.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Start parameters for Windows ==&lt;br /&gt;
&lt;br /&gt;
On Windows, it is not possible to pass start parameters from the [https://www.chromium.org/developers Chromium documentation] to the myApps process.&lt;br /&gt;
&lt;br /&gt;
== OS Settings for Windows ==&lt;br /&gt;
Windows settings can influence the display of &#039;&#039;Desktop notifications&#039;&#039;. See [https://support.microsoft.com/en-us/help/4028678/windows-10-change-notification-settings Change notification settings in Windows 10/11] for details.&lt;br /&gt;
&lt;br /&gt;
=== Windows 11 ===&lt;br /&gt;
&lt;br /&gt;
* Windows 11 has a feature &amp;quot;do not disturb&amp;quot;. This hides notifications if enabled.&lt;br /&gt;
* Windows 11 has a feature &amp;quot;focus&amp;quot;. This enables &amp;quot;do not disturb&amp;quot; and thus hides notifications too.&lt;br /&gt;
* Windows 11 has priority settings for notifications. Ensure that VoIP notifications for calls are allowed any maybe also include myApps as an App which is allowed to show notifications.&lt;br /&gt;
&lt;br /&gt;
== OS settings for Android ==&lt;br /&gt;
; Events : The appearance of notifications can be controlled here.&lt;br /&gt;
&lt;br /&gt;
; Call accounts : For proper incoming call signaling, the call account &#039;&#039;myApps&#039;&#039; needs to be enabled. Note that on Samsung smartphones the call account switch likely toggles back and a few tries may need to be done until it persists. Please double-check the state.&lt;br /&gt;
&lt;br /&gt;
; Preferred Calling Account : Choose which calling account (myApps/SIM/..) should be used for outgoing calls initiated from within the native phone app / phone book.&lt;br /&gt;
&lt;br /&gt;
; Background data, unlimited data usage : Grant background data use to enable &#039;&#039;myApps&#039;&#039; to connect to the PBX immediately on an incoming call.&lt;br /&gt;
&lt;br /&gt;
; Overlaying : This setting is not needed if call account &#039;&#039;myApps&#039;&#039; has been enabled. Should there be a reason for not enabling call account &#039;&#039;myApps&#039;&#039;, the permission for overlaying needs to be granted on Android 10 or higher for proper call signaling.&lt;br /&gt;
&lt;br /&gt;
Note: If no SIM card is installed some Android smartphones exhibit a problem dialing from the smartphone contacts. The contacts app shows a choice &#039;&#039;Select SIM card for this call&#039;&#039; but all possible dialers are greyed out. In this case make myApps the default phone app in Android settings &#039;&#039;Apps, Default apps, Telephony&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for iOS ==&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in iOS &#039;&#039;Settings, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for macOS ==&lt;br /&gt;
&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in macOS &#039;&#039;Preferences, Notifications, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
myApps platform services can write various traces for debugging.  Trace can be turned on and off selectively in the [[#Advanced settings|Advanced settings]].&lt;br /&gt;
&lt;br /&gt;
The following trace flags can be set:&lt;br /&gt;
&lt;br /&gt;
(&#039;&#039;Recommended trace options are: &#039;&#039;&#039;App, Browser, ICE, TURN, Signaling and Audio&#039;&#039;&#039;. Please do not activate other flags unless innovaphone support says otherwise&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |  Abbreviation&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |code&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| App||0x000000001|| logs from the App Service itself&lt;br /&gt;
|-&lt;br /&gt;
| DNS||0x000000008|| logs DNS requests and results&lt;br /&gt;
|-&lt;br /&gt;
| HTTP client||0x000000080|| http client logs&lt;br /&gt;
|-&lt;br /&gt;
| TLS||0x000000400|| TLS logs&lt;br /&gt;
|-&lt;br /&gt;
| TCP||0x000000800|| TCP logs&lt;br /&gt;
|-&lt;br /&gt;
| LDS||0x000001000|| local domain sockets&lt;br /&gt;
|-&lt;br /&gt;
| WebSocket client||0x000004000|| logs outgoing websocket connections&lt;br /&gt;
|-&lt;br /&gt;
| App WebSocket||0x000008000|| logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
|-&lt;br /&gt;
| UDP||0x000200000|| UDP logs&lt;br /&gt;
|-&lt;br /&gt;
| DTLS||0x000400000|| logs DTLS handshake and messages&lt;br /&gt;
|-&lt;br /&gt;
| Media||0x000800000|| logs media events&lt;br /&gt;
|-&lt;br /&gt;
| Media channel||0x001000000|| logs RTP/SCTP media connections&lt;br /&gt;
|-&lt;br /&gt;
| ICE||0x002000000|| logs ICE messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| TURN||0x004000000|| logs TURN messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| AppSharing||0x008000000|| logs AppSharing connection&lt;br /&gt;
|-&lt;br /&gt;
| Audio||0x010000000|| logs Audio connection and headset events&lt;br /&gt;
|-&lt;br /&gt;
| Video||0x020000000|| logs video connection and webcam events&lt;br /&gt;
|-&lt;br /&gt;
| Browser||0x040000000|| logs Chromium events&lt;br /&gt;
|-&lt;br /&gt;
| AppProxy||0x080000000|| logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
|-&lt;br /&gt;
| Webserver ||0x200000000|| enables webserver specific logs&lt;br /&gt;
|-&lt;br /&gt;
| Browser Console ||0x400000000|| logs browser console events&lt;br /&gt;
|-&lt;br /&gt;
| Signaling||0x800000000|| enables logs in the signaling module for debugging calls&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;code&#039;&#039; can be or&#039;ed and used as value for the &#039;&#039;Log flags&#039;&#039; field in [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps/Client Settings]].&lt;br /&gt;
&lt;br /&gt;
; Windows :On Windows, traces are written to the &amp;lt;code&amp;gt;%LOCALAPPDATA%\innovaphone\myApps&amp;lt;/code&amp;gt; directory. If you start myApps with --log-size as parameter, you can define the maximum size of a log file (e.g. --log-size=100000000 would be 100MB for each file)&lt;br /&gt;
&lt;br /&gt;
:* myApps-&#039;&#039;date-time&#039;&#039;.txt : main log file for the platform services&lt;br /&gt;
&lt;br /&gt;
:* myAppsOutlookSearch-&#039;&#039;date-time&#039;&#039;.txt : log file for the Outlook phone book access&lt;br /&gt;
&lt;br /&gt;
:* myAppsHookController-&#039;&#039;date-time&#039;&#039;.txt : log file for the hot-key interceptor (see [[#Hot keys|Hot keys]])&lt;br /&gt;
&lt;br /&gt;
; :myApps update installation traces are written to the &amp;lt;code&amp;gt;%windir%\temp\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsInstall.txt: MSI installation file&lt;br /&gt;
&lt;br /&gt;
; :myApps update service traces are written to the &amp;lt;code&amp;gt;%ProgramData%\innovaphone\myAppsUpdateService&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsUpdateService-&#039;&#039;date-time&#039;&#039;.txt: myApps update service traces&lt;br /&gt;
&lt;br /&gt;
;Android : traces can be sent by e-mail.&lt;br /&gt;
: also, an Android device might also be connected to a PC via an USB cable to get the traces. The files can be found in &amp;lt;code&amp;gt;Android/data/com.innovaphone.clientandroid/files&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
; macOS : traces can be sent by e-mail.&lt;br /&gt;
: also, the files can be found in &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-ios/Data/Documents/&amp;lt;/code&amp;gt;. Press &#039;&#039;Alt+N&#039;&#039; followed by space to get tilde &#039;&#039;~&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; IP270 : Refer to the [[Reference16r1:Concept IP270#Troubleshooting|IP270 concept article section troubleshooting]].&lt;br /&gt;
&lt;br /&gt;
= Known Problems =&lt;br /&gt;
[[:Category:Problem myApps platform services|Known Problems]]&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Redundancy|Concept myApps Redundancy]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Office_Integration|Concept myApps Office Integration]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myAPPs_Search_in_local-Outlook_Contacts|Concept myAPPs Search in local Outlook Contacts]]&lt;br /&gt;
* [[{{NAMESPACE}}:Call_Detail_Record_CDR_PBX|Call Detail Records]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept Push Notifications for myPBX iOS and Android|Concept Push Notifications for myPBX iOS and Android]]&lt;br /&gt;
* [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reference16r1:PBX/Config/myApps]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_IP270|IP270 concept article]]&lt;br /&gt;
[[Category:Concept myApps platform services]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_myApps_platform_services&amp;diff=79525</id>
		<title>Reference15r1:Concept myApps platform services</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_myApps_platform_services&amp;diff=79525"/>
		<updated>2026-04-21T09:11:24Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Device handling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|myApps]]&lt;br /&gt;
&lt;br /&gt;
myApps platform services provide various operating system specific services which can be used by other &#039;&#039;Apps&#039;&#039; running in the [[{{NAMESPACE}}:Concept myApps|myApps client]]. Those services typically are not available in the browser&#039;s JavaScript environment and hence must be implemented in native platform code. Therefore, the platform services are installed as native executable on the respective platform.&lt;br /&gt;
&lt;br /&gt;
When myApps is started in a web browser (and hence has no access to the platform services), some Apps will use [https://en.wikipedia.org/wiki/WebRTC WebRTC] services implemented by the browser instead.  For ease of reference, features available in this scenario are also described here.&lt;br /&gt;
&lt;br /&gt;
On windows, the platform services also come with their own web browser in which the myApps web App will be started then.  This browser is based on google&#039;s [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium] open source software.&lt;br /&gt;
= Applies To =&lt;br /&gt;
&lt;br /&gt;
* [[{{NAMESPACE}}:Concept myApps|myApps]]&lt;br /&gt;
* myApps for Windows&lt;br /&gt;
* myApps for macOS&lt;br /&gt;
* myApps for iOS&lt;br /&gt;
* myApps for Android&lt;br /&gt;
&lt;br /&gt;
* myApps Web App (WebRTC)&lt;br /&gt;
version 14r2&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
Not all features are available or required on all platforms.&lt;br /&gt;
 {|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Feature&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || Windows || iOS || Android || macOS || Browser&amp;lt;ref&amp;gt;This refers to the myApps web application running in a browser with no platform services available&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| audio || manage local audio devices to record and playback audio conversations || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (audio available but devices managed by web browser)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| video || manage local displays and cameras to capture and render video live stream || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (video available but devices managed by web browser)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| ringer || manage local ringing device || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| application sharing&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;amp;nbsp; presenter || share an application || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;amp;nbsp; consumer  || view an application shared by the peer || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| hot keys || capture key presses for quick invocation of phone apps (e.g. dial selected number) || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| tel: and sip: URI handler || intercept clicks on tel: and sip: links in web sites to invoke phone apps || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| user activity || set presence state according to user activity ||  &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;limited, see [[#User activity|User activity]] below&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| docking || myApps can be docked persistently to the right or left edge of your screens ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| multi-windowing|| Apps can be launched in separate windows||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| recording|| Calls can be recorded to recording app||  &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| notifications || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; display notifications || display notifications with OS standard mechanism ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; push notifications || receive push notifications while myApps is not running  ||  &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The browser needs to be running in order to receive push notifications.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; chat and apps || display notifications for chat and other apps  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; calls || display notifications for incoming calls  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&amp;lt;ref&amp;gt;Call notifications are only displayed locally while the phone or softphone app is started.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| phone book access || access local phone book ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| office presence provider || maps PBX presence state to Microsoft office presence state ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| external application start || start arbitrary external applications for calls || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| app proxy|| a caching proxy that provides app persistence  || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| auto update || automatically updates myApps platform services to the same version the PBX has || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The then-current web app is always loaded from the PBX upon startup and hence up-to-date by definition&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| three party conference || initiate 3-pty-conference using Softphone-App || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| exclude VPN || disable use of VPN connections for audio and appsharing || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
* innovaphone PBX 14r2 and up&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Recommended hardware requirements&lt;br /&gt;
* Processor: Dual-core 2Ghz or higher&lt;br /&gt;
* RAM: 4 Gb&lt;br /&gt;
&lt;br /&gt;
== myApps for Windows ==&lt;br /&gt;
* Windows 10 and up&lt;br /&gt;
* Windows Server 2016 and later versions&lt;br /&gt;
&lt;br /&gt;
=== 32 &amp;amp; 64 bit Windows ===&lt;br /&gt;
* 32 bit Windows: install the myAppsSetup32.msi from the App Store&lt;br /&gt;
* 64 bit Windows: install the myAppsSetup.msi from the App Store&lt;br /&gt;
** the 64 bit variant still installs into Program Files (x86), as the main myApps.exe is still a 32bit application&lt;br /&gt;
** the 64 bit variant just contains an additional 64 bit binary for the outlook search&lt;br /&gt;
&lt;br /&gt;
=== Windows N editions ===&lt;br /&gt;
&lt;br /&gt;
Windows N editions are missing the &#039;&#039;Media Feature Pack&#039;&#039; which is pre installed on other Windows versions.&lt;br /&gt;
&lt;br /&gt;
Please install the pack from [https://www.microsoft.com/en-us/software-download/mediafeaturepack Microsoft (Windows 10 pack)] before you install myApps. The installer will check if the file &amp;lt;code&amp;gt;C:\Windows\SysWOW64\mfplat.dll&amp;lt;/code&amp;gt; exist on your system.&lt;br /&gt;
&lt;br /&gt;
Make sure to install the correct pack depending on your Windows version! There are different packs for Windows 10 1703, 1803, 1809 and 32bit or 64bit etc.&lt;br /&gt;
&lt;br /&gt;
NB: Sometimes the myApps installation will not work even though the media pack is already installed. This is because the installer has no read access to check if the package is already installed. If the above-mentioned file exists and the installer asks to install the Windows Media Feature Pack nevertheless, you have to start the myApps install with administrative rights.&lt;br /&gt;
&lt;br /&gt;
=== Terminal Server environments ===&lt;br /&gt;
&lt;br /&gt;
Audio driver was removed if myApps discovers that it is running in a terminal server environment like Citrix.&lt;br /&gt;
&lt;br /&gt;
The audio driver is needed for the Softphone App but the Softphone App should not use an audio driver at the server side because the audio devices are plugged locally and there would be a delay sending and receiving audio data with the server.&lt;br /&gt;
&lt;br /&gt;
If a customer wants to use the Softphone App at the server side he needs to make use of the myApps Plugin for virtual desktops solution:&lt;br /&gt;
&lt;br /&gt;
[[{{NAMESPACE}}:MyApps_Plugin_for_Virtual_Desktops|Reference15r1:MyApps_Plugin_for_Virtual_Desktops]]&lt;br /&gt;
&lt;br /&gt;
== myApps for macOS ==&lt;br /&gt;
* macOS 10.13 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for iOS ==&lt;br /&gt;
* iOS 13 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for Android ==&lt;br /&gt;
* Android 6.0 or higher. Android 6.x may need an update of the Chrome browser.&lt;br /&gt;
&lt;br /&gt;
= Licenses =&lt;br /&gt;
* No license needed for myApps platform services&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
myApps platform services is a native executable that is installed using the standard mechanisms on the respective operating system. It provides various advanced services which can be used by the myApps web client code as well as the Apps running in the myApps context. &lt;br /&gt;
&lt;br /&gt;
Also, on Windows, the platform services come with their own, dedicated browser to run myApps in.  This browser is based on [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium].  On iOS, macOS and Android, it is based upon native embedded web view facilities (such as WKWebView) instead.&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
=== RTP service for audio and appsharing ===&lt;br /&gt;
The RTP service provides audio and appsharing as a video stream. VoIP RTP endpoints (e.g. for softphones).  It supports STUN, TURN, ICE, SRTP, DTLS. Note however that unlike WebRTC, these endpoints do not &#039;&#039;require&#039;&#039; ICE and DTLS. In other words, they can communicate also with non-compliant (i.e. older) VoIP devices.&lt;br /&gt;
&lt;br /&gt;
Note that the available capabilities when not running the myApps platform services depend on the used browser&#039;s WebRTC implementation. See your browser documentation for details.&lt;br /&gt;
&lt;br /&gt;
Apps can request RTP channels using the [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol]&#039;s &#039;&#039;AllocChannel&#039;&#039; message.&lt;br /&gt;
&lt;br /&gt;
===== RTP ports=====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|  audio || 50000 -&amp;gt; 50099&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| video (app sharing) || 50100 -&amp;gt; 50199&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The RTP service will enumerate all local interfaces and create local HOST candidates for ICE.  There is an option however to disregard VPN interfaces (more precisely such interfaces with type of &#039;&#039;IF_TYPE_PPP&#039;&#039; or &#039;&#039;IF_TYPE_TUNNEL&#039;&#039;).  This can eliminate quality issues when RTP data is transmitted through TCP based VPN tunnels.&lt;br /&gt;
&lt;br /&gt;
SRFLX and RELAY candidates are obtained using the STUN and TURN server configuration passed by the App (e.g the &#039;&#039;softphone&#039;&#039; App) as part of the &#039;&#039;AllocChannel&#039;&#039; request.&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;AllocChannel&amp;quot;,&amp;quot;channel&amp;quot;:&amp;quot;81429cba-396d-43de-8a76-ec020ba8796e&amp;quot;,&amp;quot;iceServers&amp;quot;:[{&amp;quot;urls&amp;quot;:&amp;quot;turn:myturn.domaincom:4077?transport=udp&amp;quot;,&amp;quot;username&amp;quot;:&amp;quot;turnuser&amp;quot;,&amp;quot;credential&amp;quot;:&amp;quot;pwd&amp;quot;,&amp;quot;credentialType&amp;quot;:&amp;quot;password&amp;quot;},{&amp;quot;urls&amp;quot;:&amp;quot;stun:mystun.domain.com:4077&amp;quot;}],&amp;quot;dn&amp;quot;:&amp;quot;Foo Bar&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;RemoteRtp&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;video&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Codecs =====&lt;br /&gt;
&lt;br /&gt;
The installed myApps launchers provide codecs that can be used by softphone apps for media streams. When running in a web browser the codecs depend on the browser version and operating system. See the documentation of your browser for details.&lt;br /&gt;
&lt;br /&gt;
The following codecs are supported:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align:left;width:100px;&amp;quot;|Codec&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Windows-Launcher&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Android&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|iOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|macOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Firefox (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Chrome (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Edge (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Safari (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Opera (Browser)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Audio&lt;br /&gt;
|-&lt;br /&gt;
|G711A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G711u&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G722&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G729&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729B&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729AB&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-NB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-WB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Video&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP8 VP8]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP9 VP9]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=H264 H264]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Application Sharing&lt;br /&gt;
|-&lt;br /&gt;
|Share&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|Watch&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;* small presentation only&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;** only for 1:1 calls, not for conferences&lt;br /&gt;
&lt;br /&gt;
===== Video capture =====&lt;br /&gt;
&lt;br /&gt;
The default resolution for video capture is 1920x1080 if available.  Otherwise, 1280x720, 640x480, 352x288 or 320x240 will be used.  The frame rate is 30 fps if available, otherwise 15 fps. The resulting average bandwidth could reach 1 Mbps.&lt;br /&gt;
&lt;br /&gt;
===== Application sharing =====&lt;br /&gt;
&lt;br /&gt;
Screen content will be transmitted as video stream by the presenter&lt;br /&gt;
&lt;br /&gt;
===== Device handling =====&lt;br /&gt;
&lt;br /&gt;
The RTP service enumerates microphones, loudspeaker, cameras and ringing devices and notifies apps when devices come and go. It is up to the apps using the devices to store preferences.&lt;br /&gt;
&lt;br /&gt;
The RTP service also enables some extended features (such as hook switch or volume control) for supported USB headsets or Bluetooth headsets connected to myApps.&lt;br /&gt;
The supported headset-SDKs determine which headset vendors are recommended to be used with the myApps softphone app. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this to work, the following vendor specific development kits are integrated in our myApps client. Be aware that the SDK are updated within our Service release :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SDK Vendor !! Supported OS !! SDK Version !! innovaphone Service Release&lt;br /&gt;
|-&lt;br /&gt;
| Jabra|| MacOS || 1.16.4.0 || 14r2sr11&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 1.16.4.0 || 15r1sr3&lt;br /&gt;
|-&lt;br /&gt;
| Epos &#039;&#039;(formerly Sennheiser)&#039;&#039; || MacOS || 12.4.0.5478 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || n.a. - [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|to be installed separately]]|| 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Poly &#039;&#039;(formerly Plantronics)&#039;&#039; || MacOS || 3.25.53799.37131 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.25.53800.37131 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Yealink || MacOS || 3.1.1.23 || 14r2sr1&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.1.1.23 || 14r2sr2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* It is possible to inhibit the start of the Sennheiser SDK (SenncomSDK.exe) using the &amp;lt;code&amp;gt;DISABLEHEADSETS&amp;lt;/code&amp;gt; directive of the installer (see [[#MSI Parameters and install options|  MSI parameters]]  below).&lt;br /&gt;
&lt;br /&gt;
* Starting with V13r3sr10, the Epos-SDK needs to be installed separately using the Epos Connect software to ensure full compatibility between current Epos headset models and native myApps-Windows client. For details [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|refer to this article]].&lt;br /&gt;
&amp;lt;!--Keywords: myapps softphone supported headsets sdk--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Ring tones =====&lt;br /&gt;
&lt;br /&gt;
Ring tones can be played. Apps can choose the tone from a pre-defined list of ring tones.&lt;br /&gt;
&lt;br /&gt;
On Windows, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;ringtones&amp;lt;/code&amp;gt; sub-directory of myApps&#039; roaming directory (which usually is in &amp;lt;code&amp;gt;%appdata%\innovaphone\myApps\ringtones&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
On Android, custom ring tones can be added to the system via Android settings.&lt;br /&gt;
&lt;br /&gt;
On iOS, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;Ringtones&amp;lt;/code&amp;gt; subdirectory of the myApps file share that is available in iTunes if the iPhone has been connected via USB.&lt;br /&gt;
&lt;br /&gt;
On macOS, custom ring tones can be uploaded as .mp3 files to &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-macos/Data/Documents/Ringtones&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Debugging =====&lt;br /&gt;
For extended debugging, turn on the &#039;&#039;Audio&#039;&#039;, &#039;&#039;Media&#039;&#039; and &#039;&#039;AppSharing&#039;&#039; traces in myApps.&lt;br /&gt;
&lt;br /&gt;
=== Hot keys ===&lt;br /&gt;
On Windows and macOS systems, myApps platform services can listen for hot keys and invoke certain functions. Invocation is done by sending API messages to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
The hot keys can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below. Any of the function keys F1 to F11 (optionally combined with up to two modifier keys &#039;&#039;alt&#039;&#039;, &#039;&#039;ctrl&#039;&#039;, &#039;&#039;shift&#039;&#039; or &#039;&#039;win&#039;&#039;) can be chosen for each function. If you do not want to start the call with &amp;quot;Hotkey+Enter&amp;quot; because you would have to wait for the focus, the hotkey can also be pressed twice and the number is dialled directly.&lt;br /&gt;
&lt;br /&gt;
; dial selected number : Initiates a call using the currently selected text as target.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;text&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;mt&amp;quot;:&amp;quot;PrepareCall&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;13&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; accept call : Accepts a currently alerting call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;ConnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;ConnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; reject/disconnect call : Rejects a currently alerting call or disconnects an active call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;DisconnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;DisconnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== URL Handler ===&lt;br /&gt;
&lt;br /&gt;
On Windows systems, two URI-handler are installed with the myApps platform services.  Windows will call up this URI handler when a user clicks on an appropriate link, for example in a web site.&lt;br /&gt;
&lt;br /&gt;
The handler will the send an API message to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
; tel URI : call a number, e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;num&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;num&amp;quot;:&amp;quot;4711&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; sip URI : call a SIP name, e.g. &amp;lt;code&amp;gt;sip:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; im URI : start chat with SIP name, e.g. &amp;lt;code&amp;gt;im:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;StartChat&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm &#039;&#039;com.innovaphone.chat&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.chat&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartChat&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On macOS systems myApps might be made the default application to handle tel URI e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt; via Apple FaceTime. Open the &amp;quot;FaceTime&amp;quot; menu &amp;quot;Settings...&amp;quot; and select myApps as &amp;quot;Default for phone calls&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On iOS &#039;&#039;tel&#039;&#039; URIs are always dialed via GSM. Therefore myApps iOS also reacts to URI schemes &#039;&#039;com.innovaphone.tel&#039;&#039;, &#039;&#039;com.innovaphone.sip&#039;&#039; and &#039;&#039;com.innovaphone.im&#039;&#039;, e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.tel:4711&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.sip:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.im:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== User activity ===&lt;br /&gt;
On Windows and macOS systems, the myApps platform services can monitor user keyboard/mouse activity and change the user&#039;s presence state after a certain amount of inactivity.  The timeout can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below.&lt;br /&gt;
&lt;br /&gt;
myApps will then send a [https://sdk.innovaphone.com/doc/appwebsocket/myApps.htm#SetUserActivity&#039;&#039;SetUserActivity&#039;&#039;] message to the PBX using the &#039;&#039;myApps&#039;&#039; protocol.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;SetUserActivity&amp;quot;,&amp;quot;inactive&amp;quot;:true}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will change the &#039;&#039;status&#039;&#039; property of the &#039;&#039;im:&#039;&#039; contact for the user&#039;s own presence and hence result in a presence update from the PBX to myApps&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;UpdateOwnPresence&amp;quot;,&amp;quot;presence&amp;quot;:[{...},{&amp;quot;contact&amp;quot;:&amp;quot;im:&amp;quot;,&amp;quot;activity&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;closed&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
The &#039;&#039;closed&#039;&#039; status is reflected in the grey status color when displaying a contact [[Image:myapps-inactive.png|myapps-inactive.png/|myapps-inactive.png/]].&lt;br /&gt;
&lt;br /&gt;
On iOS and Android, the state is set to &#039;&#039;inactive&#039;&#039; as soon as the App is brought to background.&lt;br /&gt;
When myApps platform services are not available (i.e. when running the web application in a browser solely) a limited user activity monitoring is available: the state is set to active when the web page is not used for more than 5 minutes.&lt;br /&gt;
&lt;br /&gt;
=== Recording ===&lt;br /&gt;
&lt;br /&gt;
The new launcher offers the possibility to record the audio of incoming and outgoing calls. In order to activate that functionality the URL of the recording instance must be configured in either the PBX (PBX-&amp;gt;myApps-&amp;gt;Config: Recording URL) or the softphone App (Settings-&amp;gt;Audio Recording (URL)) &lt;br /&gt;
&lt;br /&gt;
[[Image:PBX-Recording-Settings.png|pbx-recording-settings.png/|pbx-recording-settings.png/]] [[Image:Recording-Softphone-Settings.png|recording-softphone-settings.png/|recording-softphone-settings.png/]]. &lt;br /&gt;
&lt;br /&gt;
As long as that URL is configured the audio data of all calls are stored as pcap-files under that URL.&lt;br /&gt;
If the URL points to a CF device in the PBX, write access must be granted for that URL (PBX-&amp;gt;Services-&amp;gt;HTTP-&amp;gt;Server:Public compact flash access) and if the URL points to the recording app, the files can be accessed via the recording app [[{{NAMESPACE}}:Concept_App_Service_Recordings|recording]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under PBX-&amp;gt;myApps the administrator can set a certain default behaviour of the audio recording like whether or not the recording should start automatically at the beginning of the call (Recording by Default ON/OFF), only calls with external numbers should be recorded (Record external calls only) or whether or not the user should be able to start/stop the recording himself (Allow user incall recording control). Except for the last parameter these parameters can also be modified by the user in its softphone settings if the administrator doesn&#039;t set the FORCE flag.&lt;br /&gt;
&lt;br /&gt;
If the user was allowed by the admin to control the recording a recording switch is active during the call when the &amp;quot;Media&amp;quot; Panel is opened. There the audio recording may be stopped and continued at will. A red recording notice is shown in the top right corner when the recording actually takes place.&lt;br /&gt;
 &lt;br /&gt;
[[Image:Recording-incall-switch.png|recording-incall-switch.png/|recording-incall-switch.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services can use the OS specific notification mechanism (e.g. &#039;&#039;desktop notifications&#039;&#039; on Windows) to display messages (e.g. &#039;&#039;incoming new chat message&#039;&#039;) to the user.&lt;br /&gt;
&lt;br /&gt;
Note that the actual rendering of the notification is under control of the OS.  Therefore, myApps must be allowed to show notifications and its appearance can be restricted by OS native settings.&lt;br /&gt;
&lt;br /&gt;
==== Microsoft Windows Notifications ====&lt;br /&gt;
&lt;br /&gt;
Microsoft Windows Server editions (2016, 2019, 2022) are just capable of showing a single &#039;&#039;IncomingCall&#039;&#039; notification at the same time (we couldn&#039;t find a workaround for this limitation).&amp;lt;br/&amp;gt;&lt;br /&gt;
An &#039;&#039;IncomingCall&#039;&#039; notification is visible the whole time instead of being moved to the action center after a certain time.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
A notification about a missed call uses the &#039;&#039;IncomingCall&#039;&#039; type so that this notification is visible until the user returns.&amp;lt;br/&amp;gt;&lt;br /&gt;
Due to the above limitation, on a new arriving call such a missed call notification is transformed to a default notification which will be moved to the action center automatically.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On non server editions, you can have multiple IncomingCall notifications at the same time (so two parallel incoming calls will be indeed notified at the same time), but the missed call notification handling is the same on both platforms!&lt;br /&gt;
&lt;br /&gt;
 Thus there will be always just &#039;&#039;&#039;one&#039;&#039;&#039; missed call notification visible and previous missed calls can be found inside your action center!&lt;br /&gt;
&lt;br /&gt;
To see myApps notifications, ensure:&lt;br /&gt;
* System -&amp;gt; Notifications &lt;br /&gt;
** enable notifications&lt;br /&gt;
** disable &amp;quot;Do not disturb&amp;quot; or allow myApps as priority application while &amp;quot;Do not disturb&amp;quot; is active&lt;br /&gt;
** enable notifications for myApps in the list of applications&lt;br /&gt;
* System -&amp;gt; Focus &lt;br /&gt;
** if a focus session is active and the &amp;quot;Do not disturb&amp;quot; is activated during a focus session, make sure that myApps is a priority application (see above)&lt;br /&gt;
&lt;br /&gt;
==== macOS Notifications ====&lt;br /&gt;
Notifications are the same as on Windows.&lt;br /&gt;
The difference is, that for macOS, notifications need to be allowed in the system settings.&lt;br /&gt;
Go to Notifications - myApps, select Banner and enable all check marks.&lt;br /&gt;
&lt;br /&gt;
=== Local phonebook access ===&lt;br /&gt;
&#039;&#039;&#039;Contact Search:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm &#039;&#039;com.innovaphone.search&#039;&#039; API]]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Search&#039;&#039; request to the API:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;Search&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;search&amp;quot;:&amp;quot;john doe&amp;quot;},&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
Search results are delivered as &#039;&#039;SearchInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;SearchInfo&amp;quot;,&amp;quot;relevance&amp;quot;:2000,&amp;quot;adjust&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;contact&amp;quot;:{&amp;quot;givenname&amp;quot;:&amp;quot;John&amp;quot;,&amp;quot;sn&amp;quot;:&amp;quot;Doe&amp;quot;,&amp;quot;company&amp;quot;:&amp;quot;ACME&amp;quot;,&amp;quot;position&amp;quot;:&amp;quot;Head of everything&amp;quot;,&amp;quot;telephonenumber&amp;quot;:[&amp;quot;11111&amp;quot;,&amp;quot;22222&amp;quot;],&amp;quot;homephone&amp;quot;:[&amp;quot;+4944444&amp;quot;,&amp;quot;33333&amp;quot;],&amp;quot;mobile&amp;quot;:[&amp;quot;+49 (123) 55555&amp;quot;]}},&amp;quot;api&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reverse Lookup:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.phonelookup/lib1_api_phonelookup.htm &#039;&#039;com.innovaphone.phonelookup&#039;&#039; API]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Lookup&#039;&#039; request to the API: &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{ mt: &amp;quot;Lookup&amp;quot;, prefixIntl: &amp;quot;000&amp;quot;, prefixNtl: &amp;quot;00&amp;quot;, prefixExt:&amp;quot;0&amp;quot;, area: &amp;quot;7031&amp;quot;, country: &amp;quot;49&amp;quot;, lookup: &amp;quot;0004970311234567&amp;quot; },&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.lookup&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search results are delivered as &#039;&#039;LookupInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{mt: &amp;quot;LookupInfo&amp;quot;, dn: &amp;quot;Jake Blues&amp;quot;, contact: { telephonenumber: [&amp;quot;0004970311234567&amp;quot;], givenname: &amp;quot;Jake&amp;quot;, sn: &amp;quot;Blues&amp;quot;, company: &amp;quot;Blues Brothers&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
On Windows, the search and lookup are performed in all of the user&#039;s Outlook contact folders.  As opposed to the search implemented in the &#039;&#039;Contacts&#039;&#039; and &#039;&#039;Users&#039;&#039; App, all items are returned which match any of the search words (i.e. searching for &#039;&#039;a b&#039;&#039; will return items matching either &#039;&#039;a&#039;&#039; or &#039;&#039;b&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
; searched properties : firstname, lastname&lt;br /&gt;
; returned properties : Following Outlook contact phone number properties are returned  (if available):&lt;br /&gt;
&lt;br /&gt;
:* OFFICE_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* OFFICE2_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* HOME_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* HOME2_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* MOBILE_TELEPHONE_NUMBER as &#039;&#039;mobile&#039;&#039;&lt;br /&gt;
:* BUSINESS_FAX_NUMBER as &#039;&#039;facsimiletelephonenumber&#039;&#039;&lt;br /&gt;
Note that contact information is cached in the search provider.  Updated contacts may therefore become effective after a while only.&lt;br /&gt;
Outlook search will create its own trace file &amp;lt;code&amp;gt;myAppsOutlookSearch-&amp;lt;/code&amp;gt;&#039;&#039;date-time&#039;&#039;&amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; in the standard trace directory.&lt;br /&gt;
&lt;br /&gt;
This search provider is always installed and can be disabled.  There is no need (nor possibility) to enable it in the &#039;&#039;Apps&#039;&#039; tab of the PBX&#039;s user object.  Also, no &#039;&#039;App&#039;&#039; object needs to be created for it.&lt;br /&gt;
&lt;br /&gt;
==== Android/iOS ====&lt;br /&gt;
The search and lookup are performed in the contacts.&lt;br /&gt;
&lt;br /&gt;
==== macOS ====&lt;br /&gt;
The search and lookup are performed in the contacts. If you wish to disable local contact lookup, go to system settings - Security &amp;amp; Privacy and disable the access to contacts for myapps.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft Office integration ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services has a &#039;&#039;office presence provider&#039;&#039; that can provide the user&#039;s presence state to Office applications.  See [[{{NAMESPACE}}:Concept_myApps_Office_Integration|myApps Office Integration]] for details.&lt;br /&gt;
&lt;br /&gt;
This feature is installed by default.  However, it can be disabled using the &#039;&#039;OFFICEPRESENCE&#039;&#039; MSI Parameter.  Also, a check-mark is available in the setup dialog.&lt;br /&gt;
&lt;br /&gt;
=== Call an external application for calls ===&lt;br /&gt;
&lt;br /&gt;
Phone Apps (such as the phoneapp or softphone) can initiate the start of an external application when a new call appears (either incoming or outgoing).  The actual spawning of the application is done by the myApps platform service.  Also, the application properties (such as e.g. the executable&#039;s path) is configured in the myApps platform services (see [[#UI elements|Advanced settings]] in the &#039;&#039;UI elements&#039;&#039; section below).&lt;br /&gt;
&lt;br /&gt;
A number of arguments can be passed to the application by substituting $-variables in the &#039;&#039;Parameter&#039;&#039; field:&lt;br /&gt;
&lt;br /&gt;
; $n : phone number as dialed (called party number for outgoing calls) or received (calling party number for incoming calls)&lt;br /&gt;
&lt;br /&gt;
; $N : called or calling party number in &#039;&#039;national&#039;&#039; format (e.g. 07031730090)&lt;br /&gt;
&lt;br /&gt;
; $I : called or calling party number in &#039;&#039;international&#039;&#039; format (e.g. +497031730090)&lt;br /&gt;
&lt;br /&gt;
: note that both $N and $I only work if $n includes both subscriber number and area code (e.g. 07031730090). Otherwise they are equal to $n&lt;br /&gt;
&lt;br /&gt;
; $d : display name of peer (if known)&lt;br /&gt;
&lt;br /&gt;
; $u : URI name of the peer (if available eg with a federation call)&lt;br /&gt;
&lt;br /&gt;
; $c : conference id&lt;br /&gt;
&lt;br /&gt;
: this is a globally unique ID for this call and may be used to relate the call to the &#039;&#039;guid&#039;&#039; found in the CallInfo structure in the [http://wiki.innovaphone.com/index.php?title=Reference10:SOAP_API#CallInfo SOAP-API] and [http://sdk.innovaphone.com/doc/appwebsocket/RCC.htm RCC-API ].  Also, corresponding [[Reference10:Call Detail Record CDR PBX|CDRs]] can be related using the &#039;&#039;event&#039;&#039; tag&#039;s &#039;&#039;conf&#039;&#039; attribute.&lt;br /&gt;
The start of an external application can be requested using the &#039;&#039;com.innovaphone.externalapps&#039;&#039; API.&lt;br /&gt;
&lt;br /&gt;
Some setup examples are [[Howto:Integrate External Apps in innovaphone UC clients|shown here]].&lt;br /&gt;
&lt;br /&gt;
=== Push ===&lt;br /&gt;
&lt;br /&gt;
Mobile operating systems usually inhibit network operation of apps which run in the background or are closed by the user.  This is done in order to reduce battery consumption.  Unfortunately, this also stops such apps to maintain a registration by regularly sending &#039;&#039;keep alive&#039;&#039; messages to a server (in our case to the PBX).  As a result, myApps will be disconnected from the PBX.   When the PBX determines that there is an event for the application which needs a response, it needs to wake up the app using a dedicated channel provided by the operating system.  This mechanism is know as &#039;&#039;push&#039;&#039;. When running on iOS or Android, myApps supports &#039;&#039;push&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;push&#039;&#039; to work, a [[{{NAMESPACE}}:PBX/Objects/Push|&#039;&#039;push object&#039;&#039;]] needs to be configured in the PBX .  Also, it needs to be enabled on the mobile phone for the myApps app.&lt;br /&gt;
This mechanism is quite similar in v12 and v13, so you can refer to [[{{NAMESPACE}}:Concept_Push_Notifications_for_iOS_and_Android|Reference14r2:Concept_Push_Notifications_for_iOS_and_Android]] for more details. &lt;br /&gt;
&lt;br /&gt;
Also, helpful hints can be found in [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]].&lt;br /&gt;
&lt;br /&gt;
=== App Proxy ===&lt;br /&gt;
&lt;br /&gt;
myApps runs further &#039;&#039;Apps&#039;&#039; (such as e.g. the &#039;&#039;phoneapp&#039;&#039;) as a web page in an IFRAME of the browser myApps is running in.  The App&#039;s page code is loaded either from the PBX or from an &#039;&#039;application platform&#039;&#039; (AP).   This however would mean that the App&#039;s IFRAME would remain empty (a dead white screen) when the PBX or AP is not available. To make sure the App can start-up anyway, the myApps platform services feature the so-called &#039;&#039;App Proxy&#039;&#039;.  This is a caching proxy that caches all the App code so it is available even in case of network failure. When myApps runs in the context of the platform services, Apps are therefore not loaded from the App source directly, but from the local App proxy. &lt;br /&gt;
&lt;br /&gt;
The cached files are stored in the PCs local file system in the &amp;lt;code&amp;gt;%LOCALAPPDATA%\innovaphone\myApps\appproxy&amp;lt;/path&amp;gt;&amp;lt;/code&amp;gt;.  There is no configuration required.  However, if myApps seems to run with outdated or corrupt cached copies of the App, you can safely delete the entire directory.&lt;br /&gt;
&lt;br /&gt;
=== Auto update ===&lt;br /&gt;
&lt;br /&gt;
On Windows and on macOS, the myApps platform services can auto-update themselves to a common version.  This is controlled by the [[{{NAMESPACE}}:PBX/Config/myApps#Launcher_Software_Update | &#039;&#039;Launcher Software Update&#039;&#039;]] settings under &#039;&#039;PBX/Config/myApps&#039;&#039; in the PBX. &lt;br /&gt;
&lt;br /&gt;
When myApps is started or the user logs in or myApps needs to re-connect to the PBX, the platform services will use the [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client API] to learn the desired version (&#039;&#039;launcherUpdateBuild&#039;&#039;, which is part of the API&#039;s &#039;&#039;model&#039;&#039;). If this differs from the current version, the platform services will try to download the respective new version. &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;mt&amp;quot;: &amp;quot;ApiUpdate&amp;quot;,&lt;br /&gt;
    &amp;quot;apis&amp;quot;: {&lt;br /&gt;
        &amp;quot;com.innovaphone.client&amp;quot;: {&lt;br /&gt;
            &amp;quot;@client&amp;quot;: {&lt;br /&gt;
                &amp;quot;title&amp;quot;: &amp;quot;innovaphone myApps&amp;quot;,&lt;br /&gt;
                &amp;quot;model&amp;quot;: {&lt;br /&gt;
                    &amp;quot;launcher&amp;quot;: true,&lt;br /&gt;
                    &amp;quot;launcherUpdateBuild&amp;quot;: &amp;quot;134906&amp;quot;,&lt;br /&gt;
                    &amp;quot;appStoreUrl&amp;quot;: &amp;quot;http://store.innovaphone.com/release/download/&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The installation of the downloaded version is done by the &#039;&#039;innovaphonemyAppsUpdateService&#039;&#039;. This service is installed and enabled during the initial installation of the myApps platform services.  To disable auto-update, either leave the &#039;&#039;Launcher Software Update&#039;&#039; settings empty or set the service&#039;s start mode to &#039;&#039;disabled&#039;&#039; in the Windows &#039;&#039;services control panel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that on Windows the update service does not work on terminal servers. Administrators must do myApps base services updates using standard windows mechanisms.&lt;br /&gt;
&lt;br /&gt;
Note that on macOS if myApps has been installed from the Apple Store it is assumed that auto update from the PBX is not desired and disabled therefore.&lt;br /&gt;
&lt;br /&gt;
On Android/iOS/macOS updates can be downloaded from the respective app store.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Devices&#039;&#039; app can not update software installed on Windows PCs directly. However, when the PBX is updated using an &#039;&#039;update job&#039;&#039; in the &#039;&#039;Devices&#039;&#039; App, the &#039;&#039;Launcher Software Update&#039;&#039; settings will be updated accordingly and hence the myApps base services will ultimately also be updated to the same version.&lt;br /&gt;
&lt;br /&gt;
==== Auto update flow on Windows ====&lt;br /&gt;
&lt;br /&gt;
* On start of myApps, myApps checks if an update is available and ready for installation&lt;br /&gt;
** if yes, the update is installed directly, without user interaction (a popup is shown during the installation)&lt;br /&gt;
** if not, myApps starts&lt;br /&gt;
* if an update is available while myApps is already running, an update notification will be shown which let&#039;s the user choose to install the update now or later (the notification will then popup again after one hour)&lt;br /&gt;
&lt;br /&gt;
==UI elements ==&lt;br /&gt;
There are a few user interfaces provided by the platform services:&lt;br /&gt;
===tray-icon (Windows only) ===&lt;br /&gt;
::[[Image:myapps-tray.png|myapps-tray.png/|myapps-tray.png/]]&lt;br /&gt;
:Allows to&lt;br /&gt;
:* terminate myApps&lt;br /&gt;
:* toggle the &#039;&#039;autostart&#039;&#039; state&lt;br /&gt;
:* toggle the &#039;&#039;show in task bar&#039;&#039; state&lt;br /&gt;
:* open the trace folder&lt;br /&gt;
:&lt;br /&gt;
=== PBX connect form===&lt;br /&gt;
:: [[Image:myapps-connect.png|myapps-connect.png/|myapps-connect.png/]]&lt;br /&gt;
: Allows the user to specify the connect data for the PBX (i.e. IP address or DNS name)&lt;br /&gt;
:&lt;br /&gt;
=== Advanced settings===&lt;br /&gt;
::[[Image:myapps-settings0.png|myapps-settings0.png/|myapps-settings0.png/]]&lt;br /&gt;
::[[Image:myapps-settings.png|myapps-settings.png/|myapps-settings.png/]] [[Image:myapps-settings2.png|myapps-settings2.png/|myapps-settings2.png/]] [[Image:myapps-settings3.png|myapps-settings3.png/|myapps-settings3.png/]]&lt;br /&gt;
&lt;br /&gt;
: Allows to modify various platform dependant settings (such as e.g. the hotkey selection on Windows)&lt;br /&gt;
&lt;br /&gt;
== Interfaces ==&lt;br /&gt;
=== Provided APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm com.innovaphone.search] : access to local phone book entries by the [[#Local phonebook access|Local phonebook access]] component.&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.launcher/com.innovaphone.launcher.htm com.innovaphone.launcher] : display of OS specific user notifications and receipt of related user actions&lt;br /&gt;
; com.innovaphone.notificationhandler : reports back click on a notification.&lt;br /&gt;
; com.innovaphone.externalapps : to start external applications, see [[#Call an external application for calls|Call an external application for calls]]  above&lt;br /&gt;
&lt;br /&gt;
=== Used APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm com.innovaphone.phone] : used to initiate new or manipulate existing calls by the [[#Hot keys|Hot keys]] and [[#URL handler|URL handler]] components.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm com.innovaphone.chat] : used to start a new chat by the [[#URL handler|URL handler]] component.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client] : the model is used to learn the update settings, see [[#Auto update|Auto update]] above&lt;br /&gt;
&lt;br /&gt;
=== Protocols ===&lt;br /&gt;
&lt;br /&gt;
; [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol] : used by apps to allocate RTP channels, see [[#RTP service for audio.2C video and data|RTP service for audio, video and data]] above&lt;br /&gt;
&lt;br /&gt;
== Related App Services ==&lt;br /&gt;
&lt;br /&gt;
none&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
; Incoming call as banner on myApps for iOS : Since iOS 14 the iOS CallKit presents incoming calls as a banner leaving the original green answer button of myApps visible. Use only the blue button of the banner to accept the call or change iPhone Settings, App &amp;quot;Phone&amp;quot;, &amp;quot;Incoming Calls&amp;quot; to &amp;quot;Full Screen&amp;quot; to hide the myApps user interface again during call answering.&lt;br /&gt;
&lt;br /&gt;
; Call answer in speakerphone mode even with active Bluetooth headset on myApps for iOS : This causes unwanted speakerphone operation if the smartphone is used with a Bluetooth car audio system. The behaviour can be changed by selecting &#039;&#039;Bluetooth Headset&#039;&#039; in this setting:&lt;br /&gt;
:&#039;&#039;iOS Settings-&amp;gt;Accessibility-&amp;gt;Touch-&amp;gt;Call Audio Routing: Automatic / Bluetooth Headset / Speaker&#039;&#039;&lt;br /&gt;
:&#039;&#039;iOS Einstellungen-&amp;gt;Bedienungshilfen-&amp;gt;Tippen-&amp;gt;Anrufaudioausgabe: Automatisch / Bluetooth-Headset / Lautsprecher&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Windows Server 2016 (Windows 10 Build 1607) : windows just shows the first notification. Further notifications aren&#039;t displayed until the previous ones are removed from the notification center. Current windows builds do not show this behaviour anymore.&lt;br /&gt;
&lt;br /&gt;
; Problems on Mac computers with Yealink USB headsets&lt;br /&gt;
: we have received reports that myApps quits unexpectedly on some Mac computers when a Yealink headset is plugged in.  Unfortunately, we could not find out the cause yet.  If you use Yealink USB headsets and have a similar issue, please open a support ticket and send myApps traces.&lt;br /&gt;
&lt;br /&gt;
; Poly / Plantronics headset buttons only functional if myApps is started with Rosetta&lt;br /&gt;
: myApps macOS supports Apple M1/M2 hardware natively. However, the Poly / Plantronics headset SDK is only available for Intel platform and thus myApps needs to be started via Apple&#039;s Intel emulator Rosetta if a Poly / Plantronics headset is used. This is done with right-click on the myApps executable, &#039;&#039;Information&#039;&#039;, &#039;&#039;Open with Rosetta&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Windows surface devices may not work correctly&lt;br /&gt;
: Chromium does not get touch keyboard events. USB Keyboards may not be recognized either.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Windows using the .msi file found in the &#039;&#039;myApps Windows&#039;&#039; package from [https://store.innovaphone.com/release/download.htm store.innovaphone.com].&lt;br /&gt;
&lt;br /&gt;
myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
=== MSI Parameters and install options ===&lt;br /&gt;
&lt;br /&gt;
The MSI installer of myApps for Windows supports the following parameters and can be edited with [https://docs.microsoft.com/en-us/windows/win32/msi/orca-exe Microsoft Orca]. You can add your parameters in the table &#039;&#039;property&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; SERVER (REG_SZ): the PBX&#039;s server address (without protocol like https://)&lt;br /&gt;
; OFFICEPRESENCE (REG_DWORD): &#039;&#039;&#039;false&#039;&#039;&#039; to disable presence integration in Microsoft Office&lt;br /&gt;
: this is also available as a check-mark when running the install manually&lt;br /&gt;
&lt;br /&gt;
; DISABLEHEADSETS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable headsets support, see [[#Device handling|Device handling]] above&lt;br /&gt;
&lt;br /&gt;
; EXTERNALAPPS (REG_SZ): pre-define external applications, see [[#Call an external application for calls|Call an external application for calls]] above&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;&amp;quot;{&amp;quot;&amp;quot;externalApps&amp;quot;&amp;quot;:[{&amp;quot;&amp;quot;id&amp;quot;&amp;quot;:0,&amp;quot;&amp;quot;name&amp;quot;&amp;quot;:&amp;quot;&amp;quot;Wireshark&amp;quot;&amp;quot;,&amp;quot;&amp;quot;path&amp;quot;&amp;quot;:&amp;quot;&amp;quot;C:\\Program Files\\Wireshark\\Wireshark.exe&amp;quot;&amp;quot;,&amp;quot;&amp;quot;param&amp;quot;&amp;quot;:&amp;quot;&amp;quot;test $I&amp;quot;&amp;quot;}]}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FORCERESTART (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; (or any string ...) kills myApps during the installation and restarts it for the currently logged in user, if it was running&lt;br /&gt;
&lt;br /&gt;
; DISABLELOCALHOST (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable use of &#039;&#039;&#039;localhost&#039;&#039;&#039; string to access the local webserver. Use &#039;&#039;&#039;127.0.0.1&#039;&#039;&#039; instead&lt;br /&gt;
&lt;br /&gt;
; EXCLUDEINTERFACES (REG_SZ): some VPN interfaces are not detected by Windows as IF_TYPE_PPP or IF_TYPE_TUNNEL and therefore the &#039;&#039;&#039;media outside VPN&#039;&#039;&#039; setting is not taking effect. With this option interfaces can be pre-defined that will not be used for media. Interfaces must be comma separated&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;EXCLUDEINTERFACES=&amp;quot;172,192.168,10.10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FASTERDOWNLOADS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to have faster downloads without artificially slowing down the download of an update (which is done to avoid audio lags if clients have slow networks).&lt;br /&gt;
&lt;br /&gt;
Current settings are stored in the registry at &amp;lt;code&amp;gt;Computer\HKEY_CURRENT_USER\Software\innovaphone\myApps&amp;lt;/code&amp;gt; or at &amp;lt;code&amp;gt;Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\innovaphone\myApps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Boolean values like OfficePresence are stored in registry entries with type REG_DWORD and values 1 or 0. 0 disables the setting and 1 enables it.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on iOS by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;App Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== macOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services might be installed directly from the Apple store. An installer package &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; and a disk image &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; is also available from the innovaphone app store. Install &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; by double-click on the file and follow the instructions of the installer. myApps becomes available in the Applications folder and can be opened by double-click. Or download and open &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; and double klick myApps. If desired integrate it into the app dock by right click, &#039;&#039;Options, Keep in the dock&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If installed from the innovaphone app store, myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
If installed from the Apple store, macOS notifies about updates on the Apple store. myApps [[#Auto update|Auto update]] is disabled then.&lt;br /&gt;
&lt;br /&gt;
If a clean-install of the client is necessary, the folder &amp;quot;/Users/username/Library/Containers/myapps&amp;quot; needs to be deleted. To be on the safe side also delete it from the trash bin.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Preferences ===&lt;br /&gt;
&lt;br /&gt;
macOS supports preference settings that can be set via a shell command or via Mac remote management&lt;br /&gt;
&lt;br /&gt;
 defaults write com.innovaphone.client-ios-14r1 server &amp;quot;PBX-server-URL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following parameters and can be set through this method:&lt;br /&gt;
&lt;br /&gt;
; server: the PBX&#039;s server URL&lt;br /&gt;
&lt;br /&gt;
=== Setting myApps as Default App for SIP-URLs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add &#039;{&lt;br /&gt;
   LSHandlerURLScheme = sip;&lt;br /&gt;
   LSHandlerRoleAll = &amp;quot;&amp;lt;CFBundleIdentifier&amp;gt;&amp;quot;;&lt;br /&gt;
}&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To find the “CFBundleIdentifier”, proceed as follows:&lt;br /&gt;
* In the Finder under “Applications”, search for the desired myApps client that you want to set as the default app.&lt;br /&gt;
* Right-click on “Show package contents” -&amp;gt; you will find the “CFBundleIdentifier” in the Info.plist file.&lt;br /&gt;
&lt;br /&gt;
A restart of the MAC is required.&lt;br /&gt;
&lt;br /&gt;
=== Using Sennheiser headsets ===&lt;br /&gt;
If you use Sennheiser headsets, you should also install the then-current &amp;lt;code&amp;gt;DSEA_SDK_v&amp;lt;/code&amp;gt;&#039;&#039;version&#039;&#039;&amp;lt;code&amp;gt;.pkg&amp;lt;/code&amp;gt; package, after you installed the myApps client.  Without that, audio will still work, but not the controls on the headset.  You will need to keep that up-to-date yourself, as it is not updated by myApps&#039;s auto-update function.&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Android by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;Play Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying a property &amp;quot;server&amp;quot; with string value &amp;quot;pbx.example.com&amp;quot; in the MDM.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
When opening myApps for the first time, the user is prompted for the Server. Usually only the hostname (DNS host name or IP address) needs to be configured.&lt;br /&gt;
&lt;br /&gt;
But there are more options for special PBX configurations.&lt;br /&gt;
&lt;br /&gt;
; Non-standard HTTPS port&lt;br /&gt;
: If the PBX uses a non-standard HTTPS port, it must be appended to the host name separated by a colon (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com:4444&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com:4444/PBX0/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; DynPBX module name&lt;br /&gt;
: If the PBX is a DynPBX, the module id must be appended to PBX0 separated - (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com/PBX0-1&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0-1/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; Softphone physical location&lt;br /&gt;
: If user defined physical location shall be used for softphone, you can append it using a parameter &amp;lt;code&amp;gt;#phys=&amp;lt;/code&amp;gt;.&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com#phys=slave&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0/APPCLIENT/appclient.htm#phys=slave&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Example 1: PBX pbx.example.com with standard configuration&lt;br /&gt;
 pbx.example.com&lt;br /&gt;
&lt;br /&gt;
Example 2: PBX slave.example with DynPBX module ID 1, HTTPS port 4444 and physical location master&lt;br /&gt;
 slave.example.com:4444/PBX0-1#phys=master&lt;br /&gt;
&lt;br /&gt;
=== HTTP proxy support ===&lt;br /&gt;
&lt;br /&gt;
myApps platform services do support operation via HTTP proxy now. If one or more proxies have been configured in the network settings of the operating system for the active network connection, HTTP CONNECT tunnels are established.&lt;br /&gt;
&lt;br /&gt;
On Windows user name and password can be specified for the tunnel servers as generic credentials in the credentials manager (Anmeldeinformationsverwaltung). The name of the credentials must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
On Android user name and password can be specified through Android &#039;&#039;Settings, Accounts&#039;&#039; by adding a myApps &#039;&#039;HTTP Proxy Credentials&#039;&#039; account. The name of the account must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
== Platform specific settings ==&lt;br /&gt;
When myApps runs under the myApps platform services, it will show various platform specific settings as part of its &#039;&#039;burger menu&#039;&#039;, so the user can set them.  See &#039;&#039;Advanced settings&#039;&#039; in [[#UI elements|UI elements]] above.&lt;br /&gt;
&lt;br /&gt;
Some options can also be set globally for all myApps clients in the PBX&#039;s [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps &#039;&#039;Client Settings&#039;&#039;]]&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Option&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Where to set&lt;br /&gt;
&lt;br /&gt;
!&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || User menu || PBX &#039;&#039;Client Settings&#039;&#039; || Windows || iOS || Android || macOS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Autostart || Launch myApps on login || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Appear offline after || controls after which idle time a user is considered &#039;&#039;inactive&#039;&#039;. See [[#User activity|User activity]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Hotkeys || Hotkeys for call dial, accept, reject. See [[#Hot keys|Hot keys]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Docking || Docking mode (left, right, none). See [[#???|??]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Desktop notifications|| Turn on/off platform notifications. See [[#Notifications|  Notifications]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| VPN || Disable VPN address for ICE candidate selection. See [[#RTP ports| RTP ports]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Show in taskbar|| Show myApps in the taskbar in addition to it&#039;s tray icon.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Log flags || turn on/off certain trace levels. See [[#Troubleshooting|Troubleshooting]] below.  || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| External applications || define the applications available for Apps to be started. See [[#Call an external application for calls|Call an external application for calls]] above.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Ring in headset || send ring tone for incoming to headset instead of loudspeaker.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|}&lt;br /&gt;
== Start parameters for Windows ==&lt;br /&gt;
&lt;br /&gt;
On Windows, it is not possible to pass start parameters from the [https://www.chromium.org/developers Chromium documentation] to the myApps process.&lt;br /&gt;
&lt;br /&gt;
== OS Settings for Windows ==&lt;br /&gt;
Windows settings can influence the display of &#039;&#039;Desktop notifications&#039;&#039;. See [https://support.microsoft.com/en-us/help/4028678/windows-10-change-notification-settings Change notification settings in Windows 10/11] for details.&lt;br /&gt;
&lt;br /&gt;
=== Windows 11 ===&lt;br /&gt;
&lt;br /&gt;
* Windows 11 has a feature &amp;quot;do not disturb&amp;quot;. This hides notifications if enabled.&lt;br /&gt;
* Windows 11 has a feature &amp;quot;focus&amp;quot;. This enables &amp;quot;do not disturb&amp;quot; and thus hides notifications too.&lt;br /&gt;
* Windows 11 has priority settings for notifications. Ensure that VoIP notifications for calls are allowed any maybe also include myApps as an App which is allowed to show notifications.&lt;br /&gt;
&lt;br /&gt;
== OS settings for Android ==&lt;br /&gt;
; Events : The appearance of notifications can be controlled here.&lt;br /&gt;
&lt;br /&gt;
; Call accounts : For proper incoming call signaling, the call account &#039;&#039;myApps&#039;&#039; needs to be enabled. Note that on Samsung smartphones the call account switch likely toggles back and a few tries may need to be done until it persists. Please double-check the state.&lt;br /&gt;
&lt;br /&gt;
; Preferred Calling Account : Choose which calling account (myApps/SIM/..) should be used for outgoing calls initiated from within the native phone app / phone book.&lt;br /&gt;
&lt;br /&gt;
; Background data, unlimited data usage : Grant background data use to enable &#039;&#039;myApps&#039;&#039; to connect to the PBX immediately on an incoming call.&lt;br /&gt;
&lt;br /&gt;
; Overlaying : This setting is not needed if call account &#039;&#039;myApps&#039;&#039; has been enabled. Should there be a reason for not enabling call account &#039;&#039;myApps&#039;&#039;, the permission for overlaying needs to be granted on Android 10 or higher for proper call signaling.&lt;br /&gt;
&lt;br /&gt;
Note: If no SIM card is installed some Android smartphones exhibit a problem dialing from the smartphone contacts. The contacts app shows a choice &#039;&#039;Select SIM card for this call&#039;&#039; but all possible dialers are greyed out. In this case make myApps the default phone app in Android settings &#039;&#039;Apps, Default apps, Telephony&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for iOS ==&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in iOS &#039;&#039;Settings, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for macOS ==&lt;br /&gt;
&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in macOS &#039;&#039;Preferences, Notifications, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
myApps platform services can write various traces for debugging.  Trace can be turned on and off selectively in the [[#Advanced settings|Advanced settings]].&lt;br /&gt;
&lt;br /&gt;
The following trace flags can be set:&lt;br /&gt;
&lt;br /&gt;
(&#039;&#039;Recommended trace options are: &#039;&#039;&#039;App, Browser, ICE, TURN, Signaling and Audio&#039;&#039;&#039;. Please do not activate other flags unless innovaphone support says otherwise&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |  Abbreviation&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |code&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| App||0x000000001|| logs from the App Service itself&lt;br /&gt;
|-&lt;br /&gt;
| DNS||0x000000008|| logs DNS requests and results&lt;br /&gt;
|-&lt;br /&gt;
| HTTP client||0x000000080|| http client logs&lt;br /&gt;
|-&lt;br /&gt;
| TLS||0x000000400|| TLS logs&lt;br /&gt;
|-&lt;br /&gt;
| TCP||0x000000800|| TCP logs&lt;br /&gt;
|-&lt;br /&gt;
| LDS||0x000001000|| local domain sockets&lt;br /&gt;
|-&lt;br /&gt;
| WebSocket client||0x000004000|| logs outgoing websocket connections&lt;br /&gt;
|-&lt;br /&gt;
| App WebSocket||0x000008000|| logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
|-&lt;br /&gt;
| UDP||0x000200000|| UDP logs&lt;br /&gt;
|-&lt;br /&gt;
| DTLS||0x000400000|| logs DTLS handshake and messages&lt;br /&gt;
|-&lt;br /&gt;
| Media||0x000800000|| logs media events&lt;br /&gt;
|-&lt;br /&gt;
| Media channel||0x001000000|| logs RTP/SCTP media connections&lt;br /&gt;
|-&lt;br /&gt;
| ICE||0x002000000|| logs ICE messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| TURN||0x004000000|| logs TURN messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| AppSharing||0x008000000|| logs AppSharing connection&lt;br /&gt;
|-&lt;br /&gt;
| Audio||0x010000000|| logs Audio connection and headset events&lt;br /&gt;
|-&lt;br /&gt;
| Video||0x020000000|| logs video connection and webcam events&lt;br /&gt;
|-&lt;br /&gt;
| Browser||0x040000000|| logs Chromium events&lt;br /&gt;
|-&lt;br /&gt;
| AppProxy||0x080000000|| logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
|-&lt;br /&gt;
| Webserver ||0x200000000|| enables webserver specific logs&lt;br /&gt;
|-&lt;br /&gt;
| Browser Console ||0x400000000|| logs browser console events&lt;br /&gt;
|-&lt;br /&gt;
| Signaling||0x800000000|| enables logs in the signaling module for debugging calls&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;code&#039;&#039; can be or&#039;ed and used as value for the &#039;&#039;Log flags&#039;&#039; field in [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps/Client Settings]].&lt;br /&gt;
&lt;br /&gt;
; Windows :On Windows, traces are written to the &amp;lt;code&amp;gt;%LOCALAPPDATA%\innovaphone\myApps&amp;lt;/code&amp;gt; directory. If you start myApps with --log-size as parameter, you can define the maximum size of a log file (e.g. --log-size=100000000 would be 100MB for each file)&lt;br /&gt;
&lt;br /&gt;
:* myApps-&#039;&#039;date-time&#039;&#039;.txt : main log file for the platform services&lt;br /&gt;
&lt;br /&gt;
:* myAppsOutlookSearch-&#039;&#039;date-time&#039;&#039;.txt : log file for the Outlook phone book access&lt;br /&gt;
&lt;br /&gt;
:* myAppsHookController-&#039;&#039;date-time&#039;&#039;.txt : log file for the hot-key interceptor (see [[#Hot keys|Hot keys]])&lt;br /&gt;
&lt;br /&gt;
; :myApps update installation traces are written to the &amp;lt;code&amp;gt;%windir%\temp\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsInstall.txt: MSI installation file&lt;br /&gt;
&lt;br /&gt;
; :myApps update service traces are written to the &amp;lt;code&amp;gt;%ProgramData%\innovaphone\myAppsUpdateService&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsUpdateService-&#039;&#039;date-time&#039;&#039;.txt: myApps update service traces&lt;br /&gt;
&lt;br /&gt;
;Android : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
: also, an Android device might also be connected to a PC via an USB cable to get the traces. The files can be found in &amp;lt;code&amp;gt;Android/data/com.innovaphone.clientandroid/files&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
; macOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
: also, the files can be found in &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-ios/Data/Documents/&amp;lt;/code&amp;gt;. Press &#039;&#039;Alt+N&#039;&#039; followed by space to get tilde &#039;&#039;~&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Known Problems =&lt;br /&gt;
[[:Category:Problem myApps platform services|Known Problems]]&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Redundancy|Reference14r2:Concept_myApps_Redundancy]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Office_Integration|Reference14r2:Concept_myApps_Office_Integration]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myAPPs_Search_in_local-Outlook_Contacts|Reference14r2:Concept_myAPPs_Search_in_local-Outlook_Contacts]]&lt;br /&gt;
* [[{{NAMESPACE}}:Call_Detail_Record_CDR_PBX|Reference14r2:Call_Detail_Record_CDR_PBX]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept Push Notifications for myPBX iOS and Android|Reference14r2:Concept Push Notifications for myPBX iOS and Android]]&lt;br /&gt;
* [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept myApps platform services]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_myApps_platform_services&amp;diff=79524</id>
		<title>Reference14r2:Concept myApps platform services</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_myApps_platform_services&amp;diff=79524"/>
		<updated>2026-04-21T09:01:47Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Device handling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|myApps]]&lt;br /&gt;
&lt;br /&gt;
myApps platform services provide various operating system specific services which can be used by other &#039;&#039;Apps&#039;&#039; running in the [[{{NAMESPACE}}:Concept myApps|myApps client]]. Those services typically are not available in the browser&#039;s JavaScript environment and hence must be implemented in native platform code. Therefore, the platform services are installed as native executable on the respective platform.&lt;br /&gt;
&lt;br /&gt;
When myApps is started in a web browser (and hence has no access to the platform services), some Apps will use [https://en.wikipedia.org/wiki/WebRTC WebRTC] services implemented by the browser instead.  For ease of reference, features available in this scenario are also described here.&lt;br /&gt;
&lt;br /&gt;
On windows, the platform services also come with their own web browser in which the myApps web App will be started then.  This browser is based on google&#039;s [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium] open source software.&lt;br /&gt;
= Applies To =&lt;br /&gt;
&lt;br /&gt;
* [[{{NAMESPACE}}:Concept myApps|myApps]]&lt;br /&gt;
* myApps for Windows&lt;br /&gt;
* myApps for macOS&lt;br /&gt;
* myApps for iOS&lt;br /&gt;
* myApps for Android&lt;br /&gt;
&lt;br /&gt;
* myApps Web App (WebRTC)&lt;br /&gt;
version 14r2&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
Not all features are available or required on all platforms.&lt;br /&gt;
 {|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Feature&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || Windows || iOS || Android || macOS || Browser&amp;lt;ref&amp;gt;This refers to the myApps web application running in a browser with no platform services available&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| audio || manage local audio devices to record and playback audio conversations || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (audio available but devices managed by web browser)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| video || manage local displays and cameras to capture and render video live stream || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (video available but devices managed by web browser)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| ringer || manage local ringing device || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| application sharing&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;amp;nbsp; presenter || share an application || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;amp;nbsp; consumer  || view an application shared by the peer || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| hot keys || capture key presses for quick invocation of phone apps (e.g. dial selected number) || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| tel: and sip: URI handler || intercept clicks on tel: and sip: links in web sites to invoke phone apps || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| user activity || set presence state according to user activity ||  &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;limited, see [[#User activity|User activity]] below&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| docking || myApps can be docked persistently to the right or left edge of your screens ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| multi-windowing|| Apps can be launched in separate windows||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| recording|| Calls can be recorded to recording app||  &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| notifications || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; display notifications || display notifications with OS standard mechanism ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; push notifications || receive push notifications while myApps is not running  ||  &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The browser needs to be running in order to receive push notifications.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; chat and apps || display notifications for chat and other apps  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; calls || display notifications for incoming calls  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&amp;lt;ref&amp;gt;Call notifications are only displayed locally while the phone or softphone app is started.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| phone book access || access local phone book ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| office presence provider || maps PBX presence state to Microsoft office presence state ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| external application start || start arbitrary external applications for calls || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| app proxy|| a caching proxy that provides app persistence  || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| auto update || automatically updates myApps platform services to the same version the PBX has || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The then-current web app is always loaded from the PBX upon startup and hence up-to-date by definition&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| three party conference || initiate 3-pty-conference using Softphone-App || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| exclude VPN || disable use of VPN connections for audio/video/appsharing || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
* innovaphone PBX 14r2 and up&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Recommended hardware requirements&lt;br /&gt;
* Processor: Dual-core 2Ghz or higher&lt;br /&gt;
* RAM: 4 Gb&lt;br /&gt;
&lt;br /&gt;
== myApps for Windows ==&lt;br /&gt;
* Windows 10 and up&lt;br /&gt;
* Windows Server 2016 and later versions&lt;br /&gt;
&lt;br /&gt;
=== 32 &amp;amp; 64 bit Windows ===&lt;br /&gt;
* 32 bit Windows: install the myAppsSetup32.msi from the App Store&lt;br /&gt;
* 64 bit Windows: install the myAppsSetup.msi from the App Store&lt;br /&gt;
** the 64 bit variant still installs into Program Files (x86), as the main myApps.exe is still a 32bit application&lt;br /&gt;
** the 64 bit variant just contains an additional 64 bit binary for the outlook search&lt;br /&gt;
&lt;br /&gt;
=== Windows N editions ===&lt;br /&gt;
&lt;br /&gt;
Windows N editions are missing the &#039;&#039;Media Feature Pack&#039;&#039; which is pre installed on other Windows versions.&lt;br /&gt;
&lt;br /&gt;
Please install the pack from [https://www.microsoft.com/en-us/software-download/mediafeaturepack Microsoft (Windows 10 pack)] before you install myApps. The installer will check if the file &amp;lt;code&amp;gt;C:\Windows\SysWOW64\mfplat.dll&amp;lt;/code&amp;gt; exist on your system.&lt;br /&gt;
&lt;br /&gt;
Make sure to install the correct pack depending on your Windows version! There are different packs for Windows 10 1703, 1803, 1809 and 32bit or 64bit etc.&lt;br /&gt;
&lt;br /&gt;
NB: Sometimes the myApps installation will not work even though the media pack is already installed. This is because the installer has no read access to check if the package is already installed. If the above-mentioned file exists and the installer asks to install the Windows Media Feature Pack nevertheless, you have to start the myApps install with administrative rights.&lt;br /&gt;
&lt;br /&gt;
=== Terminal Server environments ===&lt;br /&gt;
&lt;br /&gt;
Audio driver was removed if myApps discovers that it is running in a terminal server environment like Citrix.&lt;br /&gt;
&lt;br /&gt;
The audio driver is needed for the Softphone App but the Softphone App should not use an audio driver at the server side because the audio devices are plugged locally and there would be a delay sending and receiving audio data with the server.&lt;br /&gt;
&lt;br /&gt;
If a customer wants to use the Softphone App at the server side he needs to make use of the myApps Plugin for virtual desktops solution:&lt;br /&gt;
&lt;br /&gt;
[[{{NAMESPACE}}:MyApps_Plugin_for_Virtual_Desktops]]&lt;br /&gt;
&lt;br /&gt;
== myApps for macOS ==&lt;br /&gt;
* macOS 10.13 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for iOS ==&lt;br /&gt;
* iOS 13 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for Android ==&lt;br /&gt;
* Android 6.0 or higher. Android 6.x may need an update of the Chrome browser.&lt;br /&gt;
&lt;br /&gt;
= Licenses =&lt;br /&gt;
* No license needed for myApps platform services&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
myApps platform services is a native executable that is installed using the standard mechanisms on the respective operating system. It provides various advanced services which can be used by the myApps web client code as well as the Apps running in the myApps context. &lt;br /&gt;
&lt;br /&gt;
Also, on Windows, the platform services come with their own, dedicated browser to run myApps in.  This browser is based on [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium].  On iOS, macOS and Android, it is based upon native embedded web view facilities (such as WKWebView) instead.&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
=== RTP service for audio, video and data ===&lt;br /&gt;
The RTP service provides audio, video and data (app sharing) VoIP RTP endpoints (e.g. for softphones).  It supports STUN, TURN, ICE, SRTP, DTLS. Note however that unlike WebRTC, these endpoints do not &#039;&#039;require&#039;&#039; ICE and DTLS. In other words, they can communicate also with non-compliant (i.e. older) VoIP devices.&lt;br /&gt;
&lt;br /&gt;
Note that the available capabilities when not running the myApps platform services depend on the used browser&#039;s WebRTC implementation. See your browser documentation for details.&lt;br /&gt;
&lt;br /&gt;
Apps can request RTP channels using the [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol]&#039;s &#039;&#039;AllocChannel&#039;&#039; message.&lt;br /&gt;
&lt;br /&gt;
===== RTP ports=====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|  audio || 50000 -&amp;gt; 50099&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| video || 50100 -&amp;gt; 50199&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| data || 50200 -&amp;gt; 50299&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The RTP service will enumerate all local interfaces and create local HOST candidates for ICE.  There is an option however to disregard VPN interfaces (more precisely such interfaces with type of &#039;&#039;IF_TYPE_PPP&#039;&#039; or &#039;&#039;IF_TYPE_TUNNEL&#039;&#039;).  This can eliminate quality issues when RTP data is transmitted through TCP based VPN tunnels.&lt;br /&gt;
&lt;br /&gt;
SRFLX and RELAY candidates are obtained using the STUN and TURN server configuration passed by the App (e.g the &#039;&#039;softphone&#039;&#039; App) as part of the &#039;&#039;AllocChannel&#039;&#039; request.&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;AllocChannel&amp;quot;,&amp;quot;channel&amp;quot;:&amp;quot;81429cba-396d-43de-8a76-ec020ba8796e&amp;quot;,&amp;quot;iceServers&amp;quot;:[{&amp;quot;urls&amp;quot;:&amp;quot;turn:myturn.domaincom:4077?transport=udp&amp;quot;,&amp;quot;username&amp;quot;:&amp;quot;turnuser&amp;quot;,&amp;quot;credential&amp;quot;:&amp;quot;pwd&amp;quot;,&amp;quot;credentialType&amp;quot;:&amp;quot;password&amp;quot;},{&amp;quot;urls&amp;quot;:&amp;quot;stun:mystun.domain.com:4077&amp;quot;}],&amp;quot;dn&amp;quot;:&amp;quot;Foo Bar&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;RemoteRtp&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;video&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Codecs =====&lt;br /&gt;
&lt;br /&gt;
The installed myApps launchers provide codecs that can be used by softphone apps for media streams. When running in a web browser the codecs depend on the browser version and operating system. See the documentation of your browser for details.&lt;br /&gt;
&lt;br /&gt;
The following codecs are supported:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align:left;width:100px;&amp;quot;|Codec&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Windows-Launcher&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Android&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|iOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|macOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Firefox (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Chrome (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Edge (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Safari (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Opera (Browser)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Audio&lt;br /&gt;
|-&lt;br /&gt;
|G711A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G711u&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G722&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G729&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729B&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729AB&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-NB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-WB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Video&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP8 VP8]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP9 VP9]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=H264 H264]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Application Sharing&lt;br /&gt;
|-&lt;br /&gt;
|Share&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|Watch&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;* small presentation only&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;** only for 1:1 calls, not for conferences&lt;br /&gt;
&lt;br /&gt;
===== Video capture =====&lt;br /&gt;
&lt;br /&gt;
The default resolution for video capture is 1280x720 if available.  Otherwise, 640x480, 352x288 or 320x240 will be used.  The frame rate is 30 fps if available, otherwise 15 fps. The resulting average bandwidth could reach 1 Mbps.&lt;br /&gt;
&lt;br /&gt;
===== Application sharing =====&lt;br /&gt;
&lt;br /&gt;
Screen content will be transmitted by the presenter.&lt;br /&gt;
&lt;br /&gt;
===== Device handling =====&lt;br /&gt;
&lt;br /&gt;
The RTP service enumerates microphones, loudspeaker, cameras and ringing devices and notifies apps when devices come and go. It is up to the apps using the devices to store preferences.&lt;br /&gt;
&lt;br /&gt;
The RTP service also enables some extended features (such as hook switch or volume control) for supported USB headsets or Bluetooth headsets connected to myApps.&lt;br /&gt;
The supported headset-SDKs determine which headset vendors are recommended to be used with the myApps softphone app. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this to work, the following vendor specific development kits are integrated in our myApps client. Be aware that the SDK are updated within our Service release :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SDK Vendor !! Supported OS !! SDK Version !! innovaphone Service Release&lt;br /&gt;
|-&lt;br /&gt;
| Jabra|| MacOS || 1.16.4.0 || 14r2sr11&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 1.16.4.0 || 15r1sr3&lt;br /&gt;
|-&lt;br /&gt;
| Epos &#039;&#039;(formerly Sennheiser)&#039;&#039; || MacOS || 12.4.0.5478 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || n.a. - [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|to be installed separately]]|| 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Poly &#039;&#039;(formerly Plantronics)&#039;&#039; || MacOS || 3.25.53799.37131 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.25.53800.37131 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Yealink || MacOS || 3.1.1.23 || 14r2sr1&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.1.1.23 || 14r2sr2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* It is possible to inhibit the start of the Sennheiser SDK (SenncomSDK.exe) using the &amp;lt;code&amp;gt;DISABLEHEADSETS&amp;lt;/code&amp;gt; directive of the installer (see [[#MSI Parameters and install options|  MSI parameters]]  below).&lt;br /&gt;
&lt;br /&gt;
* Starting with V13r3sr10, the Epos-SDK needs to be installed separately using the Epos Connect software to ensure full compatibility between current Epos headset models and native myApps-Windows client. For details [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|refer to this article]].&lt;br /&gt;
&amp;lt;!--Keywords: myapps softphone supported headsets sdk--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Ring tones =====&lt;br /&gt;
&lt;br /&gt;
Ring tones can be played. Apps can choose the tone from a pre-defined list of ring tones.&lt;br /&gt;
&lt;br /&gt;
On Windows, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;ringtones&amp;lt;/code&amp;gt; sub-directory of myApps&#039; roaming directory (which usually is in &amp;lt;code&amp;gt;C:\Users\...\AppData\Roaming\innovaphone\myApps\ringtones&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
On Android, custom ring tones can be added to the system via Android settings.&lt;br /&gt;
&lt;br /&gt;
On iOS, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;Ringtones&amp;lt;/code&amp;gt; subdirectory of the myApps file share that is available in iTunes if the iPhone has been connected via USB.&lt;br /&gt;
&lt;br /&gt;
On macOS, custom ring tones can be uploaded as .mp3 files to &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-macos/Data/Documents/Ringtones&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Debugging =====&lt;br /&gt;
For extended debugging, turn on the &#039;&#039;Audio&#039;&#039;, &#039;&#039;Media&#039;&#039; and &#039;&#039;AppSharing&#039;&#039; traces in myApps.&lt;br /&gt;
&lt;br /&gt;
=== Hot keys ===&lt;br /&gt;
On Windows and macOS systems, myApps platform services can listen for hot keys and invoke certain functions. Invocation is done by sending API messages to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
The hot keys can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below. Any of the function keys F1 to F11 (optionally combined with up to two modifier keys &#039;&#039;alt&#039;&#039;, &#039;&#039;ctrl&#039;&#039;, &#039;&#039;shift&#039;&#039; or &#039;&#039;win&#039;&#039;) can be chosen for each function. If you do not want to start the call with &amp;quot;Hotkey+Enter&amp;quot; because you would have to wait for the focus, the hotkey can also be pressed twice and the number is dialled directly.&lt;br /&gt;
&lt;br /&gt;
; dial selected number : Initiates a call using the currently selected text as target.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;text&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;mt&amp;quot;:&amp;quot;PrepareCall&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;13&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; accept call : Accepts a currently alerting call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;ConnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;ConnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; reject/disconnect call : Rejects a currently alerting call or disconnects an active call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;DisconnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;DisconnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== URL Handler ===&lt;br /&gt;
&lt;br /&gt;
On Windows systems, two URI-handler are installed with the myApps platform services.  Windows will call up this URI handler when a user clicks on an appropriate link, for example in a web site.&lt;br /&gt;
&lt;br /&gt;
The handler will the send an API message to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
; tel URI : call a number, e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;num&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;num&amp;quot;:&amp;quot;4711&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; sip URI : call a SIP name, e.g. &amp;lt;code&amp;gt;sip:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; im URI : start chat with SIP name, e.g. &amp;lt;code&amp;gt;im:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;StartChat&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm &#039;&#039;com.innovaphone.chat&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.chat&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartChat&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On macOS systems myApps might be made the default application to handle tel URI e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt; via Apple FaceTime. Open the &amp;quot;FaceTime&amp;quot; menu &amp;quot;Settings...&amp;quot; and select myApps as &amp;quot;Default for phone calls&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On iOS &#039;&#039;tel&#039;&#039; URIs are always dialed via GSM. Therefore myApps iOS also reacts to URI schemes &#039;&#039;com.innovaphone.tel&#039;&#039;, &#039;&#039;com.innovaphone.sip&#039;&#039; and &#039;&#039;com.innovaphone.im&#039;&#039;, e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.tel:4711&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.sip:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.im:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== User activity ===&lt;br /&gt;
On Windows and macOS systems, the myApps platform services can monitor user keyboard/mouse activity and change the user&#039;s presence state after a certain amount of inactivity.  The timeout can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below.&lt;br /&gt;
&lt;br /&gt;
myApps will then send a [https://sdk.innovaphone.com/doc/appwebsocket/myApps.htm#SetUserActivity&#039;&#039;SetUserActivity&#039;&#039;] message to the PBX using the &#039;&#039;myApps&#039;&#039; protocol.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;SetUserActivity&amp;quot;,&amp;quot;inactive&amp;quot;:true}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will change the &#039;&#039;status&#039;&#039; property of the &#039;&#039;im:&#039;&#039; contact for the user&#039;s own presence and hence result in a presence update from the PBX to myApps&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;UpdateOwnPresence&amp;quot;,&amp;quot;presence&amp;quot;:[{...},{&amp;quot;contact&amp;quot;:&amp;quot;im:&amp;quot;,&amp;quot;activity&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;closed&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
The &#039;&#039;closed&#039;&#039; status is reflected in the grey status color when displaying a contact [[Image:myapps-inactive.png|myapps-inactive.png/|myapps-inactive.png/]].&lt;br /&gt;
&lt;br /&gt;
On iOS and Android, the state is set to &#039;&#039;inactive&#039;&#039; as soon as the App is brought to background.&lt;br /&gt;
When myApps platform services are not available (i.e. when running the web application in a browser solely) a limited user activity monitoring is available: the state is set to active when the web page is not used for more than 5 minutes.&lt;br /&gt;
&lt;br /&gt;
=== Recording ===&lt;br /&gt;
&lt;br /&gt;
The new launcher offers the possibility to record the audio of incoming and outgoing calls. In order to activate that functionality the URL of the recording instance must be configured in either the PBX (PBX-&amp;gt;myApps-&amp;gt;Config: Recording URL) or the softphone App (Settings-&amp;gt;Audio Recording (URL)) &lt;br /&gt;
&lt;br /&gt;
[[Image:PBX-Recording-Settings.png|pbx-recording-settings.png/|pbx-recording-settings.png/]] [[Image:Recording-Softphone-Settings.png|recording-softphone-settings.png/|recording-softphone-settings.png/]]. &lt;br /&gt;
&lt;br /&gt;
As long as that URL is configured the audio data of all calls are stored as pcap-files under that URL.&lt;br /&gt;
If the URL points to a CF device in the PBX, write access must be granted for that URL (PBX-&amp;gt;Services-&amp;gt;HTTP-&amp;gt;Server:Public compact flash access) and if the URL points to the recording app, the files can be accessed via the recording app [[{{NAMESPACE}}:Concept_App_Service_Recordings|recording]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under PBX-&amp;gt;myApps the administrator can set a certain default behaviour of the audio recording like whether or not the recording should start automatically at the beginning of the call (Recording by Default ON/OFF), only calls with external numbers should be recorded (Record external calls only) or whether or not the user should be able to start/stop the recording himself (Allow user incall recording control). Except for the last parameter these parameters can also be modified by the user in its softphone settings if the administrator doesn&#039;t set the FORCE flag.&lt;br /&gt;
&lt;br /&gt;
If the user was allowed by the admin to control the recording a recording switch is active during the call when the &amp;quot;Media&amp;quot; Panel is opened. There the audio recording may be stopped and continued at will. A red recording notice is shown in the top right corner when the recording actually takes place.&lt;br /&gt;
 &lt;br /&gt;
[[Image:Recording-incall-switch.png|recording-incall-switch.png/|recording-incall-switch.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services can use the OS specific notification mechanism (e.g. &#039;&#039;desktop notifications&#039;&#039; on Windows) to display messages (e.g. &#039;&#039;incoming new chat message&#039;&#039;) to the user.&lt;br /&gt;
&lt;br /&gt;
Note that the actual rendering of the notification is under control of the OS.  Therefore, myApps must be allowed to show notifications and its appearance can be restricted by OS native settings.&lt;br /&gt;
&lt;br /&gt;
==== Microsoft Windows Notifications ====&lt;br /&gt;
&lt;br /&gt;
Microsoft Windows Server editions (2016, 2019, 2022) are just capable of showing a single &#039;&#039;IncomingCall&#039;&#039; notification at the same time (we couldn&#039;t find a workaround for this limitation).&amp;lt;br/&amp;gt;&lt;br /&gt;
An &#039;&#039;IncomingCall&#039;&#039; notification is visible the whole time instead of being moved to the action center after a certain time.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
A notification about a missed call uses the &#039;&#039;IncomingCall&#039;&#039; type so that this notification is visible until the user returns.&amp;lt;br/&amp;gt;&lt;br /&gt;
Due to the above limitation, on a new arriving call such a missed call notification is transformed to a default notification which will be moved to the action center automatically.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On non server editions, you can have multiple IncomingCall notifications at the same time (so two parallel incoming calls will be indeed notified at the same time), but the missed call notification handling is the same on both platforms!&lt;br /&gt;
&lt;br /&gt;
 Thus there will be always just &#039;&#039;&#039;one&#039;&#039;&#039; missed call notification visible and previous missed calls can be found inside your action center!&lt;br /&gt;
&lt;br /&gt;
To see myApps notifications, ensure:&lt;br /&gt;
* System -&amp;gt; Notifications &lt;br /&gt;
** enable notifications&lt;br /&gt;
** disable &amp;quot;Do not disturb&amp;quot; or allow myApps as priority application while &amp;quot;Do not disturb&amp;quot; is active&lt;br /&gt;
** enable notifications for myApps in the list of applications&lt;br /&gt;
* System -&amp;gt; Focus &lt;br /&gt;
** if a focus session is active and the &amp;quot;Do not disturb&amp;quot; is activated during a focus session, make sure that myApps is a priority application (see above)&lt;br /&gt;
&lt;br /&gt;
==== macOS Notifications ====&lt;br /&gt;
Notifications are the same as on Windows.&lt;br /&gt;
The difference is, that for macOS, notifications need to be allowed in the system settings.&lt;br /&gt;
Go to Notifications - myApps, select Banner and enable all check marks.&lt;br /&gt;
&lt;br /&gt;
=== Local phonebook access ===&lt;br /&gt;
&#039;&#039;&#039;Contact Search:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm &#039;&#039;com.innovaphone.search&#039;&#039; API]]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Search&#039;&#039; request to the API:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;Search&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;search&amp;quot;:&amp;quot;john doe&amp;quot;},&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
Search results are delivered as &#039;&#039;SearchInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;SearchInfo&amp;quot;,&amp;quot;relevance&amp;quot;:2000,&amp;quot;adjust&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;contact&amp;quot;:{&amp;quot;givenname&amp;quot;:&amp;quot;John&amp;quot;,&amp;quot;sn&amp;quot;:&amp;quot;Doe&amp;quot;,&amp;quot;company&amp;quot;:&amp;quot;ACME&amp;quot;,&amp;quot;position&amp;quot;:&amp;quot;Head of everything&amp;quot;,&amp;quot;telephonenumber&amp;quot;:[&amp;quot;11111&amp;quot;,&amp;quot;22222&amp;quot;],&amp;quot;homephone&amp;quot;:[&amp;quot;+4944444&amp;quot;,&amp;quot;33333&amp;quot;],&amp;quot;mobile&amp;quot;:[&amp;quot;+49 (123) 55555&amp;quot;]}},&amp;quot;api&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reverse Lookup:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.phonelookup/lib1_api_phonelookup.htm &#039;&#039;com.innovaphone.phonelookup&#039;&#039; API]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Lookup&#039;&#039; request to the API: &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{ mt: &amp;quot;Lookup&amp;quot;, prefixIntl: &amp;quot;000&amp;quot;, prefixNtl: &amp;quot;00&amp;quot;, prefixExt:&amp;quot;0&amp;quot;, area: &amp;quot;7031&amp;quot;, country: &amp;quot;49&amp;quot;, lookup: &amp;quot;0004970311234567&amp;quot; },&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.lookup&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search results are delivered as &#039;&#039;LookupInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{mt: &amp;quot;LookupInfo&amp;quot;, dn: &amp;quot;Jake Blues&amp;quot;, contact: { telephonenumber: [&amp;quot;0004970311234567&amp;quot;], givenname: &amp;quot;Jake&amp;quot;, sn: &amp;quot;Blues&amp;quot;, company: &amp;quot;Blues Brothers&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
On Windows, the search and lookup are performed in all of the user&#039;s Outlook contact folders.  As opposed to the search implemented in the &#039;&#039;Contacts&#039;&#039; and &#039;&#039;Users&#039;&#039; App, all items are returned which match any of the search words (i.e. searching for &#039;&#039;a b&#039;&#039; will return items matching either &#039;&#039;a&#039;&#039; or &#039;&#039;b&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
; searched properties : firstname, lastname&lt;br /&gt;
; returned properties : Following Outlook contact phone number properties are returned  (if available):&lt;br /&gt;
&lt;br /&gt;
:* OFFICE_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* OFFICE2_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* HOME_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* HOME2_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* MOBILE_TELEPHONE_NUMBER as &#039;&#039;mobile&#039;&#039;&lt;br /&gt;
:* BUSINESS_FAX_NUMBER as &#039;&#039;facsimiletelephonenumber&#039;&#039;&lt;br /&gt;
Note that contact information is cached in the search provider.  Updated contacts may therefore become effective after a while only.&lt;br /&gt;
Outlook search will create its own trace file &amp;lt;code&amp;gt;myAppsOutlookSearch-&amp;lt;/code&amp;gt;&#039;&#039;date-time&#039;&#039;&amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; in the standard trace directory.&lt;br /&gt;
&lt;br /&gt;
This search provider is always installed and can be disabled.  There is no need (nor possibility) to enable it in the &#039;&#039;Apps&#039;&#039; tab of the PBX&#039;s user object.  Also, no &#039;&#039;App&#039;&#039; object needs to be created for it.&lt;br /&gt;
&lt;br /&gt;
==== Android/iOS ====&lt;br /&gt;
The search and lookup are performed in the contacts.&lt;br /&gt;
&lt;br /&gt;
==== macOS ====&lt;br /&gt;
The search and lookup are performed in the contacts. If you wish to disable local contact lookup, go to system settings - Security &amp;amp; Privacy and disable the access to contacts for myapps.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft Office integration ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services has a &#039;&#039;office presence provider&#039;&#039; that can provide the user&#039;s presence state to Office applications.  See [[{{NAMESPACE}}:Concept_myApps_Office_Integration|myApps Office Integration]] for details.&lt;br /&gt;
&lt;br /&gt;
This feature is installed by default.  However, it can be disabled using the &#039;&#039;OFFICEPRESENCE&#039;&#039; MSI Parameter.  Also, a check-mark is available in the setup dialog.&lt;br /&gt;
&lt;br /&gt;
=== Call an external application for calls ===&lt;br /&gt;
&lt;br /&gt;
Phone Apps (such as the phoneapp or softphone) can initiate the start of an external application when a new call appears (either incoming or outgoing).  The actual spawning of the application is done by the myApps platform service.  Also, the application properties (such as e.g. the executable&#039;s path) is configured in the myApps platform services (see [[#UI elements|Advanced settings]] in the &#039;&#039;UI elements&#039;&#039; section below).&lt;br /&gt;
&lt;br /&gt;
A number of arguments can be passed to the application by substituting $-variables in the &#039;&#039;Parameter&#039;&#039; field:&lt;br /&gt;
&lt;br /&gt;
; $n : phone number as dialed (called party number for outgoing calls) or received (calling party number for incoming calls)&lt;br /&gt;
&lt;br /&gt;
; $N : called or calling party number in &#039;&#039;national&#039;&#039; format (e.g. 07031730090)&lt;br /&gt;
&lt;br /&gt;
; $I : called or calling party number in &#039;&#039;international&#039;&#039; format (e.g. +497031730090)&lt;br /&gt;
&lt;br /&gt;
: note that both $N and $I only work if $n includes both subscriber number and area code (e.g. 07031730090). Otherwise they are equal to $n&lt;br /&gt;
&lt;br /&gt;
; $d : display name of peer (if known)&lt;br /&gt;
&lt;br /&gt;
; $u : URI name of the peer (if available eg with a federation call)&lt;br /&gt;
&lt;br /&gt;
; $c : conference id&lt;br /&gt;
&lt;br /&gt;
: this is a globally unique ID for this call and may be used to relate the call to the &#039;&#039;guid&#039;&#039; found in the CallInfo structure in the [http://wiki.innovaphone.com/index.php?title=Reference10:SOAP_API#CallInfo SOAP-API] and [http://sdk.innovaphone.com/doc/appwebsocket/RCC.htm RCC-API ].  Also, corresponding [[Reference10:Call Detail Record CDR PBX|CDRs]] can be related using the &#039;&#039;event&#039;&#039; tag&#039;s &#039;&#039;conf&#039;&#039; attribute.&lt;br /&gt;
The start of an external application can be requested using the &#039;&#039;com.innovaphone.externalapps&#039;&#039; API.&lt;br /&gt;
&lt;br /&gt;
Some setup examples are [[Howto:Integrate External Apps in innovaphone UC clients|shown here]].&lt;br /&gt;
&lt;br /&gt;
=== Push ===&lt;br /&gt;
&lt;br /&gt;
Mobile operating systems usually inhibit network operation of apps which run in the background or are closed by the user.  This is done in order to reduce battery consumption.  Unfortunately, this also stops such apps to maintain a registration by regularly sending &#039;&#039;keep alive&#039;&#039; messages to a server (in our case to the PBX).  As a result, myApps will be disconnected from the PBX.   When the PBX determines that there is an event for the application which needs a response, it needs to wake up the app using a dedicated channel provided by the operating system.  This mechanism is know as &#039;&#039;push&#039;&#039;. When running on iOS or Android, myApps supports &#039;&#039;push&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;push&#039;&#039; to work, a [[{{NAMESPACE}}:PBX/Objects/Push|&#039;&#039;push object&#039;&#039;]] needs to be configured in the PBX .  Also, it needs to be enabled on the mobile phone for the myApps app.&lt;br /&gt;
This mechanism is quite similar in v12 and v13, so you can refer to [[{{NAMESPACE}}:Concept_Push_Notifications_for_iOS_and_Android|Reference14r2:Concept_Push_Notifications_for_iOS_and_Android]] for more details. &lt;br /&gt;
&lt;br /&gt;
Also, helpful hints can be found in [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]].&lt;br /&gt;
&lt;br /&gt;
=== App Proxy ===&lt;br /&gt;
&lt;br /&gt;
myApps runs further &#039;&#039;Apps&#039;&#039; (such as e.g. the &#039;&#039;phoneapp&#039;&#039;) as a web page in an IFRAME of the browser myApps is running in.  The App&#039;s page code is loaded either from the PBX or from an &#039;&#039;application platform&#039;&#039; (AP).   This however would mean that the App&#039;s IFRAME would remain empty (a dead white screen) when the PBX or AP is not available. To make sure the App can start-up anyway, the myApps platform services feature the so-called &#039;&#039;App Proxy&#039;&#039;.  This is a caching proxy that caches all the App code so it is available even in case of network failure. When myApps runs in the context of the platform services, Apps are therefore not loaded from the App source directly, but from the local App proxy. &lt;br /&gt;
&lt;br /&gt;
The cached files are stored in the PCs local file system in the &amp;lt;code&amp;gt;C:\Users\...\AppData\Local\innovaphone\myApps\appproxy&amp;lt;/path&amp;gt;&amp;lt;/code&amp;gt;.  There is no configuration required.  However, if myApps seems to run with outdated or corrupt cached copies of the App, you can safely delete the entire directory.&lt;br /&gt;
&lt;br /&gt;
=== Auto update ===&lt;br /&gt;
&lt;br /&gt;
On Windows and on macOS, the myApps platform services can auto-update themselves to a common version.  This is controlled by the [[{{NAMESPACE}}:PBX/Config/myApps#Launcher_Software_Update | &#039;&#039;Launcher Software Update&#039;&#039;]] settings under &#039;&#039;PBX/Config/myApps&#039;&#039; in the PBX. &lt;br /&gt;
&lt;br /&gt;
When myApps is started or the user logs in or myApps needs to re-connect to the PBX, the platform services will use the [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client API] to learn the desired version (&#039;&#039;launcherUpdateBuild&#039;&#039;, which is part of the API&#039;s &#039;&#039;model&#039;&#039;). If this differs from the current version, the platform services will try to download the respective new version. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;mt&amp;quot;: &amp;quot;ApiUpdate&amp;quot;,&lt;br /&gt;
    &amp;quot;apis&amp;quot;: {&lt;br /&gt;
        &amp;quot;com.innovaphone.client&amp;quot;: {&lt;br /&gt;
            &amp;quot;@client&amp;quot;: {&lt;br /&gt;
                &amp;quot;title&amp;quot;: &amp;quot;innovaphone myApps&amp;quot;,&lt;br /&gt;
                &amp;quot;model&amp;quot;: {&lt;br /&gt;
                    &amp;quot;launcher&amp;quot;: true,&lt;br /&gt;
                    &amp;quot;launcherUpdateBuild&amp;quot;: &amp;quot;134906&amp;quot;,&lt;br /&gt;
                    &amp;quot;appStoreUrl&amp;quot;: &amp;quot;http://store.innovaphone.com/release/download/&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The installation of the downloaded version is done by the &#039;&#039;innovaphonemyAppsUpdateService&#039;&#039;. This service is installed and enabled during the initial installation of the myApps platform services.  To disable auto-update, either leave the &#039;&#039;Launcher Software Update&#039;&#039; settings empty or set the service&#039;s start mode to &#039;&#039;disabled&#039;&#039; in the Windows &#039;&#039;services control panel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that on Windows the update service does not work on terminal servers. Administrators must do myApps base services updates using standard windows mechanisms.&lt;br /&gt;
&lt;br /&gt;
Note that on macOS if myApps has been installed from the Apple Store it is assumed that auto update from the PBX is not desired and disabled therefore.&lt;br /&gt;
&lt;br /&gt;
On Android/iOS/macOS updates can be downloaded from the respective app store.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Devices&#039;&#039; app can not update software installed on Windows PCs directly. However, when the PBX is updated using an &#039;&#039;update job&#039;&#039; in the &#039;&#039;Devices&#039;&#039; App, the &#039;&#039;Launcher Software Update&#039;&#039; settings will be updated accordingly and hence the myApps base services will ultimately also be updated to the same version.&lt;br /&gt;
&lt;br /&gt;
==== Auto update flow on Windows ====&lt;br /&gt;
&lt;br /&gt;
* On start of myApps, myApps checks if an update is available and ready for installation&lt;br /&gt;
** if yes, the update is installed directly, without user interaction (a popup is shown during the installation)&lt;br /&gt;
** if not, myApps starts&lt;br /&gt;
* if an update is available while myApps is already running, an update notification will be shown which let&#039;s the user choose to install the update now or later (the notification will then popup again after one hour)&lt;br /&gt;
&lt;br /&gt;
==UI elements ==&lt;br /&gt;
There are a few user interfaces provided by the platform services:&lt;br /&gt;
===tray-icon (Windows only) ===&lt;br /&gt;
::[[Image:myapps-tray.png|myapps-tray.png/|myapps-tray.png/]]&lt;br /&gt;
:Allows to&lt;br /&gt;
:* terminate myApps&lt;br /&gt;
:* toggle the &#039;&#039;autostart&#039;&#039; state&lt;br /&gt;
:* toggle the &#039;&#039;show in task bar&#039;&#039; state&lt;br /&gt;
:* open the trace folder&lt;br /&gt;
:&lt;br /&gt;
=== PBX connect form===&lt;br /&gt;
:: [[Image:myapps-connect.png|myapps-connect.png/|myapps-connect.png/]]&lt;br /&gt;
: Allows the user to specify the connect data for the PBX (i.e. IP address or DNS name)&lt;br /&gt;
:&lt;br /&gt;
=== Advanced settings===&lt;br /&gt;
::[[Image:myapps-settings0.png|myapps-settings0.png/|myapps-settings0.png/]]&lt;br /&gt;
::[[Image:myapps-settings.png|myapps-settings.png/|myapps-settings.png/]] [[Image:myapps-settings2.png|myapps-settings2.png/|myapps-settings2.png/]] [[Image:myapps-settings3.png|myapps-settings3.png/|myapps-settings3.png/]]&lt;br /&gt;
&lt;br /&gt;
: Allows to modify various platform dependant settings (such as e.g. the hotkey selection on Windows)&lt;br /&gt;
&lt;br /&gt;
== Interfaces ==&lt;br /&gt;
=== Provided APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm com.innovaphone.search] : access to local phone book entries by the [[#Local phonebook access|Local phonebook access]] component.&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.launcher/com.innovaphone.launcher.htm com.innovaphone.launcher] : display of OS specific user notifications and receipt of related user actions&lt;br /&gt;
; com.innovaphone.notificationhandler : reports back click on a notification.&lt;br /&gt;
; com.innovaphone.externalapps : to start external applications, see [[#Call an external application for calls|Call an external application for calls]]  above&lt;br /&gt;
&lt;br /&gt;
=== Used APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm com.innovaphone.phone] : used to initiate new or manipulate existing calls by the [[#Hot keys|Hot keys]] and [[#URL handler|URL handler]] components.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm com.innovaphone.chat] : used to start a new chat by the [[#URL handler|URL handler]] component.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client] : the model is used to learn the update settings, see [[#Auto update|Auto update]] above&lt;br /&gt;
&lt;br /&gt;
=== Protocols ===&lt;br /&gt;
&lt;br /&gt;
; [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol] : used by apps to allocate RTP channels, see [[#RTP service for audio.2C video and data|RTP service for audio, video and data]] above&lt;br /&gt;
&lt;br /&gt;
== Related App Services ==&lt;br /&gt;
&lt;br /&gt;
none&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
; Incoming call as banner on myApps for iOS : Since iOS 14 the iOS CallKit presents incoming calls as a banner leaving the original green answer button of myApps visible. Use only the blue button of the banner to accept the call or change iPhone Settings, App &amp;quot;Phone&amp;quot;, &amp;quot;Incoming Calls&amp;quot; to &amp;quot;Full Screen&amp;quot; to hide the myApps user interface again during call answering.&lt;br /&gt;
&lt;br /&gt;
; Call answer in speakerphone mode even with active Bluetooth headset on myApps for iOS : This causes unwanted speakerphone operation if the smartphone is used with a Bluetooth car audio system. The behaviour can be changed by selecting &#039;&#039;Bluetooth Headset&#039;&#039; in this setting:&lt;br /&gt;
:&#039;&#039;iOS Settings-&amp;gt;Accessibility-&amp;gt;Touch-&amp;gt;Call Audio Routing: Automatic / Bluetooth Headset / Speaker&#039;&#039;&lt;br /&gt;
:&#039;&#039;iOS Einstellungen-&amp;gt;Bedienungshilfen-&amp;gt;Tippen-&amp;gt;Anrufaudioausgabe: Automatisch / Bluetooth-Headset / Lautsprecher&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Windows Server 2016 (Windows 10 Build 1607) : windows just shows the first notification. Further notifications aren&#039;t displayed until the previous ones are removed from the notification center. Current windows builds do not show this behaviour anymore.&lt;br /&gt;
&lt;br /&gt;
; Problems on Mac computers with Yealink USB headsets&lt;br /&gt;
: we have received reports that myApps quits unexpectedly on some Mac computers when a Yealink headset is plugged in.  Unfortunately, we could not find out the cause yet.  If you use Yealink USB headsets and have a similar issue, please open a support ticket and send myApps traces.&lt;br /&gt;
&lt;br /&gt;
; Poly / Plantronics headset buttons only functional if myApps is started with Rosetta&lt;br /&gt;
: myApps macOS supports Apple M1/M2 hardware natively. However, the Poly / Plantronics headset SDK is only available for Intel platform and thus myApps needs to be started via Apple&#039;s Intel emulator Rosetta if a Poly / Plantronics headset is used. This is done with right-click on the myApps executable, &#039;&#039;Information&#039;&#039;, &#039;&#039;Open with Rosetta&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Windows surface devices may not work correctly&lt;br /&gt;
: Chromium does not get touch keyboard events. USB Keyboards may not be recognized either.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Windows using the .msi file found in the &#039;&#039;myApps Windows&#039;&#039; package from [https://store.innovaphone.com/release/download.htm store.innovaphone.com].&lt;br /&gt;
&lt;br /&gt;
myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
=== MSI Parameters and install options ===&lt;br /&gt;
&lt;br /&gt;
The MSI installer of myApps for Windows supports the following parameters and can be edited with [https://docs.microsoft.com/en-us/windows/win32/msi/orca-exe Microsoft Orca]. You can add your parameters in the table &#039;&#039;property&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; SERVER (REG_SZ): the PBX&#039;s server URL&lt;br /&gt;
; OFFICEPRESENCE (REG_DWORD): &#039;&#039;&#039;false&#039;&#039;&#039; to disable presence integration in Microsoft Office&lt;br /&gt;
: this is also available as a check-mark when running the install manually&lt;br /&gt;
&lt;br /&gt;
; DISABLEHEADSETS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable headsets support, see [[#Device handling|Device handling]] above&lt;br /&gt;
&lt;br /&gt;
; EXTERNALAPPS (REG_SZ): pre-define external applications, see [[#Call an external application for calls|Call an external application for calls]] above&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;&amp;quot;{&amp;quot;&amp;quot;externalApps&amp;quot;&amp;quot;:[{&amp;quot;&amp;quot;id&amp;quot;&amp;quot;:0,&amp;quot;&amp;quot;name&amp;quot;&amp;quot;:&amp;quot;&amp;quot;Wireshark&amp;quot;&amp;quot;,&amp;quot;&amp;quot;path&amp;quot;&amp;quot;:&amp;quot;&amp;quot;C:\\Program Files\\Wireshark\\Wireshark.exe&amp;quot;&amp;quot;,&amp;quot;&amp;quot;param&amp;quot;&amp;quot;:&amp;quot;&amp;quot;test $I&amp;quot;&amp;quot;}]}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FORCERESTART (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; (or any string ...) kills myApps during the installation and restarts it for the currently logged in user, if it was running&lt;br /&gt;
&lt;br /&gt;
; DISABLELOCALHOST (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable use of &#039;&#039;&#039;localhost&#039;&#039;&#039; string to access the local webserver. Use &#039;&#039;&#039;127.0.0.1&#039;&#039;&#039; instead&lt;br /&gt;
&lt;br /&gt;
; EXCLUDEINTERFACES (REG_SZ): some VPN interfaces are not detected by Windows as IF_TYPE_PPP or IF_TYPE_TUNNEL and therefore the &#039;&#039;&#039;media outside VPN&#039;&#039;&#039; setting is not taking effect. With this option interfaces can be pre-defined that will not be used for media. Interfaces must be comma separated&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;EXCLUDEINTERFACES=&amp;quot;172,192.168,10.10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current settings are stored in the registry at &amp;lt;code&amp;gt;Computer\HKEY_CURRENT_USER\Software\innovaphone\myApps&amp;lt;/code&amp;gt; or at &amp;lt;code&amp;gt;Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\innovaphone\myApps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Boolean values like OfficePresence are stored in registry entries with type REG_DWORD and values 1 or 0. 0 disables the setting and 1 enables it.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on iOS by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;App Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
    &amp;lt;code&amp;gt;&amp;lt;plist&amp;gt;&lt;br /&gt;
        &amp;lt;dict&amp;gt;&lt;br /&gt;
            &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
            &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
        &amp;lt;/dict&amp;gt;&lt;br /&gt;
    &amp;lt;/plist&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== macOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services might be installed directly from the Apple store. An installer package &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; and a disk image &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; is also available from the innovaphone app store. Install &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; by double-click on the file and follow the instructions of the installer. myApps becomes available in the Applications folder and can be opened by double-click. Or download and open &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; and double klick myApps. If desired integrate it into the app dock by right click, &#039;&#039;Options, Keep in the dock&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If installed from the innovaphone app store, myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
If installed from the Apple store, macOS notifies about updates on the Apple store. myApps [[#Auto update|Auto update]] is disabled then.&lt;br /&gt;
&lt;br /&gt;
If a clean-install of the client is necessary, the folder &amp;quot;/Users/username/Library/Containers/myapps&amp;quot; needs to be deleted. To be on the safe side also delete it from the trash bin.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
    &amp;lt;code&amp;gt;&amp;lt;plist&amp;gt;&lt;br /&gt;
        &amp;lt;dict&amp;gt;&lt;br /&gt;
            &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
            &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
        &amp;lt;/dict&amp;gt;&lt;br /&gt;
    &amp;lt;/plist&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Preferences ===&lt;br /&gt;
&lt;br /&gt;
macOS supports preference settings that can be set via a shell command or via Mac remote management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;gt; defaults write com.innovaphone.client-ios-14r1 server &amp;quot;PBX-server-URL&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following parameters and can be set through this method:&lt;br /&gt;
&lt;br /&gt;
; server: the PBX&#039;s server URL&lt;br /&gt;
&lt;br /&gt;
=== Setting myApps as Default App for SIP-URLs ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add &#039;{&lt;br /&gt;
   LSHandlerURLScheme = sip;&lt;br /&gt;
   LSHandlerRoleAll = &amp;quot;&amp;lt;CFBundleIdentifier&amp;gt;&amp;quot;;&lt;br /&gt;
}&#039;&lt;br /&gt;
|}&lt;br /&gt;
To find the “CFBundleIdentifier”, proceed as follows:&lt;br /&gt;
&lt;br /&gt;
* In the Finder under “Applications”, search for the desired myApps client that you want to set as the default app.&lt;br /&gt;
&lt;br /&gt;
* Right-click on “Show package contents” -&amp;gt; you will find the “CFBundleIdentifier” in the Info.plist file.&lt;br /&gt;
&lt;br /&gt;
A restart of the MAC is required.&lt;br /&gt;
&lt;br /&gt;
=== Using Sennheiser headsets ===&lt;br /&gt;
If you use Sennheiser headsets, you should also install the then-current &amp;lt;code&amp;gt;DSEA_SDK_v&amp;lt;/code&amp;gt;&#039;&#039;version&#039;&#039;&amp;lt;code&amp;gt;.pkg&amp;lt;/code&amp;gt; package, after you installed the myApps client.  Without that, audio will still work, but not the controls on the headset.  You will need to keep that up-to-date yourself, as it is not updated by myApps&#039;s auto-update function.&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Android by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;Play Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying a property &amp;quot;server&amp;quot; with string value &amp;quot;pbx.example.com&amp;quot; in the MDM.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
When opening myApps for the first time, the user is prompted for the Server. Usually only the hostname (DNS host name or IP address) needs to be configured.&lt;br /&gt;
&lt;br /&gt;
But there are more options for special PBX configurations.&lt;br /&gt;
&lt;br /&gt;
; Non-standard HTTPS port&lt;br /&gt;
: If the PBX uses a non-standard HTTPS port, it must be appended to the host name separated by a colon (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com:4444&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com:4444/PBX0/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; DynPBX module name&lt;br /&gt;
: If the PBX is a DynPBX, the module id must be appended to PBX0 separated - (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com/PBX0-1&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0-1/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; Softphone physical location&lt;br /&gt;
: If user defined physical location shall be used for softphone, you can append it using a parameter &amp;lt;code&amp;gt;#phys=&amp;lt;/code&amp;gt;.&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com#phys=slave&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0/APPCLIENT/appclient.htm#phys=slave&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Example 1: PBX pbx.example.com with standard configuration&lt;br /&gt;
 pbx.example.com&lt;br /&gt;
&lt;br /&gt;
Example 2: PBX slave.example with DynPBX module ID 1, HTTPS port 4444 and physical location master&lt;br /&gt;
 slave.example.com:4444/PBX0-1#phys=master&lt;br /&gt;
&lt;br /&gt;
=== HTTP proxy support ===&lt;br /&gt;
&lt;br /&gt;
myApps platform services do support operation via HTTP proxy now. If one or more proxies have been configured in the network settings of the operating system for the active network connection, HTTP CONNECT tunnels are established.&lt;br /&gt;
&lt;br /&gt;
On Windows user name and password can be specified for the tunnel servers as generic credentials in the credentials manager (Anmeldeinformationsverwaltung). The name of the credentials must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
On Android user name and password can be specified through Android &#039;&#039;Settings, Accounts&#039;&#039; by adding a myApps &#039;&#039;HTTP Proxy Credentials&#039;&#039; account. The name of the account must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
== Platform specific settings ==&lt;br /&gt;
When myApps runs under the myApps platform services, it will show various platform specific settings as part of its &#039;&#039;burger menu&#039;&#039;, so the user can set them.  See &#039;&#039;Advanced settings&#039;&#039; in [[#UI elements|UI elements]] above.&lt;br /&gt;
&lt;br /&gt;
Some options can also be set globally for all myApps clients in the PBX&#039;s [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps &#039;&#039;Client Settings&#039;&#039;]]&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Option&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Where to set&lt;br /&gt;
&lt;br /&gt;
!&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || User menu || PBX &#039;&#039;Client Settings&#039;&#039; || Windows || iOS || Android || macOS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Autostart || Launch myApps on login || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Appear offline after || controls after which idle time a user is considered &#039;&#039;inactive&#039;&#039;. See [[#User activity|User activity]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Hotkeys || Hotkeys for call dial, accept, reject. See [[#Hot keys|Hot keys]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Docking || Docking mode (left, right, none). See [[#???|??]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Desktop notifications|| Turn on/off platform notifications. See [[#Notifications|  Notifications]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| VPN || Disable VPN address for ICE candidate selection. See [[#RTP ports| RTP ports]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Show in taskbar|| Show myApps in the taskbar in addition to it&#039;s tray icon.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Log flags || turn on/off certain trace levels. See [[#Troubleshooting|Troubleshooting]] below.  || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| External applications || define the applications available for Apps to be started. See [[#Call an external application for calls|Call an external application for calls]] above.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Ring in headset || send ring tone for incoming to headset instead of loudspeaker.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|}&lt;br /&gt;
== Start parameters for Windows ==&lt;br /&gt;
&lt;br /&gt;
On Windows, it is not possible to pass start parameters from the [https://www.chromium.org/developers Chromium documentation] to the myApps process.&lt;br /&gt;
&lt;br /&gt;
== OS Settings for Windows ==&lt;br /&gt;
Windows settings can influence the display of &#039;&#039;Desktop notifications&#039;&#039;. See [https://support.microsoft.com/en-us/help/4028678/windows-10-change-notification-settings Change notification settings in Windows 10/11] for details.&lt;br /&gt;
&lt;br /&gt;
=== Windows 11 ===&lt;br /&gt;
&lt;br /&gt;
* Windows 11 has a feature &amp;quot;do not disturb&amp;quot;. This hides notifications if enabled.&lt;br /&gt;
* Windows 11 has a feature &amp;quot;focus&amp;quot;. This enables &amp;quot;do not disturb&amp;quot; and thus hides notifications too.&lt;br /&gt;
* Windows 11 has priority settings for notifications. Ensure that VoIP notifications for calls are allowed any maybe also include myApps as an App which is allowed to show notifications.&lt;br /&gt;
&lt;br /&gt;
== OS settings for Android ==&lt;br /&gt;
; Events : The appearance of notifications can be controlled here.&lt;br /&gt;
&lt;br /&gt;
; Call accounts : For proper incoming call signaling, the call account &#039;&#039;myApps&#039;&#039; needs to be enabled. Note that on Samsung smartphones the call account switch likely toggles back and a few tries may need to be done until it persists. Please double-check the state.&lt;br /&gt;
&lt;br /&gt;
; Preferred Calling Account : Choose which calling account (myApps/SIM/..) should be used for outgoing calls initiated from within the native phone app / phone book.&lt;br /&gt;
&lt;br /&gt;
; Background data, unlimited data usage : Grant background data use to enable &#039;&#039;myApps&#039;&#039; to connect to the PBX immediately on an incoming call.&lt;br /&gt;
&lt;br /&gt;
; Overlaying : This setting is not needed if call account &#039;&#039;myApps&#039;&#039; has been enabled. Should there be a reason for not enabling call account &#039;&#039;myApps&#039;&#039;, the permission for overlaying needs to be granted on Android 10 or higher for proper call signaling.&lt;br /&gt;
&lt;br /&gt;
Note: If no SIM card is installed some Android smartphones exhibit a problem dialing from the smartphone contacts. The contacts app shows a choice &#039;&#039;Select SIM card for this call&#039;&#039; but all possible dialers are greyed out. In this case make myApps the default phone app in Android settings &#039;&#039;Apps, Default apps, Telephony&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for iOS ==&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in iOS &#039;&#039;Settings, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for macOS ==&lt;br /&gt;
&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in macOS &#039;&#039;Preferences, Notifications, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
myApps platform services can write various traces for debugging.  Trace can be turned on and off selectively in the [[#Advanced settings|Advanced settings]].&lt;br /&gt;
&lt;br /&gt;
The following trace flags can be set:&lt;br /&gt;
&lt;br /&gt;
(&#039;&#039;Recommended trace options are: &#039;&#039;&#039;App, Browser, ICE, TURN, Signaling and Audio&#039;&#039;&#039;. Please do not activate other flags unless innovaphone support says otherwise&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |  Abbreviation&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |code&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| App||0x000000001|| logs from the App Service itself&lt;br /&gt;
|-&lt;br /&gt;
| DNS||0x000000008|| logs DNS requests and results&lt;br /&gt;
|-&lt;br /&gt;
| HTTP client||0x000000080|| http client logs&lt;br /&gt;
|-&lt;br /&gt;
| TLS||0x000000400|| TLS logs&lt;br /&gt;
|-&lt;br /&gt;
| TCP||0x000000800|| TCP logs&lt;br /&gt;
|-&lt;br /&gt;
| LDS||0x000001000|| local domain sockets&lt;br /&gt;
|-&lt;br /&gt;
| WebSocket client||0x000004000|| logs outgoing websocket connections&lt;br /&gt;
|-&lt;br /&gt;
| App WebSocket||0x000008000|| logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
|-&lt;br /&gt;
| UDP||0x000200000|| UDP logs&lt;br /&gt;
|-&lt;br /&gt;
| DTLS||0x000400000|| logs DTLS handshake and messages&lt;br /&gt;
|-&lt;br /&gt;
| Media||0x000800000|| logs media events&lt;br /&gt;
|-&lt;br /&gt;
| Media channel||0x001000000|| logs RTP/SCTP media connections&lt;br /&gt;
|-&lt;br /&gt;
| ICE||0x002000000|| logs ICE messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| TURN||0x004000000|| logs TURN messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| AppSharing||0x008000000|| logs AppSharing connection&lt;br /&gt;
|-&lt;br /&gt;
| Audio||0x010000000|| logs Audio connection and headset events&lt;br /&gt;
|-&lt;br /&gt;
| Video||0x020000000|| logs video connection and webcam events&lt;br /&gt;
|-&lt;br /&gt;
| Browser||0x040000000|| logs Chromium events&lt;br /&gt;
|-&lt;br /&gt;
| AppProxy||0x080000000|| logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
|-&lt;br /&gt;
| Webserver ||0x200000000|| enables webserver specific logs&lt;br /&gt;
|-&lt;br /&gt;
| Browser Console ||0x400000000|| logs browser console events&lt;br /&gt;
|-&lt;br /&gt;
| Signaling||0x800000000|| enables logs in the signaling module for debugging calls&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;code&#039;&#039; can be or&#039;ed and used as value for the &#039;&#039;Log flags&#039;&#039; field in [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps/Client Settings]].&lt;br /&gt;
&lt;br /&gt;
; Windows :On Windows, traces are written to the &amp;lt;code&amp;gt;C:\Users\[UserName]\AppData\Local\innovaphone\myApps&amp;lt;/code&amp;gt; directory. If you start myApps with --log-size as parameter, you can define the maximum size of a log file (e.g. --log-size=100000000 would be 100MB for each file)&lt;br /&gt;
&lt;br /&gt;
:* myApps-&#039;&#039;date-time&#039;&#039;.txt : main log file for the platform services&lt;br /&gt;
&lt;br /&gt;
:* myAppsOutlookSearch-&#039;&#039;date-time&#039;&#039;.txt : log file for the Outlook phone book access&lt;br /&gt;
&lt;br /&gt;
:* myAppsHookController-&#039;&#039;date-time&#039;&#039;.txt : log file for the hot-key interceptor (see [[#Hot keys|Hot keys]])&lt;br /&gt;
&lt;br /&gt;
; :myApps update installation traces are written to the &amp;lt;code&amp;gt;%windir%\temp\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsInstall.txt: MSI installation file&lt;br /&gt;
&lt;br /&gt;
; :myApps update service traces are written to the &amp;lt;code&amp;gt;%ALLUSERSPROFILE%\innovaphone\myAppsUpdateService&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsUpdateService-&#039;&#039;date-time&#039;&#039;.txt: myApps update service traces&lt;br /&gt;
&lt;br /&gt;
;Android : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
: also, an Android device might also be connected to a PC via an USB cable to get the traces. The files can be found in &amp;lt;code&amp;gt;Android/data/com.innovaphone.clientandroid/files&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
; macOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
: also, the files can be found in &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-ios/Data/Documents/&amp;lt;/code&amp;gt;. Press &#039;&#039;Alt+N&#039;&#039; followed by space to get tilde &#039;&#039;~&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Known Problems =&lt;br /&gt;
[[:Category:Problem myApps platform services|Known Problems]]&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Redundancy|Reference14r2:Concept_myApps_Redundancy]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Office_Integration|Reference14r2:Concept_myApps_Office_Integration]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myAPPs_Search_in_local-Outlook_Contacts|Reference14r2:Concept_myAPPs_Search_in_local-Outlook_Contacts]]&lt;br /&gt;
* [[{{NAMESPACE}}:Call_Detail_Record_CDR_PBX|Reference14r2:Call_Detail_Record_CDR_PBX]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept Push Notifications for myPBX iOS and Android|Reference14r2:Concept Push Notifications for myPBX iOS and Android]]&lt;br /&gt;
* [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept myApps platform services]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=78946</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=78946"/>
		<updated>2026-02-24T09:53:01Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Latest News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
[[Image:RemoteControl-click.png|left|60px|RemoteControl.png/|Download Remote Control|link=https://store.innovaphone.com/alpha/download/software/remotecontrolwindowsportable/16r1/remoteControl.exe]]&lt;br /&gt;
innovaphone only carries out scheduled remote maintenance via our ticket system by prior consultation.&amp;lt;br/&amp;gt;&lt;br /&gt;
As Remote Support Tool, we use our own product Remote Control ([https://www.innovaphone.com/en/all-apps/apps-to-work-with/remote-control-app.html more info]).&lt;br /&gt;
&lt;br /&gt;
You can &#039;&#039;&#039;[https://store.innovaphone.com/alpha/download/software/remotecontrolwindowsportable/16r1/remoteControl.exe download]&#039;&#039;&#039; the Remote Control client already or use the support link received from our support team.&amp;lt;br/&amp;gt;&lt;br /&gt;
After installing and opening the client you can &#039;&#039;&#039;pass the shown ID&#039;&#039;&#039; or &#039;&#039;&#039;use the received link&#039;&#039;&#039; to request the support session.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have Google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales@innovaphone.com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Tfu|Tfu]] 10:48, 24 February 2026 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM Software 3130114 (4.2.1) released| WinPDM Software 3130113 (4.2.1)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Msc|Msc]] ([[User talk:Msc|talk]]) 15:05, 2 February 2026 (CET)&amp;lt;/p&amp;gt; [[Support:Firmware_V16r1_product/16r1/firmware_1610613_(beta5)_available | Version 16r1 Beta 5]] is now available from the [http://store.innovaphone.com/beta/download.htm Beta Store]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Ndiehl|Ndiehl]] ([[User talk:Ndiehl|talk]]) 13:47, 10 February 2026 (CET)&amp;lt;/p&amp;gt; [[Support:Firmware V15r1 product/15r1/firmware 1510665 (sr 10) available | Version 15r1 Service Release 10]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Ndiehl|Ndiehl]] ([[User talk:Ndiehl|talk]]) 13:47, 10 February 2026 (CET)&amp;lt;/p&amp;gt; [[Support:Firmware V14r2 product/14r2/firmware 1420581 (sr 18) available | Version 14r2 Service Release 18]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Ndiehl|Ndiehl]] ([[User talk:Ndiehl|talk]]) 13:47, 10 February 2026 (CET)&amp;lt;/p&amp;gt; [[Support:Firmware V13r3 product/13r3/firmware 138045 (sr 35) available | Version 13r3 Service Release 35]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Tfu|Tfu]] ([[User talk:Tfu&amp;amp;action=edit&amp;amp;redlink=1|talk]]) 15:28, 13 March 2025 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP73 1012 (6.1.13) released| Wireless Handset Firmware IP73 1012 (6.1.13) released]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Msu|Msu]] ([[User talk:Msu&amp;amp;action=edit&amp;amp;redlink=1|talk]]) 15:54, 18 February 2025 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP64 10317 (4.3.2)/IP65 10122 (4.3.2) released| Wireless Handset Firmware IP64 10317 (4.3.2)/IP65 10122 (4.3.2)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Msu|Msu]] ([[User talk:Msu&amp;amp;action=edit&amp;amp;redlink=1|talk]]) 15:54, 18 February 2025 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware D83 10002 (2.0.5) released| Wireless Handset Firmware D83 10002 (2.0.5)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:38, 6 February 2023 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP62 3040621 (6.2.7) released| Wireless Handset Firmware IP62 3040621 (6.2.7)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8) released| Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware and Management Software product/9.00/wireless 100037 (hotfix19) available| Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
&amp;lt;!-- https://www.mediawiki.org/wiki/Extension:Newest_Pages --&amp;gt;&lt;br /&gt;
{{Special:Newestpages/all/20}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=User:Tfu&amp;diff=78945</id>
		<title>User:Tfu</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=User:Tfu&amp;diff=78945"/>
		<updated>2026-02-24T09:52:19Z</updated>

		<summary type="html">&lt;p&gt;Tfu: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=78944</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=78944"/>
		<updated>2026-02-24T09:52:01Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Latest News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
[[Image:RemoteControl-click.png|left|60px|RemoteControl.png/|Download Remote Control|link=https://store.innovaphone.com/alpha/download/software/remotecontrolwindowsportable/16r1/remoteControl.exe]]&lt;br /&gt;
innovaphone only carries out scheduled remote maintenance via our ticket system by prior consultation.&amp;lt;br/&amp;gt;&lt;br /&gt;
As Remote Support Tool, we use our own product Remote Control ([https://www.innovaphone.com/en/all-apps/apps-to-work-with/remote-control-app.html more info]).&lt;br /&gt;
&lt;br /&gt;
You can &#039;&#039;&#039;[https://store.innovaphone.com/alpha/download/software/remotecontrolwindowsportable/16r1/remoteControl.exe download]&#039;&#039;&#039; the Remote Control client already or use the support link received from our support team.&amp;lt;br/&amp;gt;&lt;br /&gt;
After installing and opening the client you can &#039;&#039;&#039;pass the shown ID&#039;&#039;&#039; or &#039;&#039;&#039;use the received link&#039;&#039;&#039; to request the support session.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have Google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales@innovaphone.com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Tfu|Tfu]] 10:48, 24 February 2026 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM Software 3130114 (4.2.1) released| WinPDM Software 3130113 (4.1.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Msc|Msc]] ([[User talk:Msc|talk]]) 15:05, 2 February 2026 (CET)&amp;lt;/p&amp;gt; [[Support:Firmware_V16r1_product/16r1/firmware_1610613_(beta5)_available | Version 16r1 Beta 5]] is now available from the [http://store.innovaphone.com/beta/download.htm Beta Store]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Ndiehl|Ndiehl]] ([[User talk:Ndiehl|talk]]) 13:47, 10 February 2026 (CET)&amp;lt;/p&amp;gt; [[Support:Firmware V15r1 product/15r1/firmware 1510665 (sr 10) available | Version 15r1 Service Release 10]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Ndiehl|Ndiehl]] ([[User talk:Ndiehl|talk]]) 13:47, 10 February 2026 (CET)&amp;lt;/p&amp;gt; [[Support:Firmware V14r2 product/14r2/firmware 1420581 (sr 18) available | Version 14r2 Service Release 18]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Ndiehl|Ndiehl]] ([[User talk:Ndiehl|talk]]) 13:47, 10 February 2026 (CET)&amp;lt;/p&amp;gt; [[Support:Firmware V13r3 product/13r3/firmware 138045 (sr 35) available | Version 13r3 Service Release 35]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Tfu|Tfu]] ([[User talk:Tfu&amp;amp;action=edit&amp;amp;redlink=1|talk]]) 15:28, 13 March 2025 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP73 1012 (6.1.13) released| Wireless Handset Firmware IP73 1012 (6.1.13) released]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Msu|Msu]] ([[User talk:Msu&amp;amp;action=edit&amp;amp;redlink=1|talk]]) 15:54, 18 February 2025 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP64 10317 (4.3.2)/IP65 10122 (4.3.2) released| Wireless Handset Firmware IP64 10317 (4.3.2)/IP65 10122 (4.3.2)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Msu|Msu]] ([[User talk:Msu&amp;amp;action=edit&amp;amp;redlink=1|talk]]) 15:54, 18 February 2025 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware D83 10002 (2.0.5) released| Wireless Handset Firmware D83 10002 (2.0.5)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:38, 6 February 2023 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP62 3040621 (6.2.7) released| Wireless Handset Firmware IP62 3040621 (6.2.7)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8) released| Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware and Management Software product/9.00/wireless 100037 (hotfix19) available| Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
&amp;lt;!-- https://www.mediawiki.org/wiki/Extension:Newest_Pages --&amp;gt;&lt;br /&gt;
{{Special:Newestpages/all/20}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=78908</id>
		<title>Reference16r1:Concept App Service Connector for Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=78908"/>
		<updated>2026-02-13T11:22:31Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Correctness of notification URL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{FIXME|reason=This article is still work in progress}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept|Apps]]&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* Connector for Microsoft 365 from Version 16r1&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Connector for Microsoft 365 synchronizes Microsoft Teams presences with the innovaphone PBX and back, and optionally additionally Calendar presence from Exchange Online (part of the Microsoft 365 Cloud Services).&lt;br /&gt;
It is also possible to search for your own contacts. &lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX&lt;br /&gt;
* innovaphone Application Platform (minimum version 120004)&lt;br /&gt;
* V16r1&lt;br /&gt;
* App(Connector for Microsoft 365)&lt;br /&gt;
* PBX-App(innovaphone-microsoft365) license per user - order no. 02-00050-009&lt;br /&gt;
&lt;br /&gt;
== Concept ==&lt;br /&gt;
&lt;br /&gt;
=== User Presence ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure User Presence Sync by Connector for Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
If the Connector for Microsoft 365 app is fully configured, the app connects to Microsoft to obtain a token. With the token, the app gets the teams users (with a Teams license) through the Microsoft Graph API.&lt;br /&gt;
A presence subscription to Microsoft is started with the licensed users of the PBX to get presence changes in Microsoft Teams for these users. A user subscription is also started to get changes of the users (adding, deleting or update). If a user has changed, the Teams users are retrieved again. If the presence has changed, it is forwarded to the PBX. The presences of Teams are mapped to the presences of the PBX.&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Presence subscriptions are renewed every 10 minutes.&lt;br /&gt;
* License Check is made periodically.&lt;br /&gt;
&lt;br /&gt;
The app synchronises the PBX presence with Teams through the Graph Api. The on-the-phone presence will be renewed every 5 minutes. The other presences have a lifetime of 1 day but the away has a lifetime of 7 days.&lt;br /&gt;
The lifetimes are described [https://learn.microsoft.com/en-us/graph/api/presence-setuserpreferredpresence?view=graph-rest-1.0&amp;amp;tabs=http here]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please be aware:&#039;&#039;&#039; The actual change of presence or line state will be live, the above-mentioned subscriptions are needed to register against the Microsoft API for changes. &lt;br /&gt;
After successful subscription Microsoft will trigger the Connector for Microsoft 365 App every time a presence or line state for a user has changed.&lt;br /&gt;
The subscription will then be renewed in the above-mentioned time interval to receive further live updates.&lt;br /&gt;
&lt;br /&gt;
===== User Matching =====&lt;br /&gt;
You now can choose the fields used for user matching on either side from the following options:&lt;br /&gt;
* PBX&lt;br /&gt;
** CN (Long Name property from the PBX user object)&lt;br /&gt;
** h323 (Name property from the PBX user object)&lt;br /&gt;
* Azure Portal&lt;br /&gt;
** displayName&lt;br /&gt;
** mail&lt;br /&gt;
** mailNickname&lt;br /&gt;
** onPremisesDistinguishedName&lt;br /&gt;
** onPremisesSamAccountName&lt;br /&gt;
** onPremisesUserPrincipalName&lt;br /&gt;
** userPrincipalName&lt;br /&gt;
&lt;br /&gt;
Additionally, you have the possibility to remove a possibly contained domain from the Azure fields content. &amp;lt;br&amp;gt;&lt;br /&gt;
Example: &#039;user@domain.tld&#039; is transformed to &#039;user&#039;, if this option is checked.&lt;br /&gt;
&lt;br /&gt;
===== Mapping Table =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Teams Presence&lt;br /&gt;
! PBX Presence&lt;br /&gt;
|-&lt;br /&gt;
| Away&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| BeRightBack&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| Busy&lt;br /&gt;
| busy&lt;br /&gt;
|-&lt;br /&gt;
| DoNotDisturb&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| InACall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAMeeting&lt;br /&gt;
| meeting&lt;br /&gt;
|-&lt;br /&gt;
| Inactive&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| PresenceUnknown&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Available&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offline&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offwork&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| OutOfOffice&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| UrgentInterruptionsOnly&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| Presenting&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAConferenceCall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value &amp;quot;online&amp;quot; unsets the Teams presence in the PBX.&lt;br /&gt;
&lt;br /&gt;
===== Master/Slave =====&lt;br /&gt;
&lt;br /&gt;
For Master/Slave combination the &amp;quot;Connector for Microsoft 365&amp;quot; App has to be added to the slave (if no full replication is on). The slave websocket connection is needed to display &amp;quot;on-the-phone&amp;quot; presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Calendar Presence ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure_Calendar_Presence_Sync_by_Connector_for_Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
Introduced in 15r1 the Connector for Microsoft 365 will offer a possibility to sync Azure Portal calendar events (Teams, Exchange online) via the Graph API with the PXB presence.&amp;lt;br&amp;gt;&lt;br /&gt;
For now the [https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Calendar Calendar App] is (along with other functions) also capable of syncing calendar events, but using the old EWS mechanism, which Microsoft announced as end of life starting from 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; Please make sure to not use both apps for syncing calendar events in parallel, this is not supported and will most likely lead to conflicts and unexpected behaviours.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When the configuration of the connector for Microsoft 365 Calendar Presence Sync is complete, the app connects to Microsoft to receive a token with the calendar app registered in the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
With the token, the app can pick up the users from the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
These are matched against the users in the PBX, based on the configured &amp;quot;User Assignment&amp;quot; settings.&amp;lt;br&amp;gt;&lt;br /&gt;
For each matched user with a valid Connector for Microsoft 365 licence applied, a subscription for calendar events is created at Microsoft to receive event changes in Microsoft Calendar for these users.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user subscription is also started to receive user changes (add, delete or update).&amp;lt;br&amp;gt;&lt;br /&gt;
If a user has changed, the users are retrieved again. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a calendar event has been started or ended, it is forwarded to the PBX.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Event subscriptions are renewed every day.&lt;br /&gt;
* License Check is made every hour.&lt;br /&gt;
&lt;br /&gt;
=== Contact Search ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto16r1:Configure Calendar Presence Sync by Connector for Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
Introduced in 16r1 the Connector for Microsoft 365 will offer a possibility to search for your own contacts (Teams, Exchange online) via the Graph API.&lt;br /&gt;
&lt;br /&gt;
When the configuration of the connector for Microsoft 365 Contact Search is complete, the app connects to Microsoft to receive a token with the contact search app registered in the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
With the token, the app can pick up the users from the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
These are matched against the users in the PBX, based on the configured &amp;quot;User Assignment&amp;quot; settings.&amp;lt;br&amp;gt;&lt;br /&gt;
For each matched user with a valid Connector for Microsoft 365 licence applied, the user can search with the Phone App, for example (a myApps search provider will be provided for all apps looking using search providers looking up contacts). The search string is made available to the Connector for Microsoft 365 via the microsoft365-api. The results are sent to the consumer, e.g. the Phone App and presented there.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user subscription is started to receive user changes (add, delete or update).&amp;lt;br&amp;gt;&lt;br /&gt;
If a user has changed, the users are retrieved again. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* License Check is made every hour.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be aware:&#039;&#039;&#039; Since the Connector for Microsoft 365 is an app in the Scope of myApps App Platform, IP Phones and other services not using Apps cannot benefit from this search service.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
&lt;br /&gt;
=Known Limitation=&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&#039;&#039;Applies to the User Presence and the Calendar Presence&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Synchronization Delay ===&lt;br /&gt;
In the official Graph-API documentation, Microsoft is providing an overview about expected latencies for change notifications.&amp;lt;br&amp;gt;&lt;br /&gt;
You can find a whole overview table here:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/change-notifications-overview#latency&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For the user presences the resource &amp;quot;presence&amp;quot; is used and an average latency of 10 seconds but a maximum up to 1 minute is provided.&amp;lt;br&amp;gt;&lt;br /&gt;
Such a delay in syncing changed presences from Teams down to the PBX are considered normal and are caused by the Microsoft Graph-API.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In case of calendar events the average is provided as &amp;quot;less than 1 minute&amp;quot; and the maximum to 3 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Presence ==&lt;br /&gt;
=== Line states set by the PBX does not block calls in Teams ===&lt;br /&gt;
Line states set by a 3rd party application (like the Connector for Microsoft 365) through the graph API are currently &#039;&#039;&#039;only for display purpose and do not block new calls&#039;&#039;&#039; in Teams.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://techcommunity.microsoft.com/t5/teams-developer/ms-graph-setpresence-problems/m-p/2798805/highlight/true#M3957&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the above linked discussion, there once existed a feature request on Microsoft Voice, which is no longer available since it was not voted.&lt;br /&gt;
=== Maximum number of supported users ===&lt;br /&gt;
The connector now supports multiple Microsoft Teams communication users, which is the prerequisite to subscribe for more than 650 users. There is a new ribbon (Manage Teams Accounts) that allows you to configure as many communication users as you need. Every configured communication user can be used to subscribe 650 users, for example:&lt;br /&gt;
&lt;br /&gt;
*3 configured communication users x 650 licensed users = 1950 users can be subscribed&lt;br /&gt;
&#039;&#039;&#039;Please be aware&#039;&#039;&#039;: Each communication user must have a Teams license applied.&lt;br /&gt;
&lt;br /&gt;
This limitation is caused by Microsoft.&amp;lt;br&amp;gt;&lt;br /&gt;
In the documentation of the Graph-API you will find a hint to this limitation:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/changenotifications-for-presence#subscribe-to-multiple-users-presence&amp;lt;br&amp;gt;&lt;br /&gt;
Trying to subscribe more than 650 users (with one communication user) by using the presence subscription API will be declined by the graph API with an error message, that too many users are requested.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Communication User (UserSynctoPbx) ===&lt;br /&gt;
Users with MFA (multi-factor-authentication) are not supported as technical communication user for the Connector.&lt;br /&gt;
&lt;br /&gt;
=== Multiple sites / instances require multiple communication users ===&lt;br /&gt;
Each instance or each site must have separate communication users, as Microsoft only allows one concurrent subscription per communication user. (otherwise an HTTP 409 conflict will occur)&lt;br /&gt;
&lt;br /&gt;
This means that if you want to subscribe to the same Azure Portal backend from two different sites (or instances), you will need to have multiple communication users (each with an applied Teams licence) in order to be able to subscribe from all endpoints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Subscription Timeout ===&lt;br /&gt;
&lt;br /&gt;
==== Situation ====&lt;br /&gt;
Due to a current limitation in the Graph API it is not possible to cancel or delete an active presence subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the [https://learn.microsoft.com/en-us/graph/api/subscription-delete?view=graph-rest-1.0&amp;amp;tabs=http|documentation of the current Graph API (1.0)] the “Delete subscription” chapter does not include presence subscriptions.&amp;lt;br&amp;gt;&lt;br /&gt;
It is also not possible to have multiple subscription in parallel. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make sure to only request a new presence subscription when the old one is not valid anymore, the app will store the state of the presence subscription and the time until it is valid in the database.&amp;lt;br&amp;gt;&lt;br /&gt;
As mentioned in the chapter “Technical Overview” we are creating presence subscriptions with a validity of 10 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
The presence subscription will be renewed as soon as it is no longer valid which will be 10 minutes after initial subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Impact ====&lt;br /&gt;
If settings are changed or the app instance is restarted it will check the corresponding database entry on startup.&amp;lt;br&amp;gt;&lt;br /&gt;
In case the last presence subscription was completed less than 10 minutes ago, there is still an active presence subscription and the app has to wait for it to become invalid. &amp;lt;br&amp;gt;&lt;br /&gt;
Some Changes (e.g., to the “Notification-URL”) will only take effect after a new created subscription. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The current Beta Version of the Graph API is already providing a function to delete presence subscriptions, so we hope we can improve this behavior in the future.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
===Creating an app trace===&lt;br /&gt;
For further analysis and creating a support ticket it will be useful to have a suitable app trace. &amp;lt;br&amp;gt;&lt;br /&gt;
Before creating the trace please make sure the following trace flags are activated for the app instance:&lt;br /&gt;
* App&lt;br /&gt;
* Database&lt;br /&gt;
* HTTP client&lt;br /&gt;
* TLS&lt;br /&gt;
* TCP&lt;br /&gt;
* App WebSocket&lt;br /&gt;
* Config&lt;br /&gt;
* Webserver&lt;br /&gt;
&lt;br /&gt;
After setting the config flags, please make sure to&lt;br /&gt;
* stop the instance&lt;br /&gt;
* deleting the current instance log&lt;br /&gt;
* start the instance&lt;br /&gt;
&#039;&#039;&#039;Now please wait at least 5 Minutes before you save the log&#039;&#039;&#039;, otherwise we could not have the whole picture in the trace.&lt;br /&gt;
&lt;br /&gt;
The restart and deletion of the the old log is useful the see the complete initialization process right away.&lt;br /&gt;
&lt;br /&gt;
===SSL Certificate for notification URL===&lt;br /&gt;
It also is useful to make sure the notification URL has a valid and public signed certificate.&amp;lt;br&amp;gt;&lt;br /&gt;
You can do that, using an SSL-Checker, for example: https://www.sslshopper.com/ssl-checker.html &amp;lt;br&amp;gt;&lt;br /&gt;
Without a valid, public signed certificate, Microsoft will decline the connection since it will not be possible to establish a trust relationship for the SSL/TLS secure channel.&lt;br /&gt;
&lt;br /&gt;
===Correctness of notification URL===&lt;br /&gt;
You can try to open the notification URL in your Browser&amp;lt;br&amp;gt;&lt;br /&gt;
Most likely you will see a HTTP 404 (Not Found) error message, which is the expected behavior since we are not providing an HTML website, the HTTP GET request from the browser will not be answered with content.&amp;lt;br&amp;gt;&lt;br /&gt;
This is perfectly fine since Microsoft will send presence updates with HTTP POST and will not try to request content from our app.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
What you can find out by trying to open the URL in your browser are the two following things: &amp;lt;br&amp;gt;&lt;br /&gt;
* If you receive a HTTP 404 error message you are most likely connected to an App Platform, if not you need to check your DNS (and maybe also reverse proxy) settings.&lt;br /&gt;
* If the URL is modified and the used build number is added, an app has answered your request&lt;br /&gt;
** Example: &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/subscriptions&amp;lt;/code&amp;gt; is modified to &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/&amp;lt;b&amp;gt;1510411&amp;lt;/b&amp;gt;/subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
** If this is not the case, your URL is wrong. (Be aware: The URL depends on the settings of the web server path of your app instance)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be aware:&#039;&#039;&#039; The URL-Recognition in the Application Platform is &#039;&#039;&#039;case sensitive&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Activation of &amp;quot;Public client flow&amp;quot; for the registered app in Azure Portal===&lt;br /&gt;
If the subscription is not working at all, please make sure &amp;quot;Public client flow&amp;quot; is activated for the registered app in the Azure portal (as described in our [[Howto16r1:Configure User Presence Sync by Connector for Microsoft365#Create_an_App_for_syncing_Teams_to_PBX|HowTo article]]).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The App Service trace will contain the following message if this is not the case:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;AADSTS7000218: The request body must contain the following parameter: &#039;client_assertion&#039; or &#039;client_secret&#039;.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Presence == &lt;br /&gt;
===GUI Feedback===&lt;br /&gt;
The app itself shows required states with green and red as connections to the Master PBX, Authentication and Presence Subscription to identify if there are problems. &amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes it needs a little bit time until the states are changed. &amp;lt;br&amp;gt;&lt;br /&gt;
If the states remain, it is mandatory to enable logs on the app platform and check for more information. &amp;lt;br&amp;gt;&lt;br /&gt;
([[Howto13r3:Configure Connector for Microsoft365#Creating an app trace|Concept App Service Connector for Microsoft 365: Creating an app trace]])&lt;br /&gt;
&lt;br /&gt;
====No connection to Master PBX====&lt;br /&gt;
Check the MasterPBX name.&amp;lt;br&amp;gt;&lt;br /&gt;
The field must only contain the name [&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;pbx&amp;lt;/span&amp;gt;], &#039;&#039;&#039;not the full domain&#039;&#039;&#039; [&amp;lt;span style=&amp;quot;color:red;text-decoration: line-through;&amp;quot;&amp;gt;pbx.domain.tld&amp;lt;/span&amp;gt;]. ([[Howto13r3:Configure Connector for Microsoft365#Synchronization from Teams to the PBX|Synchronization from Teams to the PBX - Master PBX field]])&lt;br /&gt;
&lt;br /&gt;
====Presence subscription failed====&lt;br /&gt;
There are many reasons why the &amp;quot;Presence subscription failed&amp;quot; message could be displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
We try to list the most common reasons:&lt;br /&gt;
* The permission for the registered app in the Azure portal are not correctly set ([[Howto13r3:Configure Connector for Microsoft365#Create an App for syncing Teams to PBX|Howto: Create an App for syncing Teams to PBX]])&lt;br /&gt;
* The Notification URL is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The App service is not reachable from the internet ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The certificate for the public endpoint (e.g. reverse proxy) is not valid, or not publicly signed ([[Reference13r3:Concept App Service Connector for Microsoft 365#SSL Certificate for notification URL|Concept App Service Connector for Microsoft 365: SSL Certificate for notification URL]])&lt;br /&gt;
* The user from PBX and the Azure Portal cannot be matched ([[Reference13r3:Concept App Service Connector for Microsoft 365#User Matching|Concept App Service Connector for Microsoft 365: User Matching]])&lt;br /&gt;
* The App Platforms clock time is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#App Platform clock time is wrong|Concept App Service Connector for Microsoft 365: App Platform clock time is wrong]])&lt;br /&gt;
* No user has a valid Connector for Microsoft 365 App license ([[Reference13r3:Concept App Service Connector for Microsoft 365#Requirements|Concept App Service Connector for Microsoft 365: Requirements]])&lt;br /&gt;
&lt;br /&gt;
===Teams License for communication user===&lt;br /&gt;
If presence subscription does not work, please check if all of the configured communication users have a Microsoft Teams license applied and no multifactor authentication is in use for this particular user. &amp;lt;br&amp;gt;&lt;br /&gt;
Also please make sure you can login with the configured credentials. (If you have set a password as an Administration, the user needs to change the password during the first login, therefore the given password will be invalid for API access).&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Sometimes, after changing setting or after the instance has restarted it can take up to 12 minutes until the presence subscription is working correctly. (Due to the subscription timeout)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
== Special Characters In Password ==&lt;br /&gt;
If you are using special characters (*, &amp;amp;, (, ), etc.) in your password you could run into a problem with the authentication of the communication user.&amp;lt;br&amp;gt;&lt;br /&gt;
The authentication failed status is being displayed. &amp;lt;br&amp;gt;&lt;br /&gt;
For the moment the only workaround is to eliminate special characters from your password.&lt;br /&gt;
&lt;br /&gt;
==App Platform clock time is wrong==&lt;br /&gt;
If the clock time at the App Platform is not correct, this will lead to an unstable behaviour of the Connector for Microsoft 365.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the Connector for Microsoft 365 is using the Microsoft Graph APIs presence subscription function, it needs to provide in its request a precise time until the subscription validity will be expired.&amp;lt;br&amp;gt;&lt;br /&gt;
The app service is handling subscription and will automatically recreate a new subscription each time the previous one has expired.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A wrong clock time will lead to false expiration times and thus&lt;br /&gt;
*  the subscription will be expired earlier than expected (synchronisation is not working because there is no valid subscription)&lt;br /&gt;
*  the subscription will be valid longer than expected (the app service is trying to create a new subscription because it is expecting the previous one to be expired - will lead to a 409 conflict error, because only one subscription can be valid at a time)&lt;br /&gt;
&lt;br /&gt;
If you are not sure about the current time of the App Platform, you can login via SSH into the App Platform and execute the &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; command to check the current time.&amp;lt;br&amp;gt;&lt;br /&gt;
You will receive an output like: &lt;br /&gt;
 Tue Mar 12 13:38:57 UTC 2024&lt;br /&gt;
Please be aware: The time is displayed in UTC, so please make sure to convert to your local time zone.&lt;br /&gt;
&lt;br /&gt;
==Geoblocking==&lt;br /&gt;
Since there might be no reliable country assignment for Microsoft addresses, all Microsoft addresses must be enabled on the upstream firewall in the event of geoblocking in order to ensure functionality of the Office365 Connector.&amp;lt;br&amp;gt;&lt;br /&gt;
As an alternative you might be able to configure your firewall to bypass the geoblocking for the configured notification URL.&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
[[Howto16r1:Configure User Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure Calendar Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure Contact Search by Connector for Microsoft365]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=78907</id>
		<title>Reference15r1:Concept App Service Connector for Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=78907"/>
		<updated>2026-02-13T11:21:42Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Activation of &amp;quot;Public client flow&amp;quot; for the registered app in Azure Portal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* Connector for Microsoft 365 from Version 15r1&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Connector for Microsoft 365 synchronizes Microsoft Teams presences with the innovaphone PBX and back, and optionally additionally Calendar presence from Exchange Online (part of the Microsoft 365 Cloud Services).&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX&lt;br /&gt;
* innovaphone Application Platform (minimum version 120004)&lt;br /&gt;
* V15r1&lt;br /&gt;
* App(Connector for Microsoft 365)&lt;br /&gt;
* PBX-App(innovaphone-microsoft365) license per user - order no. 02-00050-009&lt;br /&gt;
&lt;br /&gt;
== Concept ==&lt;br /&gt;
&lt;br /&gt;
=== User Presence ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure User Presence Sync by Connector for Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
If the Connector for Microsoft 365 app is fully configured, the app connects to Microsoft to obtain a token. With the token, the app gets the teams users (with a Teams license) through the Microsoft Graph API.&lt;br /&gt;
A presence subscription to Microsoft is started with the licensed users of the PBX to get presence changes in Microsoft Teams for these users. A user subscription is also started to get changes of the users (adding, deleting or update). If a user has changed, the Teams users are retrieved again. If the presence has changed, it is forwarded to the PBX. The presences of Teams are mapped to the presences of the PBX.&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Presence subscriptions are renewed every 10 minutes.&lt;br /&gt;
* License Check is made periodically.&lt;br /&gt;
&lt;br /&gt;
The app synchronises the PBX presence with Teams through the Graph Api. The on-the-phone presence will be renewed every 5 minutes. The other presences have a lifetime of 1 day but the away has a lifetime of 7 days.&lt;br /&gt;
The lifetimes are described [https://learn.microsoft.com/en-us/graph/api/presence-setuserpreferredpresence?view=graph-rest-1.0&amp;amp;tabs=http here]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please be aware:&#039;&#039;&#039; The actual change of presence or line state will be live, the above-mentioned subscriptions are needed to register against the Microsoft API for changes. &lt;br /&gt;
After successful subscription Microsoft will trigger the Connector for Microsoft 365 App every time a presence or line state for a user has changed.&lt;br /&gt;
The subscription will then be renewed in the above-mentioned time interval to receive further live updates.&lt;br /&gt;
&lt;br /&gt;
===== User Matching =====&lt;br /&gt;
You now can choose the fields used for user matching on either side from the following options:&lt;br /&gt;
* PBX&lt;br /&gt;
** CN (Long Name property from the PBX user object)&lt;br /&gt;
** h323 (Name property from the PBX user object)&lt;br /&gt;
* Azure Portal&lt;br /&gt;
** displayName&lt;br /&gt;
** mail&lt;br /&gt;
** mailNickname&lt;br /&gt;
** onPremisesDistinguishedName&lt;br /&gt;
** onPremisesSamAccountName&lt;br /&gt;
** onPremisesUserPrincipalName&lt;br /&gt;
** userPrincipalName&lt;br /&gt;
&lt;br /&gt;
Additionally, you have the possibility to remove a possibly contained domain from the Azure fields content. &amp;lt;br&amp;gt;&lt;br /&gt;
Example: &#039;user@domain.tld&#039; is transformed to &#039;user&#039;, if this option is checked.&lt;br /&gt;
&lt;br /&gt;
===== Mapping Table =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Teams Presence&lt;br /&gt;
! PBX Presence&lt;br /&gt;
|-&lt;br /&gt;
| Away&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| BeRightBack&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| Busy&lt;br /&gt;
| busy&lt;br /&gt;
|-&lt;br /&gt;
| DoNotDisturb&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| InACall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAMeeting&lt;br /&gt;
| meeting&lt;br /&gt;
|-&lt;br /&gt;
| Inactive&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| PresenceUnknown&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Available&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offline&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offwork&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| OutOfOffice&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| UrgentInterruptionsOnly&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| Presenting&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAConferenceCall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value &amp;quot;online&amp;quot; unsets the Teams presence in the PBX.&lt;br /&gt;
&lt;br /&gt;
===== Master/Slave =====&lt;br /&gt;
&lt;br /&gt;
For Master/Slave combination the &amp;quot;Connector for Microsoft 365&amp;quot; App has to be added to the slave (if no full replication is on). The slave websocket connection is needed to display &amp;quot;on-the-phone&amp;quot; presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Calendar Presence ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure_Calendar_Presence_Sync_by_Connector_for_Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
Introduced in 15r1 the Connector for Microsoft 365 will offer a possibility to sync Azure Portal calendar events (Teams, Exchange online) via the Graph API with the PBX presence.&amp;lt;br&amp;gt;&lt;br /&gt;
For now the [https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Calendar Calendar App] is (along with other functions) also capable of syncing calendar events, but using the old EWS mechanism, which Microsoft announced as end of life starting from 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; Please make sure to not use both apps for syncing calendar events in parallel, this is not supported and will most likely lead to conflicts and unexpected behaviours.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When the configuration of the connector for Microsoft 365 Calendar Presence Sync is complete, the app connects to Microsoft to receive a token with the calendar app registered in the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
With the token, the app can pick up the users from the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
These are matched against the users in the PBX, based on the configured &amp;quot;User Assignment&amp;quot; settings.&amp;lt;br&amp;gt;&lt;br /&gt;
For each matched user with a valid Connector for Microsoft 365 licence applied, a subscription for calendar events is created at Microsoft to receive event changes in Microsoft Calendar for these users.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user subscription is also started to receive user changes (add, delete or update).&amp;lt;br&amp;gt;&lt;br /&gt;
If a user has changed, the users are retrieved again. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a calendar event has been started or ended, it is forwarded to the PBX.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Event subscriptions are renewed every day.&lt;br /&gt;
* License Check is made every hour.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
&lt;br /&gt;
=Known Limitation=&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&#039;&#039;Applies to the User Presence and the Calendar Presence&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Synchronization Delay ===&lt;br /&gt;
In the official Graph-API documentation, Microsoft is providing an overview about expected latencies for change notifications.&amp;lt;br&amp;gt;&lt;br /&gt;
You can find a whole overview table here:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/change-notifications-overview#latency&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For the user presences the resource &amp;quot;presence&amp;quot; is used and an average latency of 10 seconds but a maximum up to 1 minute is provided.&amp;lt;br&amp;gt;&lt;br /&gt;
Such a delay in syncing changed presences from Teams down to the PBX are considered normal and are caused by the Microsoft Graph-API.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In case of calendar events the average is provided as &amp;quot;less than 1 minute&amp;quot; and the maximum to 3 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Presence ==&lt;br /&gt;
=== Line states set by the PBX does not block calls in Teams ===&lt;br /&gt;
Line states set by a 3rd party application (like the Connector for Microsoft 365) through the graph API are currently &#039;&#039;&#039;only for display purpose and do not block new calls&#039;&#039;&#039; in Teams.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://techcommunity.microsoft.com/t5/teams-developer/ms-graph-setpresence-problems/m-p/2798805/highlight/true#M3957&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the above linked discussion, there once existed a feature request on Microsoft Voice, which is no longer available since it was not voted.&lt;br /&gt;
=== Maximum number of supported users ===&lt;br /&gt;
The connector now supports multiple Microsoft Teams communication users, which is the prerequisite to subscribe for more than 650 users. There is a new ribbon (Manage Teams Accounts) that allows you to configure as many communication users as you need. Every configured communication user can be used to subscribe 650 users, for example:&lt;br /&gt;
&lt;br /&gt;
*3 configured communication users x 650 licensed users = 1950 users can be subscribed&lt;br /&gt;
&#039;&#039;&#039;Please be aware&#039;&#039;&#039;: Each communication user must have a Teams license applied.&lt;br /&gt;
&lt;br /&gt;
This limitation is caused by Microsoft.&amp;lt;br&amp;gt;&lt;br /&gt;
In the documentation of the Graph-API you will find a hint to this limitation:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/changenotifications-for-presence#subscribe-to-multiple-users-presence&amp;lt;br&amp;gt;&lt;br /&gt;
Trying to subscribe more than 650 users (with one communication user) by using the presence subscription API will be declined by the graph API with an error message, that too many users are requested.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Communication User (UserSynctoPbx) ===&lt;br /&gt;
Users with MFA (multi-factor-authentication) are not supported as technical communication user for the Connector.&lt;br /&gt;
&lt;br /&gt;
=== Multiple sites / instances require multiple communication users ===&lt;br /&gt;
Each instance or each site must have separate communication users, as Microsoft only allows one concurrent subscription per communication user. (otherwise an HTTP 409 conflict will occur)&lt;br /&gt;
&lt;br /&gt;
This means that if you want to subscribe to the same Azure Portal backend from two different sites (or instances), you will need to have multiple communication users (each with an applied Teams licence) in order to be able to subscribe from all endpoints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Subscription Timeout ===&lt;br /&gt;
&lt;br /&gt;
==== Situation ====&lt;br /&gt;
Due to a current limitation in the Graph API it is not possible to cancel or delete an active presence subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the [https://learn.microsoft.com/en-us/graph/api/subscription-delete?view=graph-rest-1.0&amp;amp;tabs=http|documentation of the current Graph API (1.0)] the “Delete subscription” chapter does not include presence subscriptions.&amp;lt;br&amp;gt;&lt;br /&gt;
It is also not possible to have multiple subscription in parallel. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make sure to only request a new presence subscription when the old one is not valid anymore, the app will store the state of the presence subscription and the time until it is valid in the database.&amp;lt;br&amp;gt;&lt;br /&gt;
As mentioned in the chapter “Technical Overview” we are creating presence subscriptions with a validity of 10 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
The presence subscription will be renewed as soon as it is no longer valid which will be 10 minutes after initial subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Impact ====&lt;br /&gt;
If settings are changed or the app instance is restarted it will check the corresponding database entry on startup.&amp;lt;br&amp;gt;&lt;br /&gt;
In case the last presence subscription was completed less than 10 minutes ago, there is still an active presence subscription and the app has to wait for it to become invalid. &amp;lt;br&amp;gt;&lt;br /&gt;
Some Changes (e.g., to the “Notification-URL”) will only take effect after a new created subscription. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The current Beta Version of the Graph API is already providing a function to delete presence subscriptions, so we hope we can improve this behavior in the future.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
===Creating an app trace===&lt;br /&gt;
For further analysis and creating a support ticket it will be useful to have a suitable app trace. &amp;lt;br&amp;gt;&lt;br /&gt;
Before creating the trace please make sure the following trace flags are activated for the app instance:&lt;br /&gt;
* App&lt;br /&gt;
* Database&lt;br /&gt;
* HTTP client&lt;br /&gt;
* TLS&lt;br /&gt;
* TCP&lt;br /&gt;
* App WebSocket&lt;br /&gt;
* Config&lt;br /&gt;
* Webserver&lt;br /&gt;
&lt;br /&gt;
After setting the config flags, please make sure to&lt;br /&gt;
* stop the instance&lt;br /&gt;
* deleting the current instance log&lt;br /&gt;
* start the instance&lt;br /&gt;
&#039;&#039;&#039;Now please wait at least 5 Minutes before you save the log&#039;&#039;&#039;, otherwise we could not have the whole picture in the trace.&lt;br /&gt;
&lt;br /&gt;
The restart and deletion of the the old log is useful the see the complete initialization process right away.&lt;br /&gt;
&lt;br /&gt;
===SSL Certificate for notification URL===&lt;br /&gt;
It also is useful to make sure the notification URL has a valid and public signed certificate.&amp;lt;br&amp;gt;&lt;br /&gt;
You can do that, using an SSL-Checker, for example: https://www.sslshopper.com/ssl-checker.html &amp;lt;br&amp;gt;&lt;br /&gt;
Without a valid, public signed certificate, Microsoft will decline the connection since it will not be possible to establish a trust relationship for the SSL/TLS secure channel.&lt;br /&gt;
&lt;br /&gt;
===Correctness of notification URL===&lt;br /&gt;
You can try to open the notification URL in your Browser&amp;lt;br&amp;gt;&lt;br /&gt;
Most likely you will see a HTTP 404 (Not Found) error message, which is the expected behavior since we are not providing an HTML website, the HTTP GET request from the browser will not be answered with content.&amp;lt;br&amp;gt;&lt;br /&gt;
This is perfectly fine since Microsoft will send presence updates with HTTP POST and will not try to request content from our app.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
What you can find out by trying to open the URL in your browser are the two following things: &amp;lt;br&amp;gt;&lt;br /&gt;
* If you receive a HTTP 404 error message you are most likely connected to an App Platform, if not you need to check your DNS (and maybe also reverse proxy) settings.&lt;br /&gt;
* If the URL is modified and the used build number is added, an app has answered your request&lt;br /&gt;
** Example: &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/subscriptions&amp;lt;/code&amp;gt; is modified to &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/&amp;lt;b&amp;gt;1510411&amp;lt;/b&amp;gt;/subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
** If this is not the case, your URL is wrong. (Be aware: The URL depends on the settings of the web server path of your app instance)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be aware:&#039;&#039;&#039; The URL-Recognition in the Application Platform is &#039;&#039;&#039;case sensitive&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Activation of &amp;quot;Public client flow&amp;quot; for the registered app in Azure Portal===&lt;br /&gt;
If the subscription is not working at all, please make sure &amp;quot;Public client flow&amp;quot; is activated for the registered app in the Azure portal (as described in our [[Howto15r1:Configure User Presence Sync by Connector for Microsoft365#Create_an_App_for_syncing_Teams_to_PBX|HowTo article]]).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The App Service trace will contain the following message if this is not the case:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;AADSTS7000218: The request body must contain the following parameter: &#039;client_assertion&#039; or &#039;client_secret&#039;.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Presence == &lt;br /&gt;
===GUI Feedback===&lt;br /&gt;
The app itself shows required states with green and red as connections to the Master PBX, Authentication and Presence Subscription to identify if there are problems. &amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes it needs a little bit time until the states are changed. &amp;lt;br&amp;gt;&lt;br /&gt;
If the states remain, it is mandatory to enable logs on the app platform and check for more information. &amp;lt;br&amp;gt;&lt;br /&gt;
([[Howto13r3:Configure Connector for Microsoft365#Creating an app trace|Concept App Service Connector for Microsoft 365: Creating an app trace]])&lt;br /&gt;
&lt;br /&gt;
====No connection to Master PBX====&lt;br /&gt;
Check the MasterPBX name.&amp;lt;br&amp;gt;&lt;br /&gt;
The field must only contain the name [&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;pbx&amp;lt;/span&amp;gt;], &#039;&#039;&#039;not the full domain&#039;&#039;&#039; [&amp;lt;span style=&amp;quot;color:red;text-decoration: line-through;&amp;quot;&amp;gt;pbx.domain.tld&amp;lt;/span&amp;gt;]. ([[Howto13r3:Configure Connector for Microsoft365#Synchronization from Teams to the PBX|Synchronization from Teams to the PBX - Master PBX field]])&lt;br /&gt;
&lt;br /&gt;
====Presence subscription failed====&lt;br /&gt;
There are many reasons why the &amp;quot;Presence subscription failed&amp;quot; message could be displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
We try to list the most common reasons:&lt;br /&gt;
* The permission for the registered app in the Azure portal are not correctly set ([[Howto13r3:Configure Connector for Microsoft365#Create an App for syncing Teams to PBX|Howto: Create an App for syncing Teams to PBX]])&lt;br /&gt;
* The Notification URL is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The App service is not reachable from the internet ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The certificate for the public endpoint (e.g. reverse proxy) is not valid, or not publicly signed ([[Reference13r3:Concept App Service Connector for Microsoft 365#SSL Certificate for notification URL|Concept App Service Connector for Microsoft 365: SSL Certificate for notification URL]])&lt;br /&gt;
* The user from PBX and the Azure Portal cannot be matched ([[Reference13r3:Concept App Service Connector for Microsoft 365#User Matching|Concept App Service Connector for Microsoft 365: User Matching]])&lt;br /&gt;
* The App Platforms clock time is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#App Platform clock time is wrong|Concept App Service Connector for Microsoft 365: App Platform clock time is wrong]])&lt;br /&gt;
* No user has a valid Connector for Microsoft 365 App license ([[Reference13r3:Concept App Service Connector for Microsoft 365#Requirements|Concept App Service Connector for Microsoft 365: Requirements]])&lt;br /&gt;
&lt;br /&gt;
===Teams License for communication user===&lt;br /&gt;
If presence subscription does not work, please check if all of the configured communication users have a Microsoft Teams license applied and no multifactor authentication is in use for this particular user. &amp;lt;br&amp;gt;&lt;br /&gt;
Also please make sure you can login with the configured credentials. (If you have set a password as an Administration, the user needs to change the password during the first login, therefore the given password will be invalid for API access).&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Sometimes, after changing setting or after the instance has restarted it can take up to 12 minutes until the presence subscription is working correctly. (Due to the subscription timeout)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
== Special Characters In Password ==&lt;br /&gt;
If you are using special characters (*, &amp;amp;, (, ), etc.) in your password you could run into a problem with the authentication of the communication user.&amp;lt;br&amp;gt;&lt;br /&gt;
The authentication failed status is being displayed. &amp;lt;br&amp;gt;&lt;br /&gt;
For the moment the only workaround is to eliminate special characters from your password.&lt;br /&gt;
&lt;br /&gt;
==App Platform clock time is wrong==&lt;br /&gt;
If the clock time at the App Platform is not correct, this will lead to an unstable behaviour of the Connector for Microsoft 365.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the Connector for Microsoft 365 is using the Microsoft Graph APIs presence subscription function, it needs to provide in its request a precise time until the subscription validity will be expired.&amp;lt;br&amp;gt;&lt;br /&gt;
The app service is handling subscription and will automatically recreate a new subscription each time the previous one has expired.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A wrong clock time will lead to false expiration times and thus&lt;br /&gt;
*  the subscription will be expired earlier than expected (synchronisation is not working because there is no valid subscription)&lt;br /&gt;
*  the subscription will be valid longer than expected (the app service is trying to create a new subscription because it is expecting the previous one to be expired - will lead to a 409 conflict error, because only one subscription can be valid at a time)&lt;br /&gt;
&lt;br /&gt;
If you are not sure about the current time of the App Platform, you can login via SSH into the App Platform and execute the &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; command to check the current time.&amp;lt;br&amp;gt;&lt;br /&gt;
You will receive an output like: &lt;br /&gt;
 Tue Mar 12 13:38:57 UTC 2024&lt;br /&gt;
Please be aware: The time is displayed in UTC, so please make sure to convert to your local time zone.&lt;br /&gt;
&lt;br /&gt;
==Geoblocking==&lt;br /&gt;
Since there might be no reliable country assignment for Microsoft addresses, all Microsoft addresses must be enabled on the upstream firewall in the event of geoblocking in order to ensure functionality of the Office365 Connector.&amp;lt;br&amp;gt;&lt;br /&gt;
As an alternative you might be able to configure your firewall to bypass the geoblocking for the configured notification URL.&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
[[Howto15r1:Configure User Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto15r1:Configure Calendar Presence Sync by Connector for Microsoft365]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=78906</id>
		<title>Reference15r1:Concept App Service Connector for Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=78906"/>
		<updated>2026-02-13T11:20:32Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Correctness of notification URL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* Connector for Microsoft 365 from Version 15r1&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Connector for Microsoft 365 synchronizes Microsoft Teams presences with the innovaphone PBX and back, and optionally additionally Calendar presence from Exchange Online (part of the Microsoft 365 Cloud Services).&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX&lt;br /&gt;
* innovaphone Application Platform (minimum version 120004)&lt;br /&gt;
* V15r1&lt;br /&gt;
* App(Connector for Microsoft 365)&lt;br /&gt;
* PBX-App(innovaphone-microsoft365) license per user - order no. 02-00050-009&lt;br /&gt;
&lt;br /&gt;
== Concept ==&lt;br /&gt;
&lt;br /&gt;
=== User Presence ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure User Presence Sync by Connector for Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
If the Connector for Microsoft 365 app is fully configured, the app connects to Microsoft to obtain a token. With the token, the app gets the teams users (with a Teams license) through the Microsoft Graph API.&lt;br /&gt;
A presence subscription to Microsoft is started with the licensed users of the PBX to get presence changes in Microsoft Teams for these users. A user subscription is also started to get changes of the users (adding, deleting or update). If a user has changed, the Teams users are retrieved again. If the presence has changed, it is forwarded to the PBX. The presences of Teams are mapped to the presences of the PBX.&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Presence subscriptions are renewed every 10 minutes.&lt;br /&gt;
* License Check is made periodically.&lt;br /&gt;
&lt;br /&gt;
The app synchronises the PBX presence with Teams through the Graph Api. The on-the-phone presence will be renewed every 5 minutes. The other presences have a lifetime of 1 day but the away has a lifetime of 7 days.&lt;br /&gt;
The lifetimes are described [https://learn.microsoft.com/en-us/graph/api/presence-setuserpreferredpresence?view=graph-rest-1.0&amp;amp;tabs=http here]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please be aware:&#039;&#039;&#039; The actual change of presence or line state will be live, the above-mentioned subscriptions are needed to register against the Microsoft API for changes. &lt;br /&gt;
After successful subscription Microsoft will trigger the Connector for Microsoft 365 App every time a presence or line state for a user has changed.&lt;br /&gt;
The subscription will then be renewed in the above-mentioned time interval to receive further live updates.&lt;br /&gt;
&lt;br /&gt;
===== User Matching =====&lt;br /&gt;
You now can choose the fields used for user matching on either side from the following options:&lt;br /&gt;
* PBX&lt;br /&gt;
** CN (Long Name property from the PBX user object)&lt;br /&gt;
** h323 (Name property from the PBX user object)&lt;br /&gt;
* Azure Portal&lt;br /&gt;
** displayName&lt;br /&gt;
** mail&lt;br /&gt;
** mailNickname&lt;br /&gt;
** onPremisesDistinguishedName&lt;br /&gt;
** onPremisesSamAccountName&lt;br /&gt;
** onPremisesUserPrincipalName&lt;br /&gt;
** userPrincipalName&lt;br /&gt;
&lt;br /&gt;
Additionally, you have the possibility to remove a possibly contained domain from the Azure fields content. &amp;lt;br&amp;gt;&lt;br /&gt;
Example: &#039;user@domain.tld&#039; is transformed to &#039;user&#039;, if this option is checked.&lt;br /&gt;
&lt;br /&gt;
===== Mapping Table =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Teams Presence&lt;br /&gt;
! PBX Presence&lt;br /&gt;
|-&lt;br /&gt;
| Away&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| BeRightBack&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| Busy&lt;br /&gt;
| busy&lt;br /&gt;
|-&lt;br /&gt;
| DoNotDisturb&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| InACall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAMeeting&lt;br /&gt;
| meeting&lt;br /&gt;
|-&lt;br /&gt;
| Inactive&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| PresenceUnknown&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Available&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offline&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offwork&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| OutOfOffice&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| UrgentInterruptionsOnly&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| Presenting&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAConferenceCall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value &amp;quot;online&amp;quot; unsets the Teams presence in the PBX.&lt;br /&gt;
&lt;br /&gt;
===== Master/Slave =====&lt;br /&gt;
&lt;br /&gt;
For Master/Slave combination the &amp;quot;Connector for Microsoft 365&amp;quot; App has to be added to the slave (if no full replication is on). The slave websocket connection is needed to display &amp;quot;on-the-phone&amp;quot; presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Calendar Presence ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure_Calendar_Presence_Sync_by_Connector_for_Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
Introduced in 15r1 the Connector for Microsoft 365 will offer a possibility to sync Azure Portal calendar events (Teams, Exchange online) via the Graph API with the PBX presence.&amp;lt;br&amp;gt;&lt;br /&gt;
For now the [https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Calendar Calendar App] is (along with other functions) also capable of syncing calendar events, but using the old EWS mechanism, which Microsoft announced as end of life starting from 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; Please make sure to not use both apps for syncing calendar events in parallel, this is not supported and will most likely lead to conflicts and unexpected behaviours.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When the configuration of the connector for Microsoft 365 Calendar Presence Sync is complete, the app connects to Microsoft to receive a token with the calendar app registered in the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
With the token, the app can pick up the users from the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
These are matched against the users in the PBX, based on the configured &amp;quot;User Assignment&amp;quot; settings.&amp;lt;br&amp;gt;&lt;br /&gt;
For each matched user with a valid Connector for Microsoft 365 licence applied, a subscription for calendar events is created at Microsoft to receive event changes in Microsoft Calendar for these users.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user subscription is also started to receive user changes (add, delete or update).&amp;lt;br&amp;gt;&lt;br /&gt;
If a user has changed, the users are retrieved again. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a calendar event has been started or ended, it is forwarded to the PBX.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Event subscriptions are renewed every day.&lt;br /&gt;
* License Check is made every hour.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
&lt;br /&gt;
=Known Limitation=&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&#039;&#039;Applies to the User Presence and the Calendar Presence&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Synchronization Delay ===&lt;br /&gt;
In the official Graph-API documentation, Microsoft is providing an overview about expected latencies for change notifications.&amp;lt;br&amp;gt;&lt;br /&gt;
You can find a whole overview table here:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/change-notifications-overview#latency&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For the user presences the resource &amp;quot;presence&amp;quot; is used and an average latency of 10 seconds but a maximum up to 1 minute is provided.&amp;lt;br&amp;gt;&lt;br /&gt;
Such a delay in syncing changed presences from Teams down to the PBX are considered normal and are caused by the Microsoft Graph-API.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In case of calendar events the average is provided as &amp;quot;less than 1 minute&amp;quot; and the maximum to 3 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Presence ==&lt;br /&gt;
=== Line states set by the PBX does not block calls in Teams ===&lt;br /&gt;
Line states set by a 3rd party application (like the Connector for Microsoft 365) through the graph API are currently &#039;&#039;&#039;only for display purpose and do not block new calls&#039;&#039;&#039; in Teams.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://techcommunity.microsoft.com/t5/teams-developer/ms-graph-setpresence-problems/m-p/2798805/highlight/true#M3957&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the above linked discussion, there once existed a feature request on Microsoft Voice, which is no longer available since it was not voted.&lt;br /&gt;
=== Maximum number of supported users ===&lt;br /&gt;
The connector now supports multiple Microsoft Teams communication users, which is the prerequisite to subscribe for more than 650 users. There is a new ribbon (Manage Teams Accounts) that allows you to configure as many communication users as you need. Every configured communication user can be used to subscribe 650 users, for example:&lt;br /&gt;
&lt;br /&gt;
*3 configured communication users x 650 licensed users = 1950 users can be subscribed&lt;br /&gt;
&#039;&#039;&#039;Please be aware&#039;&#039;&#039;: Each communication user must have a Teams license applied.&lt;br /&gt;
&lt;br /&gt;
This limitation is caused by Microsoft.&amp;lt;br&amp;gt;&lt;br /&gt;
In the documentation of the Graph-API you will find a hint to this limitation:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/changenotifications-for-presence#subscribe-to-multiple-users-presence&amp;lt;br&amp;gt;&lt;br /&gt;
Trying to subscribe more than 650 users (with one communication user) by using the presence subscription API will be declined by the graph API with an error message, that too many users are requested.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Communication User (UserSynctoPbx) ===&lt;br /&gt;
Users with MFA (multi-factor-authentication) are not supported as technical communication user for the Connector.&lt;br /&gt;
&lt;br /&gt;
=== Multiple sites / instances require multiple communication users ===&lt;br /&gt;
Each instance or each site must have separate communication users, as Microsoft only allows one concurrent subscription per communication user. (otherwise an HTTP 409 conflict will occur)&lt;br /&gt;
&lt;br /&gt;
This means that if you want to subscribe to the same Azure Portal backend from two different sites (or instances), you will need to have multiple communication users (each with an applied Teams licence) in order to be able to subscribe from all endpoints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Subscription Timeout ===&lt;br /&gt;
&lt;br /&gt;
==== Situation ====&lt;br /&gt;
Due to a current limitation in the Graph API it is not possible to cancel or delete an active presence subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the [https://learn.microsoft.com/en-us/graph/api/subscription-delete?view=graph-rest-1.0&amp;amp;tabs=http|documentation of the current Graph API (1.0)] the “Delete subscription” chapter does not include presence subscriptions.&amp;lt;br&amp;gt;&lt;br /&gt;
It is also not possible to have multiple subscription in parallel. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make sure to only request a new presence subscription when the old one is not valid anymore, the app will store the state of the presence subscription and the time until it is valid in the database.&amp;lt;br&amp;gt;&lt;br /&gt;
As mentioned in the chapter “Technical Overview” we are creating presence subscriptions with a validity of 10 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
The presence subscription will be renewed as soon as it is no longer valid which will be 10 minutes after initial subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Impact ====&lt;br /&gt;
If settings are changed or the app instance is restarted it will check the corresponding database entry on startup.&amp;lt;br&amp;gt;&lt;br /&gt;
In case the last presence subscription was completed less than 10 minutes ago, there is still an active presence subscription and the app has to wait for it to become invalid. &amp;lt;br&amp;gt;&lt;br /&gt;
Some Changes (e.g., to the “Notification-URL”) will only take effect after a new created subscription. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The current Beta Version of the Graph API is already providing a function to delete presence subscriptions, so we hope we can improve this behavior in the future.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
===Creating an app trace===&lt;br /&gt;
For further analysis and creating a support ticket it will be useful to have a suitable app trace. &amp;lt;br&amp;gt;&lt;br /&gt;
Before creating the trace please make sure the following trace flags are activated for the app instance:&lt;br /&gt;
* App&lt;br /&gt;
* Database&lt;br /&gt;
* HTTP client&lt;br /&gt;
* TLS&lt;br /&gt;
* TCP&lt;br /&gt;
* App WebSocket&lt;br /&gt;
* Config&lt;br /&gt;
* Webserver&lt;br /&gt;
&lt;br /&gt;
After setting the config flags, please make sure to&lt;br /&gt;
* stop the instance&lt;br /&gt;
* deleting the current instance log&lt;br /&gt;
* start the instance&lt;br /&gt;
&#039;&#039;&#039;Now please wait at least 5 Minutes before you save the log&#039;&#039;&#039;, otherwise we could not have the whole picture in the trace.&lt;br /&gt;
&lt;br /&gt;
The restart and deletion of the the old log is useful the see the complete initialization process right away.&lt;br /&gt;
&lt;br /&gt;
===SSL Certificate for notification URL===&lt;br /&gt;
It also is useful to make sure the notification URL has a valid and public signed certificate.&amp;lt;br&amp;gt;&lt;br /&gt;
You can do that, using an SSL-Checker, for example: https://www.sslshopper.com/ssl-checker.html &amp;lt;br&amp;gt;&lt;br /&gt;
Without a valid, public signed certificate, Microsoft will decline the connection since it will not be possible to establish a trust relationship for the SSL/TLS secure channel.&lt;br /&gt;
&lt;br /&gt;
===Correctness of notification URL===&lt;br /&gt;
You can try to open the notification URL in your Browser&amp;lt;br&amp;gt;&lt;br /&gt;
Most likely you will see a HTTP 404 (Not Found) error message, which is the expected behavior since we are not providing an HTML website, the HTTP GET request from the browser will not be answered with content.&amp;lt;br&amp;gt;&lt;br /&gt;
This is perfectly fine since Microsoft will send presence updates with HTTP POST and will not try to request content from our app.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
What you can find out by trying to open the URL in your browser are the two following things: &amp;lt;br&amp;gt;&lt;br /&gt;
* If you receive a HTTP 404 error message you are most likely connected to an App Platform, if not you need to check your DNS (and maybe also reverse proxy) settings.&lt;br /&gt;
* If the URL is modified and the used build number is added, an app has answered your request&lt;br /&gt;
** Example: &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/subscriptions&amp;lt;/code&amp;gt; is modified to &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/&amp;lt;b&amp;gt;1510411&amp;lt;/b&amp;gt;/subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
** If this is not the case, your URL is wrong. (Be aware: The URL depends on the settings of the web server path of your app instance)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be aware:&#039;&#039;&#039; The URL-Recognition in the Application Platform is &#039;&#039;&#039;case sensitive&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Activation of &amp;quot;Public client flow&amp;quot; for the registered app in Azure Portal===&lt;br /&gt;
If the subscription is not working at all, please make sure &amp;quot;Public client flow&amp;quot; is activated for the registered app in the Azure portal (as described in our [[Howto15r1:Configure User Presence Sync by Connector for Microsoft365|HowTo article]]).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The App Service trace will contain the following message if this is not the case:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;AADSTS7000218: The request body must contain the following parameter: &#039;client_assertion&#039; or &#039;client_secret&#039;.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Presence == &lt;br /&gt;
===GUI Feedback===&lt;br /&gt;
The app itself shows required states with green and red as connections to the Master PBX, Authentication and Presence Subscription to identify if there are problems. &amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes it needs a little bit time until the states are changed. &amp;lt;br&amp;gt;&lt;br /&gt;
If the states remain, it is mandatory to enable logs on the app platform and check for more information. &amp;lt;br&amp;gt;&lt;br /&gt;
([[Howto13r3:Configure Connector for Microsoft365#Creating an app trace|Concept App Service Connector for Microsoft 365: Creating an app trace]])&lt;br /&gt;
&lt;br /&gt;
====No connection to Master PBX====&lt;br /&gt;
Check the MasterPBX name.&amp;lt;br&amp;gt;&lt;br /&gt;
The field must only contain the name [&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;pbx&amp;lt;/span&amp;gt;], &#039;&#039;&#039;not the full domain&#039;&#039;&#039; [&amp;lt;span style=&amp;quot;color:red;text-decoration: line-through;&amp;quot;&amp;gt;pbx.domain.tld&amp;lt;/span&amp;gt;]. ([[Howto13r3:Configure Connector for Microsoft365#Synchronization from Teams to the PBX|Synchronization from Teams to the PBX - Master PBX field]])&lt;br /&gt;
&lt;br /&gt;
====Presence subscription failed====&lt;br /&gt;
There are many reasons why the &amp;quot;Presence subscription failed&amp;quot; message could be displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
We try to list the most common reasons:&lt;br /&gt;
* The permission for the registered app in the Azure portal are not correctly set ([[Howto13r3:Configure Connector for Microsoft365#Create an App for syncing Teams to PBX|Howto: Create an App for syncing Teams to PBX]])&lt;br /&gt;
* The Notification URL is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The App service is not reachable from the internet ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The certificate for the public endpoint (e.g. reverse proxy) is not valid, or not publicly signed ([[Reference13r3:Concept App Service Connector for Microsoft 365#SSL Certificate for notification URL|Concept App Service Connector for Microsoft 365: SSL Certificate for notification URL]])&lt;br /&gt;
* The user from PBX and the Azure Portal cannot be matched ([[Reference13r3:Concept App Service Connector for Microsoft 365#User Matching|Concept App Service Connector for Microsoft 365: User Matching]])&lt;br /&gt;
* The App Platforms clock time is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#App Platform clock time is wrong|Concept App Service Connector for Microsoft 365: App Platform clock time is wrong]])&lt;br /&gt;
* No user has a valid Connector for Microsoft 365 App license ([[Reference13r3:Concept App Service Connector for Microsoft 365#Requirements|Concept App Service Connector for Microsoft 365: Requirements]])&lt;br /&gt;
&lt;br /&gt;
===Teams License for communication user===&lt;br /&gt;
If presence subscription does not work, please check if all of the configured communication users have a Microsoft Teams license applied and no multifactor authentication is in use for this particular user. &amp;lt;br&amp;gt;&lt;br /&gt;
Also please make sure you can login with the configured credentials. (If you have set a password as an Administration, the user needs to change the password during the first login, therefore the given password will be invalid for API access).&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Sometimes, after changing setting or after the instance has restarted it can take up to 12 minutes until the presence subscription is working correctly. (Due to the subscription timeout)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
== Special Characters In Password ==&lt;br /&gt;
If you are using special characters (*, &amp;amp;, (, ), etc.) in your password you could run into a problem with the authentication of the communication user.&amp;lt;br&amp;gt;&lt;br /&gt;
The authentication failed status is being displayed. &amp;lt;br&amp;gt;&lt;br /&gt;
For the moment the only workaround is to eliminate special characters from your password.&lt;br /&gt;
&lt;br /&gt;
==App Platform clock time is wrong==&lt;br /&gt;
If the clock time at the App Platform is not correct, this will lead to an unstable behaviour of the Connector for Microsoft 365.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the Connector for Microsoft 365 is using the Microsoft Graph APIs presence subscription function, it needs to provide in its request a precise time until the subscription validity will be expired.&amp;lt;br&amp;gt;&lt;br /&gt;
The app service is handling subscription and will automatically recreate a new subscription each time the previous one has expired.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A wrong clock time will lead to false expiration times and thus&lt;br /&gt;
*  the subscription will be expired earlier than expected (synchronisation is not working because there is no valid subscription)&lt;br /&gt;
*  the subscription will be valid longer than expected (the app service is trying to create a new subscription because it is expecting the previous one to be expired - will lead to a 409 conflict error, because only one subscription can be valid at a time)&lt;br /&gt;
&lt;br /&gt;
If you are not sure about the current time of the App Platform, you can login via SSH into the App Platform and execute the &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; command to check the current time.&amp;lt;br&amp;gt;&lt;br /&gt;
You will receive an output like: &lt;br /&gt;
 Tue Mar 12 13:38:57 UTC 2024&lt;br /&gt;
Please be aware: The time is displayed in UTC, so please make sure to convert to your local time zone.&lt;br /&gt;
&lt;br /&gt;
==Geoblocking==&lt;br /&gt;
Since there might be no reliable country assignment for Microsoft addresses, all Microsoft addresses must be enabled on the upstream firewall in the event of geoblocking in order to ensure functionality of the Office365 Connector.&amp;lt;br&amp;gt;&lt;br /&gt;
As an alternative you might be able to configure your firewall to bypass the geoblocking for the configured notification URL.&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
[[Howto15r1:Configure User Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto15r1:Configure Calendar Presence Sync by Connector for Microsoft365]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Conference_Transcriptions&amp;diff=78841</id>
		<title>Reference16r1:Concept App Service Conference Transcriptions</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Conference_Transcriptions&amp;diff=78841"/>
		<updated>2026-01-30T11:40:11Z</updated>

		<summary type="html">&lt;p&gt;Tfu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This article is still work in progress}}&lt;br /&gt;
[[Category:Concept|Apps]]&lt;br /&gt;
[[Category:Concept App Service Conference Transcriptions]]&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone Conference Transciptions from version 16r1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
[[File:Reference16r1 Concept App Service Conference Transcriptions Softphone App.png|thumb|309x309px|After the meeting ended, find the created summary|reference16r1_concept_app_service_conference_transcriptions_softphone_app.png/]]&lt;br /&gt;
The main goal of the Conference Transcriptions Service is to create video‑conference meeting summaries, which can be accessed in the Phone Apps.&lt;br /&gt;
&lt;br /&gt;
To achieve this:&lt;br /&gt;
# Users can start a transcription of the conference audio by clicking the &#039;&#039;&#039;“Transcribe Conference”&#039;&#039;&#039; button in the Phone Apps.&lt;br /&gt;
#* This action makes the Conference Transcriptions service connect to the conference room.&lt;br /&gt;
#* It records the audio and creates audio files of approximately one minute in length.&lt;br /&gt;
#* It forwards these small audio files via the com.innovaphone.transcriptions API, offered by the Transcriptions Service ([[Reference16r1:Concept_App_Service_Transcriptions]])&lt;br /&gt;
#* It receives the transcripts of these small files and stores them in the service database.&lt;br /&gt;
# If the user stops the transcription by clicking on the &amp;quot;&#039;&#039;&#039;Transcribe Conference&#039;&#039;&#039;&amp;quot; Button again&lt;br /&gt;
#* The Conference Transcriptions Service gathers the transcribed text from the database&lt;br /&gt;
#* It retrieves the prompt configured in the settings plugin [[Reference16r1:Apps/PbxManager/App myApps ConferenceTranscriptions]]&lt;br /&gt;
#* It sends the transcript together with the prompt to the Assistant App Service via the com.innovaphone.assistant API&lt;br /&gt;
#* It receives the meeting summary and stores that summary in the database of the service&lt;br /&gt;
# Users may start and stop transcriptions multiple times during a meeting. As long as users remain in the room, the service recognizes that the meeting is still the same for that room.&lt;br /&gt;
# After the meeting, users can find the AI‑generated meeting summary in the call list of their Phone Apps by clicking on the &#039;&#039;&#039;“i”&#039;&#039;&#039; button.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
&lt;br /&gt;
In order to use the service you will need the newly introduced &#039;&#039;&#039;UCC license&#039;&#039;&#039;&lt;br /&gt;
== Installation ==&lt;br /&gt;
Go to the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (fomerly known as PBX manager) and open the &#039;&#039;&#039;&amp;quot;AP app installer&amp;quot;&#039;&#039;&#039; plugin. On the right panel, the App Store will be shown. &#039;&#039;Hint : if you access it for the first time, you will need to accept the &amp;quot;Terms of Use of the innovaphone App Store&amp;quot;&#039;&#039;&lt;br /&gt;
* In the search field located on the top right corner of the store, search for &#039;&#039;&#039;&amp;quot;Conference Transcriptions&amp;quot;&#039;&#039;&#039; and click on it.&lt;br /&gt;
* Select the proper firmware version, for example &#039;&#039;&#039;&amp;quot;Version 16r1&amp;quot;&#039;&#039;&#039; and click on install.&lt;br /&gt;
* Tick &amp;quot;I accept the terms of use&amp;quot; and continue by clicking on the install yellow button.&lt;br /&gt;
* Wait until the install has been finished.&lt;br /&gt;
* Close and reopen the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (PBX manager) in order to refresh the list of the available colored AP plugin icons.&lt;br /&gt;
* Open the &#039;&#039;&#039;&amp;quot;AP Conference Transcriptions&amp;quot;&#039;&#039;&#039; Plugin by clicking on it and click on &#039;&#039;&#039;&amp;quot; + Add an App&amp;quot;&#039;&#039;&#039; and then on the &#039;&#039;&#039;&amp;quot;Conference Transcriptions API&amp;quot;&#039;&#039;&#039; button.&lt;br /&gt;
* Enter a &#039;&#039;&#039;&amp;quot;Name&amp;quot;&#039;&#039;&#039; &#039;&#039;(used as display name / all character allowed)&#039;&#039; and the &#039;&#039;&#039;&amp;quot;SIP&amp;quot;&#039;&#039;&#039; &#039;&#039;(no space, no capital letters)&#039;&#039;. &#039;&#039;e.g : Name: Conference Transcriptions API, SIP: conference-transcriptions-api&#039;&#039;&lt;br /&gt;
* Choose a LLM (model) from the dropdown&lt;br /&gt;
* Tick the appropriate template to distribute the App (the app is needed at every user object from any user who wants to use the assistant API)&lt;br /&gt;
* Click OK to save the settings. A green check mark will be shown to confirm that the configuration is good.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In order to make the service work properly, two supplemental services must be installed:&lt;br /&gt;
&lt;br /&gt;
* the myApps Assistant which will summarize the transcript [[Reference16r1:Concept App Service myApps Assistant]]&lt;br /&gt;
* the Transcriptions Service which establishes a connection to a remote transcription server [[Reference16r1:Concept_App_Service_Transcriptions]]&lt;br /&gt;
&lt;br /&gt;
== Conference Transcriptions - App Service ==&lt;br /&gt;
The App Service performs tasks in the following areas:&lt;br /&gt;
* Transcribes the audio of a conference room&lt;br /&gt;
* Stores the transcript in the database&lt;br /&gt;
* Creates and stores the summary of the transcript in the database&lt;br /&gt;
&lt;br /&gt;
It can be configured in the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (formerly known as PBXManager App) [[Reference16r1:Apps/PbxManager/App_myApps_ConferenceTranscriptions]]&lt;br /&gt;
&lt;br /&gt;
== Summary prompts ==&lt;br /&gt;
You may configure the prompt freely. Here are some propositions you may copy/paste into the corresponding field of the settings plugin:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
You will receive a meeting transcript. Your task is to turn it into a structured meeting summary.&lt;br /&gt;
&lt;br /&gt;
The entire summary — including section headers, bullet points, and all text — must be written in the same language as the transcript. Detect the language automatically. If the transcript is in german write the summary in german. If the transcript is in english, write the summary in english...&lt;br /&gt;
&lt;br /&gt;
Follow these instructions exactly:&lt;br /&gt;
&lt;br /&gt;
1. Read the transcript carefully.&lt;br /&gt;
2. Extract only the information that is clearly stated. Do not guess or invent anything.&lt;br /&gt;
3.  Create the final summary using the exact structure below, but translate the section headers into the language of the transcript.&lt;br /&gt;
&lt;br /&gt;
OUTPUT FORMAT (translate the headers into the transcript language, but keep the structure):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;A short title describing the meeting.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Summary: &amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
(2–4 sentences describing the purpose of the meeting and the main outcomes.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Decisions:&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Decision 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Decision 2&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;!-- Write “None mentioned” if no decisions were made. --&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Key Points:&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Bullet point 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Bullet point 2&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Bullet point 3&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Add more if needed --&amp;gt;&lt;br /&gt;
 &amp;lt;!-- 2-3 sentences for each point --&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Tasks:&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Person — Task — Deadline (or “No deadline mentioned”)&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Add as many as needed.  Or none of none mentionned--&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Open Questions:&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Question 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Question 2&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;!-- Write “None mentioned” if none. --&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
&lt;br /&gt;
Use HTML lists (&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;) only for bullet points.&lt;br /&gt;
Do not add information that is not in the transcript.&lt;br /&gt;
Keep the writing clear and concise.&lt;br /&gt;
Keep the structure exactly as shown, but translate the headers.&lt;br /&gt;
Do not wrap the whole answer in a single HTML tag.&lt;br /&gt;
&lt;br /&gt;
TRANSCRIPT:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
For troubleshooting the Conference Transcirptions App Service, you need activate the traceflags &#039;&#039;App&#039;&#039;, &#039;&#039;Database and&#039;&#039; &#039;&#039;HTTP-Client&#039;&#039; in your App instance.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* [https://sdk.innovaphone.com/16r1/web1/com.innovaphone.conference-transcriptions/com.innovaphone.conference-transcriptions.htm SDK Documentation - Conference Transcriptions API]&lt;br /&gt;
* [[Reference16r1:Concept App Service myApps Assistant]]&lt;br /&gt;
* [[Reference16r1:Apps/PbxManager/App myApps ConferenceTranscriptions]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Transcriptions&amp;diff=78840</id>
		<title>Reference16r1:Concept App Service Transcriptions</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Transcriptions&amp;diff=78840"/>
		<updated>2026-01-30T11:28:24Z</updated>

		<summary type="html">&lt;p&gt;Tfu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This article is still work in progress}}&lt;br /&gt;
[[Category:Concept|Apps]]&lt;br /&gt;
[[Category:Concept App Service Transcriptions]]&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone Transcription Service from version 16r1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Transcription Service converts audio input into text using automatic speech recognition (ASR) models. In terms of its concept, it is located between the client services that generate or capture audio data and the transcription backend that performs the actual speech-to-text processing.&lt;br /&gt;
These transcription backends can run either as a locally hosted AI service within the same environment or as an external service accessed through a compatible API.&lt;br /&gt;
&lt;br /&gt;
The Transcription Service itself is responsible for managing sessions, handling parallel requests, and coordinating the data flow between clients and the selected backend. The external ASR model performs the actual transcription.&lt;br /&gt;
&lt;br /&gt;
The service is designed to work with OpenAI-compatible APIs, enabling clients to freely choose their preferred backend provider.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
&lt;br /&gt;
In order to use the Transcriptions Service including the Transcriptions App the newly introduced UCC license is necessary.&lt;br /&gt;
== Installation ==&lt;br /&gt;
Go to the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (formerly known as PBX manager) and open the &#039;&#039;&#039;&amp;quot;AP app installer&amp;quot;&#039;&#039;&#039; plugin. On the right panel, the App Store will be shown. &#039;&#039;Hint : if you access it for the first time, you will need to accept the &amp;quot;Terms of Use of the innovaphone App Store&amp;quot;&#039;&#039;&lt;br /&gt;
* In the search field located on the top right corner of the store, search for &#039;&#039;&#039;&amp;quot;Transcriptions&amp;quot;&#039;&#039;&#039; and click on it&lt;br /&gt;
* Select the proper firmware version, for example &#039;&#039;&#039;&amp;quot;Version 16r1&amp;quot;&#039;&#039;&#039; and click on install&lt;br /&gt;
* Tick &amp;quot;I accept the terms of use&amp;quot; and continue by clicking on the install yellow button&lt;br /&gt;
* Wait until the install has been finished&lt;br /&gt;
* Close and reopen the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (PBX manager) in order to refresh the list of the available colored AP plugin icons.&lt;br /&gt;
* Open the &#039;&#039;&#039;&amp;quot;AP transcriptions&amp;quot;&#039;&#039;&#039; plugin by clicking on it and select &#039;&#039;&#039;&amp;quot; + Add an App&amp;quot;&#039;&#039;&#039; afterwards. Then click on the &#039;&#039;&#039;&amp;quot;Transcriptions API&amp;quot;&#039;&#039;&#039; button.&lt;br /&gt;
* Enter a &#039;&#039;&#039;&amp;quot;Name&amp;quot;&#039;&#039;&#039; &#039;&#039;(used as display name / all character allowed)&#039;&#039; and the &#039;&#039;&#039;&amp;quot;SIP&amp;quot;&#039;&#039;&#039; &#039;&#039;(no space, no capital letters)&#039;&#039;. &#039;&#039;e.g : Name: Transcriptions API, SIP: transcriptions-api&#039;&#039;&lt;br /&gt;
* Enter the &#039;&#039;&#039;Remote service Url&#039;&#039;&#039; (Destination URL of the service provider)&lt;br /&gt;
* Enter the &#039;&#039;&#039;API Key&#039;&#039;&#039; (provided by the service provider)&lt;br /&gt;
* Enter the &#039;&#039;&#039;model name&#039;&#039;&#039; (must be supported by the configured provider) &lt;br /&gt;
* Tick the appropriate template to distribute the App (the app is needed at every user object from any user who wants to use the assistant API)&lt;br /&gt;
* Click OK to save the settings. A green check mark will be shown to confirm that the configuration is good.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
*A client service that requires transcription initiates the process by sending a transcription request via a WebSocket connection.&lt;br /&gt;
* The transcription service creates a session, assigns a transcription ID, and returns a dedicated HTTP endpoint to the client.&lt;br /&gt;
* The client uploads the audio data to the transcription service using HTTP connections, targeting the provided endpoint.&lt;br /&gt;
* The transcription service forwards the received audio data to the configured ASR backend (for example, a Whisper-compatible API) over HTTP.&lt;br /&gt;
* The ASR backend performs the transcription and returns the result to the transcription service, which then forwards the outcome back to the client.&lt;br /&gt;
&lt;br /&gt;
== Transcriptions Flow Overview ==&lt;br /&gt;
[[File:Screenshot 2026-01-29 161703.png|center|thumb|964x964px|screenshot_2026-01-29_161703.png/|screenshot_2026-01-29_161703.png/]]&lt;br /&gt;
&lt;br /&gt;
== Transcriptions - App Service ==&lt;br /&gt;
The App Service implements an API to use a remote transcription provider (e.g. whisper).&lt;br /&gt;
&lt;br /&gt;
It can be configured in the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (PBX Manager App) [[Reference16r1:Apps/PbxManager/App_myApps_Transcriptions]]&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Remote Service URL&#039;&#039;&#039; defines the target URL of the remote transcription provider. &lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;API Key&#039;&#039;&#039; is required to access the selected backend and to authenticate with the remote provider.&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Model&#039;&#039;&#039; defines which model the backend should use for transcription.&lt;br /&gt;
&lt;br /&gt;
These parameters are stored as a configuration and are forwarded to the backend. At present, these values must be entered manually in the Settings plugin.&lt;br /&gt;
&lt;br /&gt;
The service does not validate or confirm these values. It assumes that all the given values are correct and only uses them for communication with the backend. Since the users are able to chose their own providers, they are also responsible for selecting a fitting model and understanding the limitations of the models  (such as supported Audio formats, size limits, etc.).&lt;br /&gt;
&lt;br /&gt;
Furthermore, applications that require transcription functionality must explicitly consume the Transcription Service API and demonstrate this functionality in their own user interface, such as applied in the Conference Transcriptions app.&lt;br /&gt;
&lt;br /&gt;
== Transcriptions App ==&lt;br /&gt;
The service also provides a user interface where audio files can be uploaded and transcribed directly.&lt;br /&gt;
&lt;br /&gt;
Once the transcription is complete, a simple summary can be generated and exported as a PDF (basic version).&lt;br /&gt;
&lt;br /&gt;
Audio files can be selected using the Choose audio file button. The transcription process and its results are displayed on the same screen. &lt;br /&gt;
&lt;br /&gt;
Neither the uploaded audio data nor the generated transcription text is stored by the service.[[File:ReferenceConceptTranscriptionsAppServiceTranscriptionsApp.png|thumb|referenceconcepttranscriptionsappservicetranscriptionsapp.png/|referenceconcepttranscriptionsappservicetranscriptionsapp.png/]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
For troubleshooting the Transcriptions App Service, you need to activate the traceflags &#039;&#039;App&#039;&#039;, &#039;&#039;Database and&#039;&#039; &#039;&#039;HTTP-Client&#039;&#039; in your Transcription App instance.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Limitations such as maximum audio size, supported languages, or handling multilingual audio mainly depend on the selected model and provider and may vary based on the user’s provider choice.&lt;br /&gt;
* Differences in response structure can also occur. These responses are forwarded unchanged, since they may contain important metadata for the client, such as timestamps.&lt;br /&gt;
* The service does not validate the selected model. Choosing a suitable model is therefore the user’s responsibility.&lt;br /&gt;
* Transcriptions may contain misheard words or spelling inaccuracies, especially in cases of background noise or strong accents.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* [https://sdk.innovaphone.com/16r1/web1/com.innovaphone.transcriptions/com.innovaphone.transcriptions.htm SDK Documentation - Transcriptions API]&lt;br /&gt;
* [[Reference16r1:Apps/PbxManager/App_myApps_Transcriptions]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Transcriptions&amp;diff=78839</id>
		<title>Reference16r1:Concept App Service Transcriptions</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Transcriptions&amp;diff=78839"/>
		<updated>2026-01-30T11:26:35Z</updated>

		<summary type="html">&lt;p&gt;Tfu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This article is still work in progress}}&lt;br /&gt;
[[Category:Concept|Apps]]&lt;br /&gt;
[[Category:Concept App Service Transcriptions]]&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone from version 16r1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Transcription Service converts audio input into text using automatic speech recognition (ASR) models. In terms of its concept, it is located between the client services that generate or capture audio data and the transcription backend that performs the actual speech-to-text processing.&lt;br /&gt;
These transcription backends can run either as a locally hosted AI service within the same environment or as an external service accessed through a compatible API.&lt;br /&gt;
&lt;br /&gt;
The Transcription Service itself is responsible for managing sessions, handling parallel requests, and coordinating the data flow between clients and the selected backend. The external ASR model performs the actual transcription.&lt;br /&gt;
&lt;br /&gt;
The service is designed to work with OpenAI-compatible APIs, enabling clients to freely choose their preferred backend provider.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
&lt;br /&gt;
In order to use the Transcriptions Service including the Transcriptions App the newly introduced UCC license is necessary.&lt;br /&gt;
== Installation ==&lt;br /&gt;
Go to the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (formerly known as PBX manager) and open the &#039;&#039;&#039;&amp;quot;AP app installer&amp;quot;&#039;&#039;&#039; plugin. On the right panel, the App Store will be shown. &#039;&#039;Hint : if you access it for the first time, you will need to accept the &amp;quot;Terms of Use of the innovaphone App Store&amp;quot;&#039;&#039;&lt;br /&gt;
* In the search field located on the top right corner of the store, search for &#039;&#039;&#039;&amp;quot;Transcriptions&amp;quot;&#039;&#039;&#039; and click on it&lt;br /&gt;
* Select the proper firmware version, for example &#039;&#039;&#039;&amp;quot;Version 16r1&amp;quot;&#039;&#039;&#039; and click on install&lt;br /&gt;
* Tick &amp;quot;I accept the terms of use&amp;quot; and continue by clicking on the install yellow button&lt;br /&gt;
* Wait until the install has been finished&lt;br /&gt;
* Close and reopen the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (PBX manager) in order to refresh the list of the available colored AP plugin icons.&lt;br /&gt;
* Open the &#039;&#039;&#039;&amp;quot;AP transcriptions&amp;quot;&#039;&#039;&#039; plugin by clicking on it and select &#039;&#039;&#039;&amp;quot; + Add an App&amp;quot;&#039;&#039;&#039; afterwards. Then click on the &#039;&#039;&#039;&amp;quot;Transcriptions API&amp;quot;&#039;&#039;&#039; button.&lt;br /&gt;
* Enter a &#039;&#039;&#039;&amp;quot;Name&amp;quot;&#039;&#039;&#039; &#039;&#039;(used as display name / all character allowed)&#039;&#039; and the &#039;&#039;&#039;&amp;quot;SIP&amp;quot;&#039;&#039;&#039; &#039;&#039;(no space, no capital letters)&#039;&#039;. &#039;&#039;e.g : Name: Transcriptions API, SIP: transcriptions-api&#039;&#039;&lt;br /&gt;
* Enter the &#039;&#039;&#039;Remote service Url&#039;&#039;&#039; (Destination URL of the service provider)&lt;br /&gt;
* Enter the &#039;&#039;&#039;API Key&#039;&#039;&#039; (provided by the service provider)&lt;br /&gt;
* Enter the &#039;&#039;&#039;model name&#039;&#039;&#039; (must be supported by the configured provider) &lt;br /&gt;
* Tick the appropriate template to distribute the App (the app is needed at every user object from any user who wants to use the assistant API)&lt;br /&gt;
* Click OK to save the settings. A green check mark will be shown to confirm that the configuration is good.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
*A client service that requires transcription initiates the process by sending a transcription request via a WebSocket connection.&lt;br /&gt;
* The transcription service creates a session, assigns a transcription ID, and returns a dedicated HTTP endpoint to the client.&lt;br /&gt;
* The client uploads the audio data to the transcription service using HTTP connections, targeting the provided endpoint.&lt;br /&gt;
* The transcription service forwards the received audio data to the configured ASR backend (for example, a Whisper-compatible API) over HTTP.&lt;br /&gt;
* The ASR backend performs the transcription and returns the result to the transcription service, which then forwards the outcome back to the client.&lt;br /&gt;
&lt;br /&gt;
== Transcriptions Flow Overview ==&lt;br /&gt;
[[File:Screenshot 2026-01-29 161703.png|center|thumb|964x964px|/Screenshot_2026-01-29_161703.png|screenshot_2026-01-29_161703.png/]]&lt;br /&gt;
&lt;br /&gt;
== Transcriptions - App Service ==&lt;br /&gt;
The App Service implements an API to use a remote transcription provider (e.g. whisper).&lt;br /&gt;
&lt;br /&gt;
It can be configured in the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (PBX Manager App) [[Reference16r1:Apps/PbxManager/App_myApps_Transcriptions]]&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Remote Service URL&#039;&#039;&#039; defines the target URL of the remote transcription provider. &lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;API Key&#039;&#039;&#039; is required to access the selected backend and to authenticate with the remote provider.&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Model&#039;&#039;&#039; defines which model the backend should use for transcription.&lt;br /&gt;
&lt;br /&gt;
These parameters are stored as a configuration and are forwarded to the backend. At present, these values must be entered manually in the Settings plugin.&lt;br /&gt;
&lt;br /&gt;
The service does not validate or confirm these values. It assumes that all the given values are correct and only uses them for communication with the backend. Since the users are able to chose their own providers, they are also responsible for selecting a fitting model and understanding the limitations of the models  (such as supported Audio formats, size limits, etc.).&lt;br /&gt;
&lt;br /&gt;
Furthermore, applications that require transcription functionality must explicitly consume the Transcription Service API and demonstrate this functionality in their own user interface, such as applied in the Conference Transcriptions app.&lt;br /&gt;
&lt;br /&gt;
== Transcriptions App ==&lt;br /&gt;
The service also provides a user interface where audio files can be uploaded and transcribed directly.&lt;br /&gt;
&lt;br /&gt;
Once the transcription is complete, a simple summary can be generated and exported as a PDF (basic version).&lt;br /&gt;
&lt;br /&gt;
Audio files can be selected using the Choose audio file button. The transcription process and its results are displayed on the same screen. &lt;br /&gt;
&lt;br /&gt;
Neither the uploaded audio data nor the generated transcription text is stored by the service.[[File:ReferenceConceptTranscriptionsAppServiceTranscriptionsApp.png|thumb|/ReferenceConceptTranscriptionsAppServiceTranscriptionsApp.png|referenceconcepttranscriptionsappservicetranscriptionsapp.png/]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
For troubleshooting the Transcriptions App Service, you need to activate the traceflags &#039;&#039;App&#039;&#039;, &#039;&#039;Database and&#039;&#039; &#039;&#039;HTTP-Client&#039;&#039; in your Transcription App instance.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Limitations such as maximum audio size, supported languages, or handling multilingual audio mainly depend on the selected model and provider and may vary based on the user’s provider choice.&lt;br /&gt;
* Differences in response structure can also occur. These responses are forwarded unchanged, since they may contain important metadata for the client, such as timestamps.&lt;br /&gt;
* The service does not validate the selected model. Choosing a suitable model is therefore the user’s responsibility.&lt;br /&gt;
* Transcriptions may contain misheard words or spelling inaccuracies, especially in cases of background noise or strong accents.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* [https://sdk.innovaphone.com/16r1/web1/com.innovaphone.transcriptions/com.innovaphone.transcriptions.htm SDK Documentation - Transcriptions API]&lt;br /&gt;
* [[Reference16r1:Apps/PbxManager/App_myApps_Transcriptions]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Transcriptions&amp;diff=78836</id>
		<title>Reference16r1:Concept App Service Transcriptions</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Transcriptions&amp;diff=78836"/>
		<updated>2026-01-30T10:38:47Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This article is still work in progress}}&lt;br /&gt;
[[Category:Concept|Apps]]&lt;br /&gt;
[[Category:Concept App Service Transcriptions]]&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone from version 16r1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Transcription Service converts audio input into text using automatic speech recognition (ASR) models. In terms of its concept, it is located between the client services that generate or capture audio data and the transcription backends that perform the actual speech-to-text processing.&lt;br /&gt;
These transcription backends can run either as a locally hosted AI service within the same environment or as an external service accessed through a compatible API.&lt;br /&gt;
&lt;br /&gt;
The Transcription Service itself is responsible for managing sessions, handling parallel requests, and coordinating the data flow between clients and the selected backend. The external ASR model performs the actual transcription.&lt;br /&gt;
&lt;br /&gt;
The service is designed to work with OpenAI-compatible APIs, enabling clients to freely choose their preferred backend provider.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
&lt;br /&gt;
In order to use the Transcriptions Service including the Transcriptions App the newly introduced UCC license is necessary.&lt;br /&gt;
== Installation ==&lt;br /&gt;
Go to the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (PBX manager) and open the &#039;&#039;&#039;&amp;quot;AP app installer&amp;quot;&#039;&#039;&#039; plugin. On the right panel, the App Store will be shown. &#039;&#039;Hint : if you access it for the first time, you will need to accept the &amp;quot;Terms of Use of the innovaphone App Store&amp;quot;&#039;&#039;&lt;br /&gt;
* In the search field located on the top right corner of the store, search for &#039;&#039;&#039;&amp;quot;Transcriptions&amp;quot;&#039;&#039;&#039; and click on it&lt;br /&gt;
* Select the proper firmware version, for example &#039;&#039;&#039;&amp;quot;Version 16r1&amp;quot;&#039;&#039;&#039; and click on install&lt;br /&gt;
* Tick &amp;quot;I accept the terms of use&amp;quot; and continue by clicking on the install yellow button&lt;br /&gt;
* Wait until the install has been finished&lt;br /&gt;
* Close and reopen the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (PBX manager) again in order to refresh the list of the available colored AP plugin&lt;br /&gt;
* Click on the &#039;&#039;&#039;&amp;quot;AP transcriptions&amp;quot;&#039;&#039;&#039; and click on &#039;&#039;&#039;&amp;quot; + Add an App&amp;quot;&#039;&#039;&#039; and then on the &#039;&#039;&#039;&amp;quot;Transcriptions API&amp;quot;&#039;&#039;&#039; button.&lt;br /&gt;
* Enter a &#039;&#039;&#039;&amp;quot;Name&amp;quot;&#039;&#039;&#039; that is used as display name &#039;&#039;(all character allowed)&#039;&#039; for it and the &#039;&#039;&#039;&amp;quot;SIP&amp;quot;&#039;&#039;&#039; name that is the administrative field &#039;&#039;(no space, no capital letters)&#039;&#039;. &#039;&#039;e.g : Name: Transcriptions API, SIP: transcriptions-api&#039;&#039;&lt;br /&gt;
* Choose a LLM (model) from the dropdown&lt;br /&gt;
* Tick the appropriate template to distribute the App (the app is needed at every user object from any user who wants to use the assistant API)&lt;br /&gt;
* Click OK to save the settings and a green check mark will be shown to inform you that the configuration is good&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
*A client service that requires transcription initiates the process by sending a transcription request via a WebSocket connection.&lt;br /&gt;
* The transcription service creates a session, assigns a transcription Id, and returns a dedicated HTTP endpoint to the client.&lt;br /&gt;
* The client uploads the audio data to the transcription service using HTTP connections, targeting the provided endpoint.&lt;br /&gt;
* The transcription service forwards the received audio data to the configured ASR backend (for example, a Whisper-compatible API) over HTTP.&lt;br /&gt;
* The ASR backend performs the transcription and returns the result to the transcription service, which then forwards the outcome back to the client.&lt;br /&gt;
&lt;br /&gt;
== Transcriptions Flow Overview ==&lt;br /&gt;
[[File:Screenshot 2026-01-29 161703.png|center|thumb|964x964px|/Screenshot_2026-01-29_161703.png|/Screenshot_2026-01-29_161703.png]]&lt;br /&gt;
&lt;br /&gt;
== Transcriptions - App Service ==&lt;br /&gt;
The App Service implements the API to a remote transcription server (e.g. whisper)&lt;br /&gt;
&lt;br /&gt;
It can be configured in the &#039;&#039;&#039;Settings App&#039;&#039;&#039; (PBX Manager App) [[Reference16r1:Apps/PbxManager/App_myApps_Transcriptions]]&lt;br /&gt;
&lt;br /&gt;
* The Remote service Url defines where requests are sent. &lt;br /&gt;
&lt;br /&gt;
* API key required to access the selected backend and to authenticates with the remote provider.&lt;br /&gt;
&lt;br /&gt;
* Model value defines which model the backend should use for transcription.&lt;br /&gt;
&lt;br /&gt;
These parameters are stored as a configuration and are forwarded to the backend. At present, these values must be entered manually in the Settings plugin.&lt;br /&gt;
&lt;br /&gt;
The service does not validate or confirm these values. It assumes that all the given values are correct and only uses them for communication with the backend. Since the users are able to chose their own providers, they are also responsible for selecting a fitting model and understanding the limitations of the models  (such as supported Audio formats, size limits etc.)&lt;br /&gt;
&lt;br /&gt;
Furthermore, Applications that require transcription functionality must explicitly consume the Transcription Service API and demonstrate this functionality in their own user interface, such as in Conference Transcriptions.&lt;br /&gt;
&lt;br /&gt;
== Transcriptions App ==&lt;br /&gt;
The service also provides a user interface where audio files can be uploaded and transcribed directly.&lt;br /&gt;
&lt;br /&gt;
Once the transcription is complete, a simple summary can be generated and exported as a PDF (basic version).&lt;br /&gt;
&lt;br /&gt;
Audio files can be selected using the Choose audio file button. The transcription process and its results are displayed on the same screen. &lt;br /&gt;
&lt;br /&gt;
Neither the uploaded audio data nor the generated transcription text is stored by the service.[[File:ReferenceConceptTranscriptionsAppServiceTranscriptionsApp.png|thumb|/ReferenceConceptTranscriptionsAppServiceTranscriptionsApp.png|/ReferenceConceptTranscriptionsAppServiceTranscriptionsApp.png]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
To troubleshoot this App Service, you need the traceflags &#039;&#039;App&#039;&#039;, &#039;&#039;Database&#039;&#039;, &#039;&#039;HTTP-Client&#039;&#039; in your App instance.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Limitations such as maximum audio size, supported languages, or handling multilingual audio mainly depend on the selected model and provider, and may vary based on the user’s provider choice.&lt;br /&gt;
* Differences in response structure can also occur. These responses are forwarded unchanged, since they may contain important metadata for the client, such as timestamps.&lt;br /&gt;
* The service does not validate the selected model. Choosing a suitable model is therefore the user’s responsibility.&lt;br /&gt;
* Transcriptions may contain misheard words or spelling inaccuracies, especially in cases of background noise or strong accents.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* [https://sdk.innovaphone.com/16r1/web1/com.innovaphone.transcriptions/com.innovaphone.transcriptions.htm SDK Documentation - Transcriptions API]&lt;br /&gt;
* [[Reference16r1:Apps/PbxManager/App_myApps_Transcriptions]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto13r1:Installation_Scenarios&amp;diff=78804</id>
		<title>Howto13r1:Installation Scenarios</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto13r1:Installation_Scenarios&amp;diff=78804"/>
		<updated>2026-01-28T10:33:19Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Scenario - proxy-secured internet access */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__toc__&lt;br /&gt;
&amp;lt;!-- Keywords: v13 install, v13 dns, installer, setup scenarios --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before starting your Version 13 Installation you have to check the customer network and his requirements first. &lt;br /&gt;
&lt;br /&gt;
You can install a Version 13 setup in different ways, so we will give you an overview and a best practice for your specific case.&lt;br /&gt;
&lt;br /&gt;
==Applies To==&lt;br /&gt;
This information applies to&lt;br /&gt;
&lt;br /&gt;
* Firmware Version 13 onwards&lt;br /&gt;
&lt;br /&gt;
== IP/DNS-Installation scenarios ==&lt;br /&gt;
&lt;br /&gt;
=== Decision Matrix ===&lt;br /&gt;
&lt;br /&gt;
On the left side you can choose the needs and conditions of your customer. Then you will see which solutions are possible or recommended.&lt;br /&gt;
&lt;br /&gt;
Some information to understand the conditions in the table:&lt;br /&gt;
;Reverse Proxy&lt;br /&gt;
:Needed if you want connect with external phones (e.g. Smartphones or HomeOffices) to your internal PBX or Application Platform. The requirements are an official domain and access to the router configuration to configure port forwardings. If you do not have a domain, you have to rent one. If you do not have access to the router, your customer must use a Cloud Solution.&lt;br /&gt;
;Local DNS server&lt;br /&gt;
:All applications can work with DNS Names. You have to configure some internal subdomains with the private IP addresses of your gateways&lt;br /&gt;
:Example PBX: &amp;lt;code&amp;gt;pbx.domanin.tld =&amp;gt; 192.168.2.10&amp;lt;/code&amp;gt;&lt;br /&gt;
:Example Ap Platform: &amp;lt;code&amp;gt;ap.domanin.tld =&amp;gt; 192.168.2.11&amp;lt;/code&amp;gt;&lt;br /&gt;
;External DNS server&lt;br /&gt;
:In combination with the reverse proxy you can offer some subdomains from your external domain name with the external IP or the NAT-IP of your Reverse Proxy&lt;br /&gt;
:Example PBX: &amp;lt;code&amp;gt;pbx.domanin.tld =&amp;gt; 1.2.3.4&amp;lt;/code&amp;gt; &lt;br /&gt;
:Example Ap Platform: &amp;lt;code&amp;gt;ap.domanin.tld =&amp;gt; 1.2.3.4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reverse Proxy is needed ===&lt;br /&gt;
&lt;br /&gt;
Please check on the vertical lines the starting conditions on your customer site. After that you can check on the right columns possible scenarios for your customer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &amp;amp;nbsp; || style=&amp;quot;background-color: #EAECF0;text-align:center&amp;quot;|Cloud || style=&amp;quot;background-color:#B3B7FF&amp;quot;|&amp;amp;nbsp; ||  colspan=&amp;quot;4&amp;quot; style=&amp;quot;background-color: #EAECF0;text-align:center&amp;quot;| On Premise&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;background-color: #FAEBA3&amp;quot;&lt;br /&gt;
! / !! &amp;amp;nbsp;innovaphone Cloud&amp;amp;nbsp; !! style=&amp;quot;background-color:#B3B7FF&amp;quot;| !! &amp;amp;nbsp;internal DNS Server&amp;amp;nbsp; !! &amp;amp;nbsp;external NAT Hairpinning&amp;amp;nbsp; !! &amp;amp;nbsp;new DNS Server with a innovaphone Box&amp;amp;nbsp; !! &amp;amp;nbsp;use only IP addresses&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;font-weight:bold;background-color: #FAEBA3&amp;quot;|&amp;amp;nbsp;&amp;amp;bull; local DNS server exists || style=&amp;quot;color:green;text-align:center;&amp;quot;|✔✔✔ || style=&amp;quot;background-color:#B3B7FF&amp;quot;| ||  style=&amp;quot;color:green;text-align:center&amp;quot;|✔✔✔ ||  style=&amp;quot;color:green;text-align:center&amp;quot;|✔ || style=&amp;quot;color:green;text-align:center&amp;quot;|✔ || style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;font-weight:bold;background-color: #FAEBA3&amp;quot;|&amp;amp;nbsp;&amp;amp;bull; no local DNS server exists || style=&amp;quot;color:green;text-align:center&amp;quot;|✔✔✔ || style=&amp;quot;background-color:#B3B7FF&amp;quot;| || style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X || style=&amp;quot;color:green;text-align:center&amp;quot;|✔ || style=&amp;quot;color:green;text-align:center&amp;quot;|✔ || style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reverse Proxy is not needed ===&lt;br /&gt;
&lt;br /&gt;
Please check on the vertical lines the starting conditions on your customer site. After that you can check on the right columns possible scenarios for your customer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &amp;amp;nbsp; || style=&amp;quot;background-color: #EAECF0;text-align:center&amp;quot;|Cloud || style=&amp;quot;background-color:#B3B7FF&amp;quot;|&amp;amp;nbsp; ||  colspan=&amp;quot;4&amp;quot; style=&amp;quot;background-color: #EAECF0;text-align:center&amp;quot;| On Premise&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;background-color: #FAEBA3&amp;quot;&lt;br /&gt;
! / !! &amp;amp;nbsp;innovaphone Cloud&amp;amp;nbsp; !! style=&amp;quot;background-color:#B3B7FF&amp;quot;| !! &amp;amp;nbsp;internal DNS Server&amp;amp;nbsp; !! &amp;amp;nbsp;external NAT Hairpinning&amp;amp;nbsp; !! &amp;amp;nbsp;new DNS Server with a innovaphone Box&amp;amp;nbsp; !! &amp;amp;nbsp;use only IP addresses&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;font-weight:bold;background-color: #FAEBA3&amp;quot;|&amp;amp;nbsp;&amp;amp;bull; local DNS server exists || style=&amp;quot;color:green;text-align:center;&amp;quot;|✔✔✔ || style=&amp;quot;background-color:#B3B7FF&amp;quot;| ||  style=&amp;quot;color:green;text-align:center&amp;quot;|✔✔✔ ||  style=&amp;quot;color:green;text-align:center&amp;quot;|✔ || style=&amp;quot;color:green;text-align:center&amp;quot;|✔ || style=&amp;quot;color:green;text-align:center&amp;quot;|✔✔ &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;font-weight:bold;background-color: #FAEBA3&amp;quot;|&amp;amp;nbsp;&amp;amp;bull; no local DNS server exists || style=&amp;quot;color:green;text-align:center&amp;quot;|✔✔✔ || style=&amp;quot;background-color:#B3B7FF&amp;quot;| || style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X || style=&amp;quot;color:green;text-align:center&amp;quot;|✔ || style=&amp;quot;color:green;text-align:center&amp;quot;|✔ || style=&amp;quot;color:green;text-align:center&amp;quot;|✔✔ &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green;text-align:center&amp;quot;&amp;gt;✔✔✔&amp;lt;/span&amp;gt; means that we recommend it&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green;text-align:center&amp;quot;&amp;gt;✔✔&amp;lt;/span&amp;gt; means that you can do it, and it works fine&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green;text-align:center&amp;quot;&amp;gt;✔&amp;lt;/span&amp;gt; means that you can do it, it works fine but you should do some local network adjustment&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:orange;text-align:center;font-weight:bold;&amp;quot;&amp;gt;O&amp;lt;/span&amp;gt; means that you can do it, but we don&#039;t recommended it&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;&amp;gt;X&amp;lt;/span&amp;gt; means that you should not do it, otherwise you may run into problems&lt;br /&gt;
&lt;br /&gt;
We recommend to take a look [[Courseware:IT Advanced - 06 Public Access to PBX Resources (theory) - optional|into our training books]] to decide how to setup the whole network.&lt;br /&gt;
&lt;br /&gt;
=== Scenario - innovaphone Cloud ===&lt;br /&gt;
Refer to [[Howto:MyApps Cloud - Installation|respective article]].&lt;br /&gt;
&lt;br /&gt;
=== Scenario - internal DNS Server ===&lt;br /&gt;
You can use your existing DNS Server to setup your DNS names to resolv it to the correct internal IP addresses.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
* pbx.example.com =&amp;gt; 192.168.2.10&lt;br /&gt;
* apps.example.com =&amp;gt; 192.168.2.11&lt;br /&gt;
&lt;br /&gt;
=== Scenario - external NAT Hairpinning ===&lt;br /&gt;
If you have no internal DNS Server and your NAT router support &#039;&#039;[https://en.wikipedia.org/wiki/Hairpinning Hairpinning]&#039;&#039; you can use external DNS entries with a record to your external IP-Address.&lt;br /&gt;
&lt;br /&gt;
Your internal client should resolve &#039;&#039;pbx.example.com&#039;&#039; to your public IP address of your own router. If you configure needed NAT rules to your internal IP, your router will accept the package from inside and forward it back to the internal IP from your NAT rule. &lt;br /&gt;
&lt;br /&gt;
In this scenario no separate internal dns server are required and your internal client (eg. 192.168.3.5) can talk with your PBX (eg. pbx.example.com -&amp;gt; 1.2.3.4) with a mapping to the internal IP (eg. 192.168.3.10)&lt;br /&gt;
&lt;br /&gt;
The most used NAT Rules are:&lt;br /&gt;
 // H.323/TLS &lt;br /&gt;
 [from outside] tcp/1300     =&amp;gt; [internal IP of your Reverse Proxy] &lt;br /&gt;
 &lt;br /&gt;
 // LDAPS&lt;br /&gt;
 [from outside] tcp/636      =&amp;gt; [internal IP of your Reverse Proxy] &lt;br /&gt;
 &lt;br /&gt;
 // HTTPS&lt;br /&gt;
 [from outside] tcp/443      =&amp;gt; [internal IP of your Reverse Proxy] &lt;br /&gt;
 &lt;br /&gt;
 // TURN&lt;br /&gt;
 [from outside] tcp/udp/3478 =&amp;gt; [internal IP of your Reverse Proxy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
During the install process you have to set up a temporary internal DNS first and to configure your PC and the innovaphone Gateway to use them, which provides the local addresses. Only during the install you have to distribute the internal DNS by DHCP in your router to the Clients. If everything is finished, you can turn off the local DNS.&lt;br /&gt;
If you have no Hardware/Software for a temporary DNS Server you can use a innovaphone Box which is described [[Howto:V13 Installation Scenarios#Scenario - new DNS Server with a innovaphone Box|here]].&lt;br /&gt;
&lt;br /&gt;
If you cannot setup temporary DNS records the installer will automatic activate the [[Reference13r1:PBX/Config/General|Operation without DNS]] mode, to communicate via IP address. You have to deactivate the mode after setup the correct DNS entries.&lt;br /&gt;
&lt;br /&gt;
=== Scenario - new DNS Server with a innovaphone Box ===&lt;br /&gt;
If you decided to setup an internal DNS than you can do that as described here:&lt;br /&gt;
&lt;br /&gt;
First choose Manual Installation&lt;br /&gt;
&lt;br /&gt;
[[Image:SetupInternerDNS-Part1.png|setupinternerdns-part1.png/]]&lt;br /&gt;
&lt;br /&gt;
Than enable the DNS Server and create A Records&lt;br /&gt;
&lt;br /&gt;
[[Image:SetupInternerDNS-Part2.png|setupinternerdns-part2.png/]]&lt;br /&gt;
&lt;br /&gt;
Afterwards it looks like that:&lt;br /&gt;
&lt;br /&gt;
[[Image:SetupInternerDNS-Part3.png|setupinternerdns-part3.png/]]&lt;br /&gt;
&lt;br /&gt;
In the next step you should provide the IP of this box as DNS server to all of you phones. &lt;br /&gt;
Therefore you could use your own DHCP Server. &lt;br /&gt;
&lt;br /&gt;
Now you can go back to the normal installation process of the box. &lt;br /&gt;
Therefore just ....&lt;br /&gt;
&lt;br /&gt;
=== Scenario - use only IP addresses ===&lt;br /&gt;
You can use static IP addresses in the installations process. So no DNS is needed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
*PBX DNS Name =&amp;gt; 192.168.2.10&lt;br /&gt;
*AP DNS Name =&amp;gt; 192.168.2.11&lt;br /&gt;
&lt;br /&gt;
=== Scenario - proxy-secured internet access ===&lt;br /&gt;
If Internet access is only possible via a proxy server, a local store can be used for installation.&lt;br /&gt;
For details refer to the [[Special:Search/intitle:offline incategory:&amp;quot;Step-by-Step&amp;quot;|offline installation articles]].&lt;br /&gt;
&lt;br /&gt;
== Possible scenarios if port 443 is already in use ==&lt;br /&gt;
Sometimes the HTTPS (tcp/443) or HTTP (tcp/80) is already in use by other systems like Webmail or Webserver on the customers side. To use your myApps Clients externally the myApps Client need to connect also via Port 443 to the customer network. &lt;br /&gt;
&lt;br /&gt;
There are some possible solutions to resolve that conflict.&lt;br /&gt;
&lt;br /&gt;
=== Use an innovaphone Cloud Setup ===&lt;br /&gt;
If you don&#039;t want to or can&#039;t change the network on customers side you can use an [https://www.innovaphone.com/en/cloud/rent-buy-or-move-to-the-cloud.html innovaphone Cloud Setup].&lt;br /&gt;
&lt;br /&gt;
=== Separate IP Address for Reverse Proxy ===&lt;br /&gt;
The best way is to have more than one public IP-Addresses. In this scenario you use a separate IP-Address for a specific server/service. In this way you can use different IP-Addresses on your Firewall and route the traffic to the different servers/services.&lt;br /&gt;
&lt;br /&gt;
=== Distribute traffic based on hostname ===&lt;br /&gt;
If you only have a single IP-Address you have to decide which is the target system for an incoming tcp/443 packet. For this, you can use a system that forwards the request based on the hostname in the GET Request and forward the packet to the correct service.&lt;br /&gt;
&lt;br /&gt;
==== Use existing firewall ====&lt;br /&gt;
Most of the Next-Gen firewalls support features like &#039;&#039;Load-Balancer&#039;&#039;, &#039;&#039;Reverse Proxy&#039;&#039; or something similar that can do the forwarding.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note: Please consult your firewall vendor or system admin if you need help to configure this.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Use innovaphone&#039;s Reverse Proxy ====&lt;br /&gt;
The Reverse Proxy can do the forwarding to [[Courseware:IT Advanced - 06 Public Access to PBX Resources (theory) - optional#Service Name Definition|configured destination IP-addresses]] too.&lt;br /&gt;
With this setup you route or NAT (depending from your Firewall) all incoming Traffic based on tcp/443 to the Reverse Proxy.&lt;br /&gt;
The Reverse Proxy distributes it to the appropriate system (eg. for &amp;quot;&#039;&#039;webmail.domain.tld&#039;&#039;&amp;quot; to the local Exchange IP and traffic for &amp;quot;&#039;&#039;apps.domain.tld&#039;&#039;&amp;quot; to the innovaphone AP-Platform).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note: the reverse proxy can [[Courseware:IT Advanced - 06 Public Access to PBX Resources (theory) - optional#Reverse Proxy and Certificates|handle a single SSL-Certificate]] only. You have to use a wildcard (*.domain.tld) certificate therefore.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Separate WAN Uplink ===&lt;br /&gt;
You can book a separate internet connection to get a second public IP-Address and forward the Traffic to your Reverse Proxy.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* [[Reference13r1:Install]]&lt;br /&gt;
* [[Howto:Firmware_Upgrade]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=78428</id>
		<title>Reference16r1:Concept App Service Connector for Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=78428"/>
		<updated>2025-11-05T09:54:23Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Technical Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{FIXME|reason=This article is still work in progress}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept|Apps]]&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* Connector for Microsoft 365 from Version 16r1&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Connector for Microsoft 365 synchronizes Microsoft Teams presences with the innovaphone PBX and back, and optionally additionally Calendar presence from Exchange Online (part of the Microsoft 365 Cloud Services).&lt;br /&gt;
It is also possible to search for your own contacts. &lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX&lt;br /&gt;
* innovaphone Application Platform (minimum version 120004)&lt;br /&gt;
* V16r1&lt;br /&gt;
* App(Connector for Microsoft 365)&lt;br /&gt;
* PBX-App(innovaphone-microsoft365) license per user - order no. 02-00050-009&lt;br /&gt;
&lt;br /&gt;
== Concept ==&lt;br /&gt;
&lt;br /&gt;
=== User Presence ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure User Presence Sync by Connector for Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
If the Connector for Microsoft 365 app is fully configured, the app connects to Microsoft to obtain a token. With the token, the app gets the teams users (with a Teams license) through the Microsoft Graph API.&lt;br /&gt;
A presence subscription to Microsoft is started with the licensed users of the PBX to get presence changes in Microsoft Teams for these users. A user subscription is also started to get changes of the users (adding, deleting or update). If a user has changed, the Teams users are retrieved again. If the presence has changed, it is forwarded to the PBX. The presences of Teams are mapped to the presences of the PBX.&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Presence subscriptions are renewed every 10 minutes.&lt;br /&gt;
* License Check is made periodically.&lt;br /&gt;
&lt;br /&gt;
The app synchronises the PBX presence with Teams through the Graph Api. The on-the-phone presence will be renewed every 5 minutes. The other presences have a lifetime of 1 day but the away has a lifetime of 7 days.&lt;br /&gt;
The lifetimes are described [https://learn.microsoft.com/en-us/graph/api/presence-setuserpreferredpresence?view=graph-rest-1.0&amp;amp;tabs=http here]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please be aware:&#039;&#039;&#039; The actual change of presence or line state will be live, the above-mentioned subscriptions are needed to register against the Microsoft API for changes. &lt;br /&gt;
After successful subscription Microsoft will trigger the Connector for Microsoft 365 App every time a presence or line state for a user has changed.&lt;br /&gt;
The subscription will then be renewed in the above-mentioned time interval to receive further live updates.&lt;br /&gt;
&lt;br /&gt;
===== User Matching =====&lt;br /&gt;
You now can choose the fields used for user matching on either side from the following options:&lt;br /&gt;
* PBX&lt;br /&gt;
** CN (Long Name property from the PBX user object)&lt;br /&gt;
** h323 (Name property from the PBX user object)&lt;br /&gt;
* Azure Portal&lt;br /&gt;
** displayName&lt;br /&gt;
** mail&lt;br /&gt;
** mailNickname&lt;br /&gt;
** onPremisesDistinguishedName&lt;br /&gt;
** onPremisesSamAccountName&lt;br /&gt;
** onPremisesUserPrincipalName&lt;br /&gt;
** userPrincipalName&lt;br /&gt;
&lt;br /&gt;
Additionally, you have the possibility to remove a possibly contained domain from the Azure fields content. &amp;lt;br&amp;gt;&lt;br /&gt;
Example: &#039;user@domain.tld&#039; is transformed to &#039;user&#039;, if this option is checked.&lt;br /&gt;
&lt;br /&gt;
===== Mapping Table =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Teams Presence&lt;br /&gt;
! PBX Presence&lt;br /&gt;
|-&lt;br /&gt;
| Away&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| BeRightBack&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| Busy&lt;br /&gt;
| busy&lt;br /&gt;
|-&lt;br /&gt;
| DoNotDisturb&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| InACall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAMeeting&lt;br /&gt;
| meeting&lt;br /&gt;
|-&lt;br /&gt;
| Inactive&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| PresenceUnknown&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Available&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offline&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offwork&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| OutOfOffice&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| UrgentInterruptionsOnly&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| Presenting&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAConferenceCall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value &amp;quot;online&amp;quot; unsets the Teams presence in the PBX.&lt;br /&gt;
&lt;br /&gt;
===== Master/Slave =====&lt;br /&gt;
&lt;br /&gt;
For Master/Slave combination the &amp;quot;Connector for Microsoft 365&amp;quot; App has to be added to the slave (if no full replication is on). The slave websocket connection is needed to display &amp;quot;on-the-phone&amp;quot; presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Calendar Presence ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure_Calendar_Presence_Sync_by_Connector_for_Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
Introduced in 15r1 the Connector for Microsoft 365 will offer a possibility to sync Azure Portal calendar events (Teams, Exchange online) via the Graph API with the PXB presence.&amp;lt;br&amp;gt;&lt;br /&gt;
For now the [https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Calendar Calendar App] is (along with other functions) also capable of syncing calendar events, but using the old EWS mechanism, which Microsoft announced as end of life starting from 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; Please make sure to not use both apps for syncing calendar events in parallel, this is not supported and will most likely lead to conflicts and unexpected behaviours.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When the configuration of the connector for Microsoft 365 Calendar Presence Sync is complete, the app connects to Microsoft to receive a token with the calendar app registered in the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
With the token, the app can pick up the users from the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
These are matched against the users in the PBX, based on the configured &amp;quot;User Assignment&amp;quot; settings.&amp;lt;br&amp;gt;&lt;br /&gt;
For each matched user with a valid Connector for Microsoft 365 licence applied, a subscription for calendar events is created at Microsoft to receive event changes in Microsoft Calendar for these users.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user subscription is also started to receive user changes (add, delete or update).&amp;lt;br&amp;gt;&lt;br /&gt;
If a user has changed, the users are retrieved again. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a calendar event has been started or ended, it is forwarded to the PBX.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Event subscriptions are renewed every day.&lt;br /&gt;
* License Check is made every hour.&lt;br /&gt;
&lt;br /&gt;
=== Contact Search ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto16r1:Configure Calendar Presence Sync by Connector for Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
Introduced in 16r1 the Connector for Microsoft 365 will offer a possibility to search for your own contacts (Teams, Exchange online) via the Graph API.&lt;br /&gt;
&lt;br /&gt;
When the configuration of the connector for Microsoft 365 Contact Search is complete, the app connects to Microsoft to receive a token with the contact search app registered in the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
With the token, the app can pick up the users from the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
These are matched against the users in the PBX, based on the configured &amp;quot;User Assignment&amp;quot; settings.&amp;lt;br&amp;gt;&lt;br /&gt;
For each matched user with a valid Connector for Microsoft 365 licence applied, the user can search with the Phone App, for example (a myApps search provider will be provided for all apps looking using search providers looking up contacts). The search string is made available to the Connector for Microsoft 365 via the microsoft365-api. The results are sent to the consumer, e.g. the Phone App and presented there.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user subscription is started to receive user changes (add, delete or update).&amp;lt;br&amp;gt;&lt;br /&gt;
If a user has changed, the users are retrieved again. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* License Check is made every hour.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be aware:&#039;&#039;&#039; Since the Connector for Microsoft 365 is an app in the Scope of myApps App Platform, IP Phones and other services not using Apps cannot benefit from this search service.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
&lt;br /&gt;
=Known Limitation=&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&#039;&#039;Applies to the User Presence and the Calendar Presence&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Synchronization Delay ===&lt;br /&gt;
In the official Graph-API documentation, Microsoft is providing an overview about expected latencies for change notifications.&amp;lt;br&amp;gt;&lt;br /&gt;
You can find a whole overview table here:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/change-notifications-overview#latency&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For the user presences the resource &amp;quot;presence&amp;quot; is used and an average latency of 10 seconds but a maximum up to 1 minute is provided.&amp;lt;br&amp;gt;&lt;br /&gt;
Such a delay in syncing changed presences from Teams down to the PBX are considered normal and are caused by the Microsoft Graph-API.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In case of calendar events the average is provided as &amp;quot;less than 1 minute&amp;quot; and the maximum to 3 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Presence ==&lt;br /&gt;
=== Line states set by the PBX does not block calls in Teams ===&lt;br /&gt;
Line states set by a 3rd party application (like the Connector for Microsoft 365) through the graph API are currently &#039;&#039;&#039;only for display purpose and do not block new calls&#039;&#039;&#039; in Teams.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://techcommunity.microsoft.com/t5/teams-developer/ms-graph-setpresence-problems/m-p/2798805/highlight/true#M3957&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the above linked discussion, there once existed a feature request on Microsoft Voice, which is no longer available since it was not voted.&lt;br /&gt;
=== Maximum number of supported users ===&lt;br /&gt;
The connector now supports multiple Microsoft Teams communication users, which is the prerequisite to subscribe for more than 650 users. There is a new ribbon (Manage Teams Accounts) that allows you to configure as many communication users as you need. Every configured communication user can be used to subscribe 650 users, for example:&lt;br /&gt;
&lt;br /&gt;
*3 configured communication users x 650 licensed users = 1950 users can be subscribed&lt;br /&gt;
&#039;&#039;&#039;Please be aware&#039;&#039;&#039;: Each communication user must have a Teams license applied.&lt;br /&gt;
&lt;br /&gt;
This limitation is caused by Microsoft.&amp;lt;br&amp;gt;&lt;br /&gt;
In the documentation of the Graph-API you will find a hint to this limitation:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/changenotifications-for-presence#subscribe-to-multiple-users-presence&amp;lt;br&amp;gt;&lt;br /&gt;
Trying to subscribe more than 650 users (with one communication user) by using the presence subscription API will be declined by the graph API with an error message, that too many users are requested.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Communication User (UserSynctoPbx) ===&lt;br /&gt;
Users with MFA (multi-factor-authentication) are not supported as technical communication user for the Connector.&lt;br /&gt;
&lt;br /&gt;
=== Multiple sites / instances require multiple communication users ===&lt;br /&gt;
Each instance or each site must have separate communication users, as Microsoft only allows one concurrent subscription per communication user. (otherwise an HTTP 409 conflict will occur)&lt;br /&gt;
&lt;br /&gt;
This means that if you want to subscribe to the same Azure Portal backend from two different sites (or instances), you will need to have multiple communication users (each with an applied Teams licence) in order to be able to subscribe from all endpoints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Subscription Timeout ===&lt;br /&gt;
&lt;br /&gt;
==== Situation ====&lt;br /&gt;
Due to a current limitation in the Graph API it is not possible to cancel or delete an active presence subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the [https://learn.microsoft.com/en-us/graph/api/subscription-delete?view=graph-rest-1.0&amp;amp;tabs=http|documentation of the current Graph API (1.0)] the “Delete subscription” chapter does not include presence subscriptions.&amp;lt;br&amp;gt;&lt;br /&gt;
It is also not possible to have multiple subscription in parallel. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make sure to only request a new presence subscription when the old one is not valid anymore, the app will store the state of the presence subscription and the time until it is valid in the database.&amp;lt;br&amp;gt;&lt;br /&gt;
As mentioned in the chapter “Technical Overview” we are creating presence subscriptions with a validity of 10 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
The presence subscription will be renewed as soon as it is no longer valid which will be 10 minutes after initial subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Impact ====&lt;br /&gt;
If settings are changed or the app instance is restarted it will check the corresponding database entry on startup.&amp;lt;br&amp;gt;&lt;br /&gt;
In case the last presence subscription was completed less than 10 minutes ago, there is still an active presence subscription and the app has to wait for it to become invalid. &amp;lt;br&amp;gt;&lt;br /&gt;
Some Changes (e.g., to the “Notification-URL”) will only take effect after a new created subscription. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The current Beta Version of the Graph API is already providing a function to delete presence subscriptions, so we hope we can improve this behavior in the future.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
===Creating an app trace===&lt;br /&gt;
For further analysis and creating a support ticket it will be useful to have a suitable app trace. &amp;lt;br&amp;gt;&lt;br /&gt;
Before creating the trace please make sure the following trace flags are activated for the app instance:&lt;br /&gt;
* App&lt;br /&gt;
* Database&lt;br /&gt;
* HTTP client&lt;br /&gt;
* TLS&lt;br /&gt;
* TCP&lt;br /&gt;
* App WebSocket&lt;br /&gt;
* Config&lt;br /&gt;
* Webserver&lt;br /&gt;
&lt;br /&gt;
After setting the config flags, please make sure to&lt;br /&gt;
* stop the instance&lt;br /&gt;
* deleting the current instance log&lt;br /&gt;
* start the instance&lt;br /&gt;
&#039;&#039;&#039;Now please wait at least 5 Minutes before you save the log&#039;&#039;&#039;, otherwise we could not have the whole picture in the trace.&lt;br /&gt;
&lt;br /&gt;
The restart and deletion of the the old log is useful the see the complete initialization process right away.&lt;br /&gt;
&lt;br /&gt;
===SSL Certificate for notification URL===&lt;br /&gt;
It also is useful to make sure the notification URL has a valid and public signed certificate.&amp;lt;br&amp;gt;&lt;br /&gt;
You can do that, using an SSL-Checker, for example: https://www.sslshopper.com/ssl-checker.html &amp;lt;br&amp;gt;&lt;br /&gt;
Without a valid, public signed certificate, Microsoft will decline the connection since it will not be possible to establish a trust relationship for the SSL/TLS secure channel.&lt;br /&gt;
&lt;br /&gt;
===Correctness of notification URL===&lt;br /&gt;
You can try to open the notification URL in your Browser&amp;lt;br&amp;gt;&lt;br /&gt;
Most likely you will see a HTTP 404 (Not Found) error message, which is the expected behavior since we are not providing an HTML website, the HTTP GET request from the browser will not be answered with content.&amp;lt;br&amp;gt;&lt;br /&gt;
This is perfectly fine since Microsoft will send presence updates with HTTP POST and will not try to request content from our app.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
What you can find out by trying to open the URL in your browser are the two following things: &amp;lt;br&amp;gt;&lt;br /&gt;
* If you receive a HTTP 404 error message you are most likely connected to an App Platform, if not you need to check your DNS (and maybe also reverse proxy) settings.&lt;br /&gt;
* If the URL is modified and the used build number is added, an app has answered your request&lt;br /&gt;
** Example: &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/subscriptions&amp;lt;/code&amp;gt; is modified to &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/&amp;lt;b&amp;gt;1510411&amp;lt;/b&amp;gt;/subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
** If this is not the case, your URL is wrong. (Be aware: The URL depends on the settings of the web server path of your app instance)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be aware:&#039;&#039;&#039; The URL-Recognition in the Application Platform is &#039;&#039;&#039;case sensitive&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== User Presence == &lt;br /&gt;
===GUI Feedback===&lt;br /&gt;
The app itself shows required states with green and red as connections to the Master PBX, Authentication and Presence Subscription to identify if there are problems. &amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes it needs a little bit time until the states are changed. &amp;lt;br&amp;gt;&lt;br /&gt;
If the states remain, it is mandatory to enable logs on the app platform and check for more information. &amp;lt;br&amp;gt;&lt;br /&gt;
([[Howto13r3:Configure Connector for Microsoft365#Creating an app trace|Concept App Service Connector for Microsoft 365: Creating an app trace]])&lt;br /&gt;
&lt;br /&gt;
====No connection to Master PBX====&lt;br /&gt;
Check the MasterPBX name.&amp;lt;br&amp;gt;&lt;br /&gt;
The field must only contain the name [&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;pbx&amp;lt;/span&amp;gt;], &#039;&#039;&#039;not the full domain&#039;&#039;&#039; [&amp;lt;span style=&amp;quot;color:red;text-decoration: line-through;&amp;quot;&amp;gt;pbx.domain.tld&amp;lt;/span&amp;gt;]. ([[Howto13r3:Configure Connector for Microsoft365#Synchronization from Teams to the PBX|Synchronization from Teams to the PBX - Master PBX field]])&lt;br /&gt;
&lt;br /&gt;
====Presence subscription failed====&lt;br /&gt;
There are many reasons why the &amp;quot;Presence subscription failed&amp;quot; message could be displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
We try to list the most common reasons:&lt;br /&gt;
* The permission for the registered app in the Azure portal are not correctly set ([[Howto13r3:Configure Connector for Microsoft365#Create an App for syncing Teams to PBX|Howto: Create an App for syncing Teams to PBX]])&lt;br /&gt;
* The Notification URL is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The App service is not reachable from the internet ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The certificate for the public endpoint (e.g. reverse proxy) is not valid, or not publicly signed ([[Reference13r3:Concept App Service Connector for Microsoft 365#SSL Certificate for notification URL|Concept App Service Connector for Microsoft 365: SSL Certificate for notification URL]])&lt;br /&gt;
* The user from PBX and the Azure Portal cannot be matched ([[Reference13r3:Concept App Service Connector for Microsoft 365#User Matching|Concept App Service Connector for Microsoft 365: User Matching]])&lt;br /&gt;
* The App Platforms clock time is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#App Platform clock time is wrong|Concept App Service Connector for Microsoft 365: App Platform clock time is wrong]])&lt;br /&gt;
* No user has a valid Connector for Microsoft 365 App license ([[Reference13r3:Concept App Service Connector for Microsoft 365#Requirements|Concept App Service Connector for Microsoft 365: Requirements]])&lt;br /&gt;
&lt;br /&gt;
===Teams License for communication user===&lt;br /&gt;
If presence subscription does not work, please check if all of the configured communication users have a Microsoft Teams license applied and no multifactor authentication is in use for this particular user. &amp;lt;br&amp;gt;&lt;br /&gt;
Also please make sure you can login with the configured credentials. (If you have set a password as an Administration, the user needs to change the password during the first login, therefore the given password will be invalid for API access).&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Sometimes, after changing setting or after the instance has restarted it can take up to 12 minutes until the presence subscription is working correctly. (Due to the subscription timeout)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
== Special Characters In Password ==&lt;br /&gt;
If you are using special characters (*, &amp;amp;, (, ), etc.) in your password you could run into a problem with the authentication of the communication user.&amp;lt;br&amp;gt;&lt;br /&gt;
The authentication failed status is being displayed. &amp;lt;br&amp;gt;&lt;br /&gt;
For the moment the only workaround is to eliminate special characters from your password.&lt;br /&gt;
&lt;br /&gt;
==App Platform clock time is wrong==&lt;br /&gt;
If the clock time at the App Platform is not correct, this will lead to an unstable behaviour of the Connector for Microsoft 365.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the Connector for Microsoft 365 is using the Microsoft Graph APIs presence subscription function, it needs to provide in its request a precise time until the subscription validity will be expired.&amp;lt;br&amp;gt;&lt;br /&gt;
The app service is handling subscription and will automatically recreate a new subscription each time the previous one has expired.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A wrong clock time will lead to false expiration times and thus&lt;br /&gt;
*  the subscription will be expired earlier than expected (synchronisation is not working because there is no valid subscription)&lt;br /&gt;
*  the subscription will be valid longer than expected (the app service is trying to create a new subscription because it is expecting the previous one to be expired - will lead to a 409 conflict error, because only one subscription can be valid at a time)&lt;br /&gt;
&lt;br /&gt;
If you are not sure about the current time of the App Platform, you can login via SSH into the App Platform and execute the &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; command to check the current time.&amp;lt;br&amp;gt;&lt;br /&gt;
You will receive an output like: &lt;br /&gt;
 Tue Mar 12 13:38:57 UTC 2024&lt;br /&gt;
Please be aware: The time is displayed in UTC, so please make sure to convert to your local time zone.&lt;br /&gt;
&lt;br /&gt;
==Geoblocking==&lt;br /&gt;
Since there might be no reliable country assignment for Microsoft addresses, all Microsoft addresses must be enabled on the upstream firewall in the event of geoblocking in order to ensure functionality of the Office365 Connector.&amp;lt;br&amp;gt;&lt;br /&gt;
As an alternative you might be able to configure your firewall to bypass the geoblocking for the configured notification URL.&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
[[Howto16r1:Configure User Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure Calendar Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure Contact Search by Connector for Microsoft365]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=78427</id>
		<title>Reference16r1:Concept App Service Connector for Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Connector_for_Microsoft_365&amp;diff=78427"/>
		<updated>2025-11-05T09:53:06Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Technical Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{FIXME|reason=This article is still work in progress}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept|Apps]]&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* Connector for Microsoft 365 from Version 16r1&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Connector for Microsoft 365 synchronizes Microsoft Teams presences with the innovaphone PBX and back, and optionally additionally Calendar presence from Exchange Online (part of the Microsoft 365 Cloud Services).&lt;br /&gt;
It is also possible to search for your own contacts. &lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX&lt;br /&gt;
* innovaphone Application Platform (minimum version 120004)&lt;br /&gt;
* V16r1&lt;br /&gt;
* App(Connector for Microsoft 365)&lt;br /&gt;
* PBX-App(innovaphone-microsoft365) license per user - order no. 02-00050-009&lt;br /&gt;
&lt;br /&gt;
== Concept ==&lt;br /&gt;
&lt;br /&gt;
=== User Presence ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure User Presence Sync by Connector for Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
If the Connector for Microsoft 365 app is fully configured, the app connects to Microsoft to obtain a token. With the token, the app gets the teams users (with a Teams license) through the Microsoft Graph API.&lt;br /&gt;
A presence subscription to Microsoft is started with the licensed users of the PBX to get presence changes in Microsoft Teams for these users. A user subscription is also started to get changes of the users (adding, deleting or update). If a user has changed, the Teams users are retrieved again. If the presence has changed, it is forwarded to the PBX. The presences of Teams are mapped to the presences of the PBX.&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Presence subscriptions are renewed every 10 minutes.&lt;br /&gt;
* License Check is made periodically.&lt;br /&gt;
&lt;br /&gt;
The app synchronises the PBX presence with Teams through the Graph Api. The on-the-phone presence will be renewed every 5 minutes. The other presences have a lifetime of 1 day but the away has a lifetime of 7 days.&lt;br /&gt;
The lifetimes are described [https://learn.microsoft.com/en-us/graph/api/presence-setuserpreferredpresence?view=graph-rest-1.0&amp;amp;tabs=http here]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please be aware:&#039;&#039;&#039; The actual change of presence or line state will be live, the above-mentioned subscriptions are needed to register against the Microsoft API for changes. &lt;br /&gt;
After successful subscription Microsoft will trigger the Connector for Microsoft 365 App every time a presence or line state for a user has changed.&lt;br /&gt;
The subscription will then be renewed in the above-mentioned time interval to receive further live updates.&lt;br /&gt;
&lt;br /&gt;
===== User Matching =====&lt;br /&gt;
You now can choose the fields used for user matching on either side from the following options:&lt;br /&gt;
* PBX&lt;br /&gt;
** CN (Long Name property from the PBX user object)&lt;br /&gt;
** h323 (Name property from the PBX user object)&lt;br /&gt;
* Azure Portal&lt;br /&gt;
** displayName&lt;br /&gt;
** mail&lt;br /&gt;
** mailNickname&lt;br /&gt;
** onPremisesDistinguishedName&lt;br /&gt;
** onPremisesSamAccountName&lt;br /&gt;
** onPremisesUserPrincipalName&lt;br /&gt;
** userPrincipalName&lt;br /&gt;
&lt;br /&gt;
Additionally, you have the possibility to remove a possibly contained domain from the Azure fields content. &amp;lt;br&amp;gt;&lt;br /&gt;
Example: &#039;user@domain.tld&#039; is transformed to &#039;user&#039;, if this option is checked.&lt;br /&gt;
&lt;br /&gt;
===== Mapping Table =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Teams Presence&lt;br /&gt;
! PBX Presence&lt;br /&gt;
|-&lt;br /&gt;
| Away&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| BeRightBack&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| Busy&lt;br /&gt;
| busy&lt;br /&gt;
|-&lt;br /&gt;
| DoNotDisturb&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| InACall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAMeeting&lt;br /&gt;
| meeting&lt;br /&gt;
|-&lt;br /&gt;
| Inactive&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| PresenceUnknown&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Available&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offline&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| Offwork&lt;br /&gt;
| online&lt;br /&gt;
|-&lt;br /&gt;
| OutOfOffice&lt;br /&gt;
| away&lt;br /&gt;
|-&lt;br /&gt;
| UrgentInterruptionsOnly&lt;br /&gt;
| dnd&lt;br /&gt;
|-&lt;br /&gt;
| Presenting&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|-&lt;br /&gt;
| InAConferenceCall&lt;br /&gt;
| on-the-phone&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value &amp;quot;online&amp;quot; unsets the Teams presence in the PBX.&lt;br /&gt;
&lt;br /&gt;
===== Master/Slave =====&lt;br /&gt;
&lt;br /&gt;
For Master/Slave combination the &amp;quot;Connector for Microsoft 365&amp;quot; App has to be added to the slave (if no full replication is on). The slave websocket connection is needed to display &amp;quot;on-the-phone&amp;quot; presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Calendar Presence ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto15r1:Configure_Calendar_Presence_Sync_by_Connector_for_Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
Introduced in 15r1 the Connector for Microsoft 365 will offer a possibility to sync Azure Portal calendar events (Teams, Exchange online) via the Graph API with the PXB presence.&amp;lt;br&amp;gt;&lt;br /&gt;
For now the [https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Calendar Calendar App] is (along with other functions) also capable of syncing calendar events, but using the old EWS mechanism, which Microsoft announced as end of life starting from 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; Please make sure to not use both apps for syncing calendar events in parallel, this is not supported and will most likely lead to conflicts and unexpected behaviours.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When the configuration of the connector for Microsoft 365 Calendar Presence Sync is complete, the app connects to Microsoft to receive a token with the calendar app registered in the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
With the token, the app can pick up the users from the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
These are matched against the users in the PBX, based on the configured &amp;quot;User Assignment&amp;quot; settings.&amp;lt;br&amp;gt;&lt;br /&gt;
For each matched user with a valid Connector for Microsoft 365 licence applied, a subscription for calendar events is created at Microsoft to receive event changes in Microsoft Calendar for these users.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user subscription is also started to receive user changes (add, delete or update).&amp;lt;br&amp;gt;&lt;br /&gt;
If a user has changed, the users are retrieved again. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a calendar event has been started or ended, it is forwarded to the PBX.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* Event subscriptions are renewed every day.&lt;br /&gt;
* License Check is made every hour.&lt;br /&gt;
&lt;br /&gt;
=== Contact Search ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Please have a look into our [[Howto16r1:Configure Calendar Presence Sync by Connector for Microsoft365|Howto guide for basic configuration aid]].&lt;br /&gt;
&lt;br /&gt;
==== Technical Overview ====&lt;br /&gt;
Introduced in 16r1 the Connector for Microsoft 365 will offer a possibility to search for your own contacts (Teams, Exchange online) via the Graph API.&lt;br /&gt;
&lt;br /&gt;
When the configuration of the connector for Microsoft 365 Contact Search is complete, the app connects to Microsoft to receive a token with the contact search app registered in the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
With the token, the app can pick up the users from the Azure portal.&amp;lt;br&amp;gt;&lt;br /&gt;
These are matched against the users in the PBX, based on the configured &amp;quot;User Assignment&amp;quot; settings.&amp;lt;br&amp;gt;&lt;br /&gt;
For each matched user with a valid Connector for Microsoft 365 licence applied, the user can search with the Phone App, for example (a myApps search provider will be provided for all apps looking using search providers looking up contacts). The search string is made available to the Connector for Microsoft 365 via the microsoft365-api. The results are sent to the consumer, e.g. the Phone App and presented there.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user subscription is started to receive user changes (add, delete or update).&amp;lt;br&amp;gt;&lt;br /&gt;
If a user has changed, the users are retrieved again. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* User subscriptions are renewed every 60 minutes.&lt;br /&gt;
* License Check is made every hour.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be aware:&#039;&#039;&#039; Since the Connector for Microsoft 365 is an app in the Scope of myApps App Platform, IP Phones and other services not using Apps cannot benefit from this search service.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
&lt;br /&gt;
=Known Limitation=&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&#039;&#039;Applies to the User Presence and the Calendar Presence&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Synchronization Delay ===&lt;br /&gt;
In the official Graph-API documentation, Microsoft is providing an overview about expected latencies for change notifications.&amp;lt;br&amp;gt;&lt;br /&gt;
You can find a whole overview table here:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/change-notifications-overview#latency&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For the user presences the resource &amp;quot;presence&amp;quot; is used and an average latency of 10 seconds but a maximum up to 1 minute is provided.&amp;lt;br&amp;gt;&lt;br /&gt;
Such a delay in syncing changed presences from Teams down to the PBX are considered normal and are caused by the Microsoft Graph-API.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In case of calendar events the average is provided as &amp;quot;less than 1 minute&amp;quot; and the maximum to 3 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Presence ==&lt;br /&gt;
=== Line states set by the PBX does not block calls in Teams ===&lt;br /&gt;
Line states set by a 3rd party application (like the Connector for Microsoft 365) through the graph API are currently &#039;&#039;&#039;only for display purpose and do not block new calls&#039;&#039;&#039; in Teams.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://techcommunity.microsoft.com/t5/teams-developer/ms-graph-setpresence-problems/m-p/2798805/highlight/true#M3957&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the above linked discussion, there once existed a feature request on Microsoft Voice, which is no longer available since it was not voted.&lt;br /&gt;
=== Maximum number of supported users ===&lt;br /&gt;
The connector now supports multiple Microsoft Teams communication users, which is the prerequisite to subscribe for more than 650 users. There is a new ribbon (Manage Teams Accounts) that allows you to configure as many communication users as you need. Every configured communication user can be used to subscribe 650 users, for example:&lt;br /&gt;
&lt;br /&gt;
*3 configured communication users x 650 licensed users = 1950 users can be subscribed&lt;br /&gt;
&#039;&#039;&#039;Please be aware&#039;&#039;&#039;: Each communication user must have a Teams license applied.&lt;br /&gt;
&lt;br /&gt;
This limitation is caused by Microsoft.&amp;lt;br&amp;gt;&lt;br /&gt;
In the documentation of the Graph-API you will find a hint to this limitation:&amp;lt;br&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/graph/changenotifications-for-presence#subscribe-to-multiple-users-presence&amp;lt;br&amp;gt;&lt;br /&gt;
Trying to subscribe more than 650 users (with one communication user) by using the presence subscription API will be declined by the graph API with an error message, that too many users are requested.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Communication User (UserSynctoPbx) ===&lt;br /&gt;
Users with MFA (multi-factor-authentication) are not supported as technical communication user for the Connector.&lt;br /&gt;
&lt;br /&gt;
=== Multiple sites / instances require multiple communication users ===&lt;br /&gt;
Each instance or each site must have separate communication users, as Microsoft only allows one concurrent subscription per communication user. (otherwise an HTTP 409 conflict will occur)&lt;br /&gt;
&lt;br /&gt;
This means that if you want to subscribe to the same Azure Portal backend from two different sites (or instances), you will need to have multiple communication users (each with an applied Teams licence) in order to be able to subscribe from all endpoints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Subscription Timeout ===&lt;br /&gt;
&lt;br /&gt;
==== Situation ====&lt;br /&gt;
Due to a current limitation in the Graph API it is not possible to cancel or delete an active presence subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
As you can see in the [https://learn.microsoft.com/en-us/graph/api/subscription-delete?view=graph-rest-1.0&amp;amp;tabs=http|documentation of the current Graph API (1.0)] the “Delete subscription” chapter does not include presence subscriptions.&amp;lt;br&amp;gt;&lt;br /&gt;
It is also not possible to have multiple subscription in parallel. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make sure to only request a new presence subscription when the old one is not valid anymore, the app will store the state of the presence subscription and the time until it is valid in the database.&amp;lt;br&amp;gt;&lt;br /&gt;
As mentioned in the chapter “Technical Overview” we are creating presence subscriptions with a validity of 10 minutes.&amp;lt;br&amp;gt;&lt;br /&gt;
The presence subscription will be renewed as soon as it is no longer valid which will be 10 minutes after initial subscription.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Impact ====&lt;br /&gt;
If settings are changed or the app instance is restarted it will check the corresponding database entry on startup.&amp;lt;br&amp;gt;&lt;br /&gt;
In case the last presence subscription was completed less than 10 minutes ago, there is still an active presence subscription and the app has to wait for it to become invalid. &amp;lt;br&amp;gt;&lt;br /&gt;
Some Changes (e.g., to the “Notification-URL”) will only take effect after a new created subscription. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The current Beta Version of the Graph API is already providing a function to delete presence subscriptions, so we hope we can improve this behavior in the future.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
===Creating an app trace===&lt;br /&gt;
For further analysis and creating a support ticket it will be useful to have a suitable app trace. &amp;lt;br&amp;gt;&lt;br /&gt;
Before creating the trace please make sure the following trace flags are activated for the app instance:&lt;br /&gt;
* App&lt;br /&gt;
* Database&lt;br /&gt;
* HTTP client&lt;br /&gt;
* TLS&lt;br /&gt;
* TCP&lt;br /&gt;
* App WebSocket&lt;br /&gt;
* Config&lt;br /&gt;
* Webserver&lt;br /&gt;
&lt;br /&gt;
After setting the config flags, please make sure to&lt;br /&gt;
* stop the instance&lt;br /&gt;
* deleting the current instance log&lt;br /&gt;
* start the instance&lt;br /&gt;
&#039;&#039;&#039;Now please wait at least 5 Minutes before you save the log&#039;&#039;&#039;, otherwise we could not have the whole picture in the trace.&lt;br /&gt;
&lt;br /&gt;
The restart and deletion of the the old log is useful the see the complete initialization process right away.&lt;br /&gt;
&lt;br /&gt;
===SSL Certificate for notification URL===&lt;br /&gt;
It also is useful to make sure the notification URL has a valid and public signed certificate.&amp;lt;br&amp;gt;&lt;br /&gt;
You can do that, using an SSL-Checker, for example: https://www.sslshopper.com/ssl-checker.html &amp;lt;br&amp;gt;&lt;br /&gt;
Without a valid, public signed certificate, Microsoft will decline the connection since it will not be possible to establish a trust relationship for the SSL/TLS secure channel.&lt;br /&gt;
&lt;br /&gt;
===Correctness of notification URL===&lt;br /&gt;
You can try to open the notification URL in your Browser&amp;lt;br&amp;gt;&lt;br /&gt;
Most likely you will see a HTTP 404 (Not Found) error message, which is the expected behavior since we are not providing an HTML website, the HTTP GET request from the browser will not be answered with content.&amp;lt;br&amp;gt;&lt;br /&gt;
This is perfectly fine since Microsoft will send presence updates with HTTP POST and will not try to request content from our app.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
What you can find out by trying to open the URL in your browser are the two following things: &amp;lt;br&amp;gt;&lt;br /&gt;
* If you receive a HTTP 404 error message you are most likely connected to an App Platform, if not you need to check your DNS (and maybe also reverse proxy) settings.&lt;br /&gt;
* If the URL is modified and the used build number is added, an app has answered your request&lt;br /&gt;
** Example: &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/subscriptions&amp;lt;/code&amp;gt; is modified to &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/&amp;lt;b&amp;gt;1510411&amp;lt;/b&amp;gt;/subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
** If this is not the case, your URL is wrong. (Be aware: The URL depends on the settings of the web server path of your app instance)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be aware:&#039;&#039;&#039; The URL-Recognition in the Application Platform is &#039;&#039;&#039;case sensitive&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== User Presence == &lt;br /&gt;
===GUI Feedback===&lt;br /&gt;
The app itself shows required states with green and red as connections to the Master PBX, Authentication and Presence Subscription to identify if there are problems. &amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes it needs a little bit time until the states are changed. &amp;lt;br&amp;gt;&lt;br /&gt;
If the states remain, it is mandatory to enable logs on the app platform and check for more information. &amp;lt;br&amp;gt;&lt;br /&gt;
([[Howto13r3:Configure Connector for Microsoft365#Creating an app trace|Concept App Service Connector for Microsoft 365: Creating an app trace]])&lt;br /&gt;
&lt;br /&gt;
====No connection to Master PBX====&lt;br /&gt;
Check the MasterPBX name.&amp;lt;br&amp;gt;&lt;br /&gt;
The field must only contain the name [&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;pbx&amp;lt;/span&amp;gt;], &#039;&#039;&#039;not the full domain&#039;&#039;&#039; [&amp;lt;span style=&amp;quot;color:red;text-decoration: line-through;&amp;quot;&amp;gt;pbx.domain.tld&amp;lt;/span&amp;gt;]. ([[Howto13r3:Configure Connector for Microsoft365#Synchronization from Teams to the PBX|Synchronization from Teams to the PBX - Master PBX field]])&lt;br /&gt;
&lt;br /&gt;
====Presence subscription failed====&lt;br /&gt;
There are many reasons why the &amp;quot;Presence subscription failed&amp;quot; message could be displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
We try to list the most common reasons:&lt;br /&gt;
* The permission for the registered app in the Azure portal are not correctly set ([[Howto13r3:Configure Connector for Microsoft365#Create an App for syncing Teams to PBX|Howto: Create an App for syncing Teams to PBX]])&lt;br /&gt;
* The Notification URL is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The App service is not reachable from the internet ([[Reference13r3:Concept App Service Connector for Microsoft 365#Correctness of notification URL|Concept App Service Connector for Microsoft 365: Correctness of notification URL]] )&lt;br /&gt;
* The certificate for the public endpoint (e.g. reverse proxy) is not valid, or not publicly signed ([[Reference13r3:Concept App Service Connector for Microsoft 365#SSL Certificate for notification URL|Concept App Service Connector for Microsoft 365: SSL Certificate for notification URL]])&lt;br /&gt;
* The user from PBX and the Azure Portal cannot be matched ([[Reference13r3:Concept App Service Connector for Microsoft 365#User Matching|Concept App Service Connector for Microsoft 365: User Matching]])&lt;br /&gt;
* The App Platforms clock time is wrong ([[Reference13r3:Concept App Service Connector for Microsoft 365#App Platform clock time is wrong|Concept App Service Connector for Microsoft 365: App Platform clock time is wrong]])&lt;br /&gt;
* No user has a valid Connector for Microsoft 365 App license ([[Reference13r3:Concept App Service Connector for Microsoft 365#Requirements|Concept App Service Connector for Microsoft 365: Requirements]])&lt;br /&gt;
&lt;br /&gt;
===Teams License for communication user===&lt;br /&gt;
If presence subscription does not work, please check if all of the configured communication users have a Microsoft Teams license applied and no multifactor authentication is in use for this particular user. &amp;lt;br&amp;gt;&lt;br /&gt;
Also please make sure you can login with the configured credentials. (If you have set a password as an Administration, the user needs to change the password during the first login, therefore the given password will be invalid for API access).&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Sometimes, after changing setting or after the instance has restarted it can take up to 12 minutes until the presence subscription is working correctly. (Due to the subscription timeout)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
== Special Characters In Password ==&lt;br /&gt;
If you are using special characters (*, &amp;amp;, (, ), etc.) in your password you could run into a problem with the authentication of the communication user.&amp;lt;br&amp;gt;&lt;br /&gt;
The authentication failed status is being displayed. &amp;lt;br&amp;gt;&lt;br /&gt;
For the moment the only workaround is to eliminate special characters from your password.&lt;br /&gt;
&lt;br /&gt;
==App Platform clock time is wrong==&lt;br /&gt;
If the clock time at the App Platform is not correct, this will lead to an unstable behaviour of the Connector for Microsoft 365.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the Connector for Microsoft 365 is using the Microsoft Graph APIs presence subscription function, it needs to provide in its request a precise time until the subscription validity will be expired.&amp;lt;br&amp;gt;&lt;br /&gt;
The app service is handling subscription and will automatically recreate a new subscription each time the previous one has expired.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A wrong clock time will lead to false expiration times and thus&lt;br /&gt;
*  the subscription will be expired earlier than expected (synchronisation is not working because there is no valid subscription)&lt;br /&gt;
*  the subscription will be valid longer than expected (the app service is trying to create a new subscription because it is expecting the previous one to be expired - will lead to a 409 conflict error, because only one subscription can be valid at a time)&lt;br /&gt;
&lt;br /&gt;
If you are not sure about the current time of the App Platform, you can login via SSH into the App Platform and execute the &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; command to check the current time.&amp;lt;br&amp;gt;&lt;br /&gt;
You will receive an output like: &lt;br /&gt;
 Tue Mar 12 13:38:57 UTC 2024&lt;br /&gt;
Please be aware: The time is displayed in UTC, so please make sure to convert to your local time zone.&lt;br /&gt;
&lt;br /&gt;
==Geoblocking==&lt;br /&gt;
Since there might be no reliable country assignment for Microsoft addresses, all Microsoft addresses must be enabled on the upstream firewall in the event of geoblocking in order to ensure functionality of the Office365 Connector.&amp;lt;br&amp;gt;&lt;br /&gt;
As an alternative you might be able to configure your firewall to bypass the geoblocking for the configured notification URL.&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
[[Howto16r1:Configure User Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure Calendar Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure Contact Search by Connector for Microsoft365]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Firmware_Upgrade_V15r1_V16r1&amp;diff=78233</id>
		<title>Howto16r1:Firmware Upgrade V15r1 V16r1</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Firmware_Upgrade_V15r1_V16r1&amp;diff=78233"/>
		<updated>2025-10-10T16:18:43Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Connector for Microsoft 365 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Applies To ==&lt;br /&gt;
This information applies to:&lt;br /&gt;
&lt;br /&gt;
* All 16r1 capable innovaphone devices&lt;br /&gt;
: For a general overview of the upgrade process and a list of supported devices with 16r1, see [[Howto:Firmware Upgrade]]&lt;br /&gt;
== Licenses ==&lt;br /&gt;
In case of cloud or rental model, don&#039;t worry about licenses.&lt;br /&gt;
&lt;br /&gt;
If the system is licensed on premise, you&#039;ll need to regenerate the license file for v16 in https://portal.innovaphone.com/ and load into the system before upgrade (The system needs to have the SSC up to date).&lt;br /&gt;
&lt;br /&gt;
== Migration Policy ==&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red; font-weight: bold&amp;quot;&amp;gt;Before you begin, be sure that your whole installation is running the latest 15r1 service release.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TechAssist Upgrade Helper ===&lt;br /&gt;
* Before you start, make sure that all TechAssist tests (you will receive the required tests in the last update in the previous major version) labelled &amp;lt;code&amp;gt;Pre Upgrade: xy&amp;lt;/code&amp;gt; are positive, if available&lt;br /&gt;
* When you are finished, make sure that all TechAssist tests (you will receive new tests with the upgrade) are positive&lt;br /&gt;
&lt;br /&gt;
=== New TLS Profile ===&lt;br /&gt;
Please note that we have changed our TLS profiles ([[Reference16r1:IP4/General/TLS]]). The new &#039;&#039;Normal&#039;&#039; setting, which is the default value, now only allows TLS 1.3 and TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
== Changes visible to the end customers ==&lt;br /&gt;
Listed here are changes that should be communicated by resellers to end users prior to a upgrade, as the change will be visible/audible in the behaviour of the application/device.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Manual steps needed after upgrade ==&lt;br /&gt;
If the installer is not used for a new installation, some new default settings are not set. Please evaluate per app whether you want to configure the new default settings manually.&lt;br /&gt;
&lt;br /&gt;
=== Connector for Microsoft 365 ===&lt;br /&gt;
If you plan to use the new &#039;&#039;&#039;Contact Search&#039;&#039;&#039; feature of the Connector for Microsoft 365, you need to perform two manual Steps:&lt;br /&gt;
# Create the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; app object by using the Settings template&lt;br /&gt;
# Assign the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; app object to every user who should be able to use the new Contact Search feature. (Of cause, you can use a template for that)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For a more detailed guide, please refer to the how-to article: [[Howto16r1:Configure Contact Search by Connector for Microsoft365#Creating the PBX app object using the PBX Manager Plugin]]&lt;br /&gt;
&lt;br /&gt;
== New Apps ==&lt;br /&gt;
New Apps will not be installed automatically by the upgrade. The installation description of new apps is usually in the concept article. Please rate per app whether you want to install/use the new app and configure it manually.&lt;br /&gt;
&lt;br /&gt;
* App Polls: [[Reference16r1:Concept App Polls]]&lt;br /&gt;
* App Service Conference Transcriptions [[Reference16r1:Concept_App_Service_myApps_Assistant]]&lt;br /&gt;
&lt;br /&gt;
== Removed ==&lt;br /&gt;
The following software is no longer included.&lt;br /&gt;
&lt;br /&gt;
* IP110A (can still be used with 15r1 firmware on current PBX versions)&lt;br /&gt;
* IP240A (can still be used with 15r1 firmware on current PBX versions)&lt;br /&gt;
* CA on CF card feature&lt;br /&gt;
&lt;br /&gt;
== Deprecated ==&lt;br /&gt;
The following software is based on legacy technology, with no further development and limited maintenance and support.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Previously deprecated and now no longer supported == &lt;br /&gt;
The following software is based on legacy technology, with no further development and no more maintenance and support.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Known Problems==&lt;br /&gt;
===Long Update-duration===&lt;br /&gt;
When you update, it can be up to 10 minutes before you have access to your app platform again.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
*[[Howto:Firmware_Upgrade]]&lt;br /&gt;
* [[Howto15r1:Firmware_Upgrade_V14r2_V15r1]]&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Firmware_Upgrade_V15r1_V16r1&amp;diff=78232</id>
		<title>Howto16r1:Firmware Upgrade V15r1 V16r1</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Firmware_Upgrade_V15r1_V16r1&amp;diff=78232"/>
		<updated>2025-10-10T14:05:49Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Connector for Microsoft 365 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Applies To ==&lt;br /&gt;
This information applies to:&lt;br /&gt;
&lt;br /&gt;
* All 16r1 capable innovaphone devices&lt;br /&gt;
: For a general overview of the upgrade process and a list of supported devices with 16r1, see [[Howto:Firmware Upgrade]]&lt;br /&gt;
== Licenses ==&lt;br /&gt;
In case of cloud or rental model, don&#039;t worry about licenses.&lt;br /&gt;
&lt;br /&gt;
If the system is licensed on premise, you&#039;ll need to regenerate the license file for v16 in https://portal.innovaphone.com/ and load into the system before upgrade (The system needs to have the SSC up to date).&lt;br /&gt;
&lt;br /&gt;
== Migration Policy ==&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red; font-weight: bold&amp;quot;&amp;gt;Before you begin, be sure that your whole installation is running the latest 15r1 service release.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TechAssist Upgrade Helper ===&lt;br /&gt;
* Before you start, make sure that all TechAssist tests (you will receive the required tests in the last update in the previous major version) labelled &amp;lt;code&amp;gt;Pre Upgrade: xy&amp;lt;/code&amp;gt; are positive, if available&lt;br /&gt;
* When you are finished, make sure that all TechAssist tests (you will receive new tests with the upgrade) are positive&lt;br /&gt;
&lt;br /&gt;
=== New TLS Profile ===&lt;br /&gt;
Please note that we have changed our TLS profiles ([[Reference16r1:IP4/General/TLS]]). The new &#039;&#039;Normal&#039;&#039; setting, which is the default value, now only allows TLS 1.3 and TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
== Changes visible to the end customers ==&lt;br /&gt;
Listed here are changes that should be communicated by resellers to end users prior to a upgrade, as the change will be visible/audible in the behaviour of the application/device.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Manual steps needed after upgrade ==&lt;br /&gt;
If the installer is not used for a new installation, some new default settings are not set. Please evaluate per app whether you want to configure the new default settings manually.&lt;br /&gt;
&lt;br /&gt;
=== Connector for Microsoft 365 ===&lt;br /&gt;
If you plan to use the new &#039;&#039;&#039;Contact Search&#039;&#039;&#039; feature of the Connector for Microsoft 365, you need to perform two manual Steps:&lt;br /&gt;
# Create the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; app object by using the settings template&lt;br /&gt;
# Assign the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; app object to every user who should be able to use the new Contact Search feature. (Of cause, you can use a template for that)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For a more detailed guide, please refer to the how-to article: [[Howto16r1:Configure Contact Search by Connector for Microsoft365#Creating the PBX app object using the PBX Manager Plugin]]&lt;br /&gt;
&lt;br /&gt;
== New Apps ==&lt;br /&gt;
New Apps will not be installed automatically by the upgrade. The installation description of new apps is usually in the concept article. Please rate per app whether you want to install/use the new app and configure it manually.&lt;br /&gt;
&lt;br /&gt;
* App Polls: [[Reference16r1:Concept App Polls]]&lt;br /&gt;
* App Service Conference Transcriptions [[Reference16r1:Concept_App_Service_myApps_Assistant]]&lt;br /&gt;
&lt;br /&gt;
== Removed ==&lt;br /&gt;
The following software is no longer included.&lt;br /&gt;
&lt;br /&gt;
* IP110A (can still be used with 15r1 firmware on current PBX versions)&lt;br /&gt;
* IP240A (can still be used with 15r1 firmware on current PBX versions)&lt;br /&gt;
* CA on CF card feature&lt;br /&gt;
&lt;br /&gt;
== Deprecated ==&lt;br /&gt;
The following software is based on legacy technology, with no further development and limited maintenance and support.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Previously deprecated and now no longer supported == &lt;br /&gt;
The following software is based on legacy technology, with no further development and no more maintenance and support.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Known Problems==&lt;br /&gt;
===Long Update-duration===&lt;br /&gt;
When you update, it can be up to 10 minutes before you have access to your app platform again.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
*[[Howto:Firmware_Upgrade]]&lt;br /&gt;
* [[Howto15r1:Firmware_Upgrade_V14r2_V15r1]]&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Firmware_Upgrade_V15r1_V16r1&amp;diff=78231</id>
		<title>Howto16r1:Firmware Upgrade V15r1 V16r1</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Firmware_Upgrade_V15r1_V16r1&amp;diff=78231"/>
		<updated>2025-10-10T13:55:25Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Manual steps needed after upgrade */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Applies To ==&lt;br /&gt;
This information applies to:&lt;br /&gt;
&lt;br /&gt;
* All 16r1 capable innovaphone devices&lt;br /&gt;
: For a general overview of the upgrade process and a list of supported devices with 16r1, see [[Howto:Firmware Upgrade]]&lt;br /&gt;
== Licenses ==&lt;br /&gt;
In case of cloud or rental model, don&#039;t worry about licenses.&lt;br /&gt;
&lt;br /&gt;
If the system is licensed on premise, you&#039;ll need to regenerate the license file for v16 in https://portal.innovaphone.com/ and load into the system before upgrade (The system needs to have the SSC up to date).&lt;br /&gt;
&lt;br /&gt;
== Migration Policy ==&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red; font-weight: bold&amp;quot;&amp;gt;Before you begin, be sure that your whole installation is running the latest 15r1 service release.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TechAssist Upgrade Helper ===&lt;br /&gt;
* Before you start, make sure that all TechAssist tests (you will receive the required tests in the last update in the previous major version) labelled &amp;lt;code&amp;gt;Pre Upgrade: xy&amp;lt;/code&amp;gt; are positive, if available&lt;br /&gt;
* When you are finished, make sure that all TechAssist tests (you will receive new tests with the upgrade) are positive&lt;br /&gt;
&lt;br /&gt;
=== New TLS Profile ===&lt;br /&gt;
Please note that we have changed our TLS profiles ([[Reference16r1:IP4/General/TLS]]). The new &#039;&#039;Normal&#039;&#039; setting, which is the default value, now only allows TLS 1.3 and TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
== Changes visible to the end customers ==&lt;br /&gt;
Listed here are changes that should be communicated by resellers to end users prior to a upgrade, as the change will be visible/audible in the behaviour of the application/device.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Manual steps needed after upgrade ==&lt;br /&gt;
If the installer is not used for a new installation, some new default settings are not set. Please evaluate per app whether you want to configure the new default settings manually.&lt;br /&gt;
&lt;br /&gt;
=== Connector for Microsoft 365 ===&lt;br /&gt;
If you plan to use the new &#039;&#039;&#039;Contact Search&#039;&#039;&#039; feature of the Connector for Microsoft 365, you need to perform two manual Steps:&lt;br /&gt;
# Create the &#039;&#039;&#039;micrsofot365-api&#039;&#039;&#039; app object by using the settings template&lt;br /&gt;
# Assign the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; app object to every user who should be able to use the new Contact Search feature. (Of cause, you can use a template for that)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For a more detailed guide, please refer to the how-to article: [[Howto16r1:Configure Contact Search by Connector for Microsoft365#Creating the PBX app object using the PBX Manager Plugin]]&lt;br /&gt;
&lt;br /&gt;
== New Apps ==&lt;br /&gt;
New Apps will not be installed automatically by the upgrade. The installation description of new apps is usually in the concept article. Please rate per app whether you want to install/use the new app and configure it manually.&lt;br /&gt;
&lt;br /&gt;
* App Polls: [[Reference16r1:Concept App Polls]]&lt;br /&gt;
* App Service Conference Transcriptions [[Reference16r1:Concept_App_Service_myApps_Assistant]]&lt;br /&gt;
&lt;br /&gt;
== Removed ==&lt;br /&gt;
The following software is no longer included.&lt;br /&gt;
&lt;br /&gt;
* IP110A (can still be used with 15r1 firmware on current PBX versions)&lt;br /&gt;
* IP240A (can still be used with 15r1 firmware on current PBX versions)&lt;br /&gt;
* CA on CF card feature&lt;br /&gt;
&lt;br /&gt;
== Deprecated ==&lt;br /&gt;
The following software is based on legacy technology, with no further development and limited maintenance and support.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Previously deprecated and now no longer supported == &lt;br /&gt;
The following software is based on legacy technology, with no further development and no more maintenance and support.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Known Problems==&lt;br /&gt;
===Long Update-duration===&lt;br /&gt;
When you update, it can be up to 10 minutes before you have access to your app platform again.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
*[[Howto:Firmware_Upgrade]]&lt;br /&gt;
* [[Howto15r1:Firmware_Upgrade_V14r2_V15r1]]&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_Contact_Search_by_Connector_for_Microsoft365&amp;diff=78230</id>
		<title>Howto16r1:Configure Contact Search by Connector for Microsoft365</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_Contact_Search_by_Connector_for_Microsoft365&amp;diff=78230"/>
		<updated>2025-10-10T13:41:12Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Creating the PBX app object using the PBX Manager Plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This article is still work in progress}}&lt;br /&gt;
&lt;br /&gt;
==Applies To==&lt;br /&gt;
This information applies to&lt;br /&gt;
Connector for Microsoft 365 from version 16r1&lt;br /&gt;
&lt;br /&gt;
==More Information==&lt;br /&gt;
&lt;br /&gt;
This article outlines a configuration scheme for Connector for Microsoft365 functionality.&amp;lt;br&amp;gt;&lt;br /&gt;
In preparation, you first will need to configure one Application in your Azure Portal. &amp;lt;br&amp;gt;&lt;br /&gt;
After that, you will install the App in your Application Platform, and configure everything.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===System Requirements===&lt;br /&gt;
&lt;br /&gt;
* Licenses &#039;&#039;&#039;innovaphone Connector for Microsoft 365&#039;&#039;&#039; per user who wants to use the innovaphone myApps Connector for Microsoft 365.&lt;br /&gt;
* &#039;&#039;&#039;account in Azure Portal of Microsoft&#039;&#039;&#039; (for each of the technical communication users, no permission role needed)&amp;lt;br&amp;gt;&lt;br /&gt;
* Must have access from the internet to your App Platform&lt;br /&gt;
** This can be done by using a reverse proxy or other firewall&lt;br /&gt;
* The public endpoint &#039;&#039;&#039;must have &#039;&#039;&#039; a &#039;&#039;&#039;valid, public signed certificate&#039;&#039;&#039; (in order to make a trusted SSL connection from the Azure cloud to the Application Platform possible)&lt;br /&gt;
** A valid certificate is required in all involved network entities - at least in the App Platform and if used in the Reverse Proxy; to ensure transmission of MS365 HTTPS POST requests to the app service in order to send notifications.&lt;br /&gt;
* Admin account for Azure Portal (only necessary for granting needed permission for registered app during setup)&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
===Configuration in Azure Portal===&lt;br /&gt;
&lt;br /&gt;
====Create an App to search for contacts====&lt;br /&gt;
* &#039;&#039;&#039;In the Azure Portal of Microsoft you have to add an app registration&#039;&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;You only have to give a name for the app&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:App_Registration_Connector_for_Microsoft365.png|thumb|none|600px|App Registration|app_registration_connector_for_microsoft365.png/]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Switch to Certificates &amp;amp; Secrets on the left&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;You only have to configure a client secret and save the value for the configuration of the app&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:Authentication_Connector_for_Microsoft365_Calendar.png|thumb|none|600px|authentication_connector_for_microsoft365_calendar.png/]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Switch to api permissions on the left&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;You have to configure application permission (Contacts.Read) and (User.Read.All) as shown in the picture&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Grant access to the api permissions, if not possible you have to ask an admin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:Azure_Select_Api-Permission.png|thumb|none|600px|azure_select_api-permission.png/]]&lt;br /&gt;
[[Image:Azure_Select_Api-Permission_Application.png|thumb|none|600px|azure_select_api-permission_application.png/]]&lt;br /&gt;
[[Image:APIPermission Connector for Microsoft365 ContactSearch.png|thumb|none|600px|APIPermission Connector for Microsoft365 ContactSearch/]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installing and configuring App Platform and PBX===&lt;br /&gt;
====Installing the connector app====&lt;br /&gt;
* First you need to install the connector app from the App Store:&lt;br /&gt;
[[Image:Microsoft365_install_app_1.png|thumb|none|600px|microsoft365_install_app_1.png/]]&lt;br /&gt;
* Install the app by selecting&lt;br /&gt;
# All apps&lt;br /&gt;
# innovaphone AG&lt;br /&gt;
# innovaphone myApps Connector for Microsoft 365&lt;br /&gt;
# select the current Version &lt;br /&gt;
# Click install&lt;br /&gt;
[[Image:Microsoft365_install_app_2.png|thumb|none|600px|microsoft365_install_app_2.png/]]&lt;br /&gt;
====Creating an instance for the connector app====&lt;br /&gt;
* For creating an Instance, in the AP Manager you need to &lt;br /&gt;
# select &#039;&#039;&#039;innovaphone myApps Connector for Microsoft 365&#039;&#039;&#039;&lt;br /&gt;
# click &#039;&#039;&#039;add&#039;&#039;&#039;&lt;br /&gt;
[[Image:Microsoft365_create_instance_1.png|thumb|none|600px|microsoft365_create_instance_1.png/]]&lt;br /&gt;
* Insert the following information and save&lt;br /&gt;
# The technical Instance Name (we suggest microsoft365)&lt;br /&gt;
# Your Domain (This should be the domain you have already configured in your PBX and your Application Platform)&lt;br /&gt;
# define a password for the communication between the PBX and the app instance&lt;br /&gt;
# define a password for the communication between the app instance and the database&lt;br /&gt;
&#039;&#039;All other fields should be filled automatically&#039;&#039;&lt;br /&gt;
[[Image:Microsoft365_create_instance_2.png|thumb|none|600px|microsoft365_create_instance_2.png/]]&lt;br /&gt;
&lt;br /&gt;
====Creating the PBX app object using the PBX Manager Plugin====&lt;br /&gt;
* Open the PBX Manager and &lt;br /&gt;
# select the &#039;&#039;&#039;AP &amp;lt;code&amp;gt;InstanceName&amp;lt;/code&amp;gt;&#039;&#039;&#039; Tile&lt;br /&gt;
# Click &#039;&#039;&#039;Add an app&#039;&#039;&#039;&lt;br /&gt;
# Click &#039;&#039;&#039;Microsoft365 App&#039;&#039;&#039;&lt;br /&gt;
[[Image:Microsoft365_pbx_manager_1.png|thumb|none|600px|microsoft365_pbx_manager_1.png/]]&lt;br /&gt;
* Specify the &#039;&#039;&#039;Name&#039;&#039;&#039; and the &#039;&#039;&#039;SIP&#039;&#039;&#039; (We suggest using &#039;&#039;&#039;&amp;lt;code&amp;gt;microsoft365&amp;lt;/code&amp;gt;&#039;&#039;&#039; for this technical names)&lt;br /&gt;
[[Image:Microsoft365_pbx_manager_2.png|thumb|none|600px|microsoft365_pbx_manager_2.png/]]&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Important:&#039;&#039;&#039; Please also add the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; to a suitable Config-Template: Every user who should be able to search via the Connector for Microsoft 365 has to have access to the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Creating the API object using the PBX Manager Plugin====&lt;br /&gt;
* Open the PBX Manager and &lt;br /&gt;
# select the &#039;&#039;&#039;AP &amp;lt;code&amp;gt;InstanceName&amp;lt;/code&amp;gt;&#039;&#039;&#039; Tile&lt;br /&gt;
# Click &#039;&#039;&#039;Add an app&#039;&#039;&#039;&lt;br /&gt;
# Click &#039;&#039;&#039;Microsoft365 API&#039;&#039;&#039;&lt;br /&gt;
[[Image:Microsoft365_pbx_manager_1.png|thumb|none|600px|microsoft365_pbx_manager_1.png/]]&lt;br /&gt;
* The &#039;&#039;&#039;Name&#039;&#039;&#039; and &#039;&#039;&#039;SIP&#039;&#039;&#039; has to be &#039;&#039;&#039;&amp;lt;code&amp;gt;microsoft365-api&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
[[Image:Microsoft_365_Settings_API.png|thumb|none|600px|microsoft_365_Settings_API.png/]]&lt;br /&gt;
&lt;br /&gt;
====Add the admin app to a user or a template====&lt;br /&gt;
To be able to configure the connector app, you need users to have access to the admin app.&amp;lt;br&amp;gt;&lt;br /&gt;
You can achieve this by adding the app to a user, or to a template. &amp;lt;br&amp;gt;&lt;br /&gt;
In this Howto - as an example - we will add the app to the &amp;lt;code&amp;gt;Config Admin&amp;lt;/code&amp;gt; template. &amp;lt;br&amp;gt;&lt;br /&gt;
* In the PBX Manager &lt;br /&gt;
# select the &amp;lt;code&amp;gt;Templates&amp;lt;/code&amp;gt; tile &lt;br /&gt;
# click on the &amp;lt;code&amp;gt;Config Admin&amp;lt;/code&amp;gt; template&lt;br /&gt;
[[Image:Microsoft365_template_1.png|thumb|none|600px|microsoft365_template_1.png/]]&lt;br /&gt;
* In the &amp;lt;code&amp;gt;Config Admin&amp;lt;/code&amp;gt; template&lt;br /&gt;
# open Apps&lt;br /&gt;
# Check the &amp;lt;code&amp;gt;app name&amp;lt;/code&amp;gt; checkbox&lt;br /&gt;
# Save the changes&lt;br /&gt;
[[Image:Microsoft365_template_2.png|thumb|none|600px|microsoft365_template_2.png/]]&lt;br /&gt;
&lt;br /&gt;
====Configure the connector with the admin app====&lt;br /&gt;
Now your admins (designated groups or configured user) should have access to the connector admin app. &amp;lt;br&amp;gt;&lt;br /&gt;
* A user with access to the app can now see a new tile in the &#039;&#039;&#039;All Apps&#039;&#039;&#039; area&lt;br /&gt;
* The name depends on the configured &amp;lt;code&amp;gt;app name&amp;lt;/code&amp;gt; from the PBX Manager plugin&lt;br /&gt;
[[Image:Microsoft365_admin_app_1.png|thumb|none|600px|microsoft365_admin_app_1.png/]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Configuration of the Contact Search=====&lt;br /&gt;
* For the contact search you select &#039;&#039;&#039;Configuration for Contact Search&#039;&#039;&#039; in the admin app&lt;br /&gt;
# &#039;&#039;&#039;ClientIDContactSearch&#039;&#039;&#039; - Please insert the Application ID (Client ID) from Azure Portal from the in preparation created Contact Search app&lt;br /&gt;
# &#039;&#039;&#039;TenantContactSearch&#039;&#039;&#039; - Please insert the Directory ID (Tenant) from Azure Portal from the in preparation created Contact Search app&lt;br /&gt;
# &#039;&#039;&#039;ClientSecretContactSearch&#039;&#039;&#039; - Please insert the shared secret from the in preparation created Contact Search app&lt;br /&gt;
# &#039;&#039;&#039;NotificationURL&#039;&#039;&#039; - You need to specify the address Microsoft can send presence updates to&lt;br /&gt;
## You need to make sure that you define a URL where you can reach your App Platform from the public internet &amp;lt;code&amp;gt;public.dns&amp;lt;/code&amp;gt;&lt;br /&gt;
## Next you need the domain you have configured in the app instance before (3.2.2) &amp;lt;code&amp;gt;your.domain&amp;lt;/code&amp;gt;&lt;br /&gt;
## Next you need the name of the instance you have configured before (3.2.2) &amp;lt;code&amp;gt;microsoft365&amp;lt;/code&amp;gt;&lt;br /&gt;
## The URL will always be terminated by &amp;lt;code&amp;gt;subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
##* &amp;lt;code&amp;gt;https://public.dns/your.domain/microsoft365/subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
[[Reference16r1:Concept App Service Connector for Microsoft 365|Concept App Service Connector for Microsoft 365]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure User Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure Calendar Presence Sync by Connector for Microsoft365]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Apps/PbxManager/App_RemoteControl&amp;diff=78227</id>
		<title>Reference16r1:Apps/PbxManager/App RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Apps/PbxManager/App_RemoteControl&amp;diff=78227"/>
		<updated>2025-10-10T10:23:04Z</updated>

		<summary type="html">&lt;p&gt;Tfu: Created page with &amp;quot;The Remote Control PBX Manager plug-in can be used to create and configure the required App object. In addition, the App object can be assigned to specific configuration templates, if any exist. Services licences can also be configured  == Add an App == ;Name :The &amp;#039;&amp;#039;name&amp;#039;&amp;#039; displayed for the App object which must be unique. &amp;#039;&amp;#039;(The field is prefilled with &amp;quot;Remote Control&amp;quot;, you can leave it as it is)&amp;#039;&amp;#039;  ;SIP :The &amp;#039;&amp;#039;sip&amp;#039;&amp;#039; of the App object which must be unique.The sip-id for...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Remote Control PBX Manager plug-in can be used to create and configure the required App object. In addition, the App object can be assigned to specific configuration templates, if any exist. Services licences can also be configured&lt;br /&gt;
&lt;br /&gt;
== Add an App ==&lt;br /&gt;
;Name&lt;br /&gt;
:The &#039;&#039;name&#039;&#039; displayed for the App object which must be unique. &#039;&#039;(The field is prefilled with &amp;quot;Remote Control&amp;quot;, you can leave it as it is)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;SIP&lt;br /&gt;
:The &#039;&#039;sip&#039;&#039; of the App object which must be unique.The sip-id for the App Object, which must be unique. &#039;&#039;(The field is prefilled with &amp;quot;remotecontrol&amp;quot;, you can leave it as it is)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Config templates &lt;br /&gt;
:If config templates exist, they will be listed with a checkbox. Tick the template of your choice to deploy the application.&lt;br /&gt;
&lt;br /&gt;
;Licences&lt;br /&gt;
:Number of purchased licences to configure (leave empty if no licenses purchased)&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
* [[{{NAMESPACE}}:Concept App Remote Control]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept App Remote Control]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Remote_Control&amp;diff=78222</id>
		<title>Reference16r1:Concept App Remote Control</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Remote_Control&amp;diff=78222"/>
		<updated>2025-10-10T09:37:44Z</updated>

		<summary type="html">&lt;p&gt;Tfu: Created page with &amp;quot;Apps Category:Concept App Remote Control == Applies to == * innovaphone PBX from version 15r1 == Requirements == * innovaphone PBX * innovaphone Application Platform (minimum version 130006) * V15r1 * myApps for Windows.  * Remote Control Client for external participants &amp;#039;&amp;#039;&amp;#039;Note : in v15r1 the Remote Control Client is only available for Windows&amp;#039;&amp;#039;&amp;#039;  == Overview == Remote Control is an application to access a remote PC.  &amp;lt;br/&amp;gt;The application can be...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
[[Category:Concept App Remote Control]]&lt;br /&gt;
== Applies to ==&lt;br /&gt;
* innovaphone PBX from version 15r1&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* innovaphone PBX&lt;br /&gt;
* innovaphone Application Platform (minimum version 130006)&lt;br /&gt;
* V15r1&lt;br /&gt;
* myApps for Windows. &lt;br /&gt;
* Remote Control Client for external participants &#039;&#039;&#039;Note : in v15r1 the Remote Control Client is only available for Windows&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Remote Control is an application to access a remote PC. &lt;br /&gt;
&amp;lt;br/&amp;gt;The application can be used by the IT department to provide remote support or it could also be used as a collaborative tool for remote work.&lt;br /&gt;
&lt;br /&gt;
== Licensing == &lt;br /&gt;
&lt;br /&gt;
* For the [[Reference15r1:Concept_App_Remote_Control#Features|licensed features]] you will need to order the &#039;&#039;&#039;Service(innovaphone-remotecontrol)&#039;&#039;&#039; license, order number : &#039;&#039;02-00050-015&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;The application includes one session by default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== For new v15r1 installation === &lt;br /&gt;
The Remote Control App is automatically installed by the installer and will be deployed in the &#039;&#039;&#039;Config User&#039;&#039;&#039; template &lt;br /&gt;
=== With the Settings App - AP app installer plug-in === &lt;br /&gt;
[[File:Ap_app_installer.png]]&lt;br /&gt;
&lt;br /&gt;
Go to the Settings App and open the &#039;&#039;&#039;&amp;quot;AP app installer&amp;quot;&#039;&#039;&#039; plugin. On the right panel, the App Store will be shown. &#039;&#039;Hint : if you access it for the first time, you will need to accept the &amp;quot;Terms of Use of the innovaphone App Store&amp;quot;&#039;&#039;&lt;br /&gt;
* In the search field located on the top right corner of the store, search for &#039;&#039;&#039;&amp;quot;remote control&amp;quot;&#039;&#039;&#039; and click on it&lt;br /&gt;
* Select the proper firmware version, here &#039;&#039;&#039;&amp;quot;v15&amp;quot;&#039;&#039;&#039; and click on install&lt;br /&gt;
* Tick &amp;quot;I accept the terms of use&amp;quot; and continue by clicking on the install yellow button&lt;br /&gt;
* Wait until the install has been finished&lt;br /&gt;
* Close and open the PBX manager to refresh the list of the available coloured AP plugin&lt;br /&gt;
* Click on the &#039;&#039;&#039;&amp;quot;AP remotecontrol&amp;quot;&#039;&#039;&#039; and click on &#039;&#039;&#039;&amp;quot; + Add an App&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
* The &#039;&#039;&#039;&amp;quot;Name&amp;quot;&#039;&#039;&#039; display name field &#039;&#039;(all characters allowed)&#039;&#039; and the &#039;&#039;&#039;&amp;quot;SIP&amp;quot;&#039;&#039;&#039; administration field &#039;&#039;(no spaces, no capital letters)&#039;&#039; are prefilled, you can leave them as they are. &lt;br /&gt;
* Tick the appropriate template to distribute the App&lt;br /&gt;
* Enter the amount of purchased licenses&lt;br /&gt;
* Click OK to save the settings and a green check mark will be shown to inform you that the configuration is good&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
=== Remote Control (remotecontrol) ===&lt;br /&gt;
This is the standard UI App for Remote Control.&lt;br /&gt;
Parameters:&lt;br /&gt;
;Websocket: Connection between the PBX and the App Platform. the App Platform receives the number of licences via this connection.&lt;br /&gt;
;PbxSignal: Protocol to register to the PBX and do signalling with the JSON signalling protocol (necessary to retrieve the TURN server data from the PBX)&lt;br /&gt;
;PbxApi: App notification and presence monitoring  of in-app user list&lt;br /&gt;
&lt;br /&gt;
== Concept ==&lt;br /&gt;
[[Image: Rcrounded.png]]&lt;br /&gt;
&lt;br /&gt;
A user (viewer) sends a request to another user (sharer) to access the sharer&#039;s PC, the sharer accepts the session and begins to share their desktop with the viewer.&lt;br /&gt;
&amp;lt;br /&amp;gt;The viewer is also automatically given control of the mouse and keyboard. Remote sessions are also possible between companies using myApps or not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
&lt;br /&gt;
Here are the features available in the Remote Control App&lt;br /&gt;
&lt;br /&gt;
;Included features&lt;br /&gt;
:&lt;br /&gt;
* App notification to start a session&lt;br /&gt;
* Multiple monitor support: Viewers can switch between desktops by clicking on the monitor icons&lt;br /&gt;
* Direction of control: Change the direction of sharing, a viewer would become a sharer&lt;br /&gt;
* Screen scaling: Two different views of the remote desktop, original size or resized&lt;br /&gt;
* Notifications: On the remote PC, if the sharer does not have the remote control open or is busy with another session, the person requesting a session will be notified within the Remote Control App&lt;br /&gt;
* Text copy &amp;amp; paste support in both directions&lt;br /&gt;
* Support for different keyboard layouts &lt;br /&gt;
&lt;br /&gt;
;Licensed features&lt;br /&gt;
:&lt;br /&gt;
* Support with participants outside your organisation&lt;br /&gt;
** Between 2 different myApps installation using Remote Control App &#039;&#039;(e.g 2 different companies)&#039;&#039; via a session link.&lt;br /&gt;
** Without myApps with the [[Reference15r1:Concept_App_Remote_Control#With_the_Remote_Control_Client_msi_application|Remote Control Client]].&lt;br /&gt;
* Share/Join session&lt;br /&gt;
** Generate a session link from Remote Control App and share it&lt;br /&gt;
** Join a session by entering a link&lt;br /&gt;
* Multiple sessions:&lt;br /&gt;
**If you need more than one session (e.g many viewers for one sharer, more than one parallel session)&lt;br /&gt;
&lt;br /&gt;
=== Remote Control with participants outside your organisation  ===&lt;br /&gt;
====With the Remote Control Client external application====&lt;br /&gt;
The Remote Control Client allows you to establish a remote session with people who are not part of your myApps environment. &#039;&#039;E.g. : external participants such as your customers&#039;&#039;. External participants see the myApps user&#039;s screen sharing.&lt;br /&gt;
* Client compatible with Windows only&lt;br /&gt;
* Easy to install, download client via a session link:&lt;br /&gt;
**Open the shared session link in a web browser and get the &#039;&#039;remoteControl.exe&#039;&#039;&lt;br /&gt;
**Open the previously downloaded file on your computer&lt;br /&gt;
**Enter your name, info and session link &#039;&#039;(same link that is used to download the client)&#039;&#039;&lt;br /&gt;
**Click on Join Session&lt;br /&gt;
&#039;&#039;Note : from 15r1sr2 we introduced a new, lighter client that requires less effort to install and use. The new client also offers a new possibility of joining sessions with elevated admin rights for users who are not admins on their computers. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====With your myApps Remote Control App====&lt;br /&gt;
It is possible to establish a remote session between 2 organisations using myApps and having the Remote Control App installed. In the App you can also join/share a session with a link.&lt;br /&gt;
*Compatible only between myApps Windows clients&lt;br /&gt;
*Easy to use:&lt;br /&gt;
**User A from company &amp;quot;xyz.com&amp;quot; opens his Remote Control App in myApps and clicks on &#039;&#039;&#039;Share session&#039;&#039;&#039;&lt;br /&gt;
**User A copies the link and sends it to User B&lt;br /&gt;
**User B from company &amp;quot;abc.com&amp;quot; opens his Remote Control App in myApps, clicks on &#039;&#039;&#039;Join session&#039;&#039;&#039; and pastes the link received from User A into the &#039;&#039;&#039;Session link text field&#039;&#039;&#039;&lt;br /&gt;
**User A will receive a Join Session notification to accept&lt;br /&gt;
**User A will see User B shared session&lt;br /&gt;
&lt;br /&gt;
=== Technical overview ===&lt;br /&gt;
[[Image:Remote-control_technical-overview.png]]&lt;br /&gt;
*Note: SCTP packets are routed through the TURN server and therefore the transmission is not peer-to-peer if the TURN server is selected from the ICE candidate.&lt;br /&gt;
&lt;br /&gt;
=== Technical data ===&lt;br /&gt;
* The maximum bitrate is 1.2Mbits for the users who is sending its desktop UI. The viewer just sends mouse and keyboards events&lt;br /&gt;
* Remote Control App is using the SCTP protocol with a fix UDP port range between [https://wiki.innovaphone.com/index.php?title=Howto:What_Ports_are_used_for_Signaling_and_Voice_Traffic_in_SIP_and_H.323%3F#Application_Sharing_(RTP)| 50200-50299]  within the myApps client. Same range as the Application Sharing feature&lt;br /&gt;
*Same port range is used by the Remote Control Client msi application&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
When you open a support ticket, you will be asked to provide us with debugging data of your issue. You can also send us screenshots/videos of the behavior you are reporting. Do not forget to send us also the PBX default configuration file. &lt;br /&gt;
&lt;br /&gt;
=== Trace flags of the App instance on the App Platform === &lt;br /&gt;
Select the corresponding App instance of the Remote Control App service and click on the &#039;&#039;&#039;Diagnostics button&#039;&#039;&#039;. Tick the following trace flags:&lt;br /&gt;
*App&lt;br /&gt;
*Database&lt;br /&gt;
&lt;br /&gt;
=== Trace flags of the myAPPS Client ===&lt;br /&gt;
Go to the myApps &#039;&#039;&#039;Burger menu&#039;&#039;&#039;, click on &#039;&#039;&#039;more&#039;&#039;&#039;, and then click the &#039;&#039;&#039;magnifying glass&#039;&#039;&#039;. Tick the following trace flag:&lt;br /&gt;
*AppSharing&lt;br /&gt;
&lt;br /&gt;
=== Trace of the Remote Control Client ===&lt;br /&gt;
Do a right click on the app try icon and click on &#039;&#039;open trace folder&#039;&#039; (&#039;&#039;default path C:\Users\[YourUser]\AppData\Local\innovaphone\RemoteControl&#039;&#039;), get the whole content in a zip file.&lt;br /&gt;
&lt;br /&gt;
==Known issues== &lt;br /&gt;
*Push notifications on sharer&#039;s smartphone : if a viewer wants to start a remote session with a sharer who does not have the Remote Control App open on their PC, a push notification is triggered on the sharer&#039;s myApps mobile phone (if installed).&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
* [[{{NAMESPACE}}:Apps/PbxManager/App RemoteControl]]&lt;br /&gt;
[[Category:Apps/PbxManager/App RemoteControl]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78220</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78220"/>
		<updated>2025-10-09T13:34:16Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* General Information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
Most of the large email providers offer the possibility to define an app that is allowed to gain access of a certain scope like SMTP. &amp;lt;br&amp;gt;&lt;br /&gt;
It assigns a Client ID / Client Secret.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Authorization for sending from the mail account needs to be given one time either:&amp;lt;br&amp;gt;&lt;br /&gt;
* By providing resource owner username/password. Sending this to the token endpoint results in an access token and long term refresh token.&lt;br /&gt;
* By interactive authorization via a popup dialogue that is loaded from the authorization endpoint. After the credentials are verified, the dialogue redirects to the redirect URI with an authorization code that is traded to an access token and refresh token.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The access token is sent for authentication in SMTP. It needs regular refresh, which will be done automatically.&lt;br /&gt;
&lt;br /&gt;
=== Modes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Exchange&#039;&#039;&#039;: Microsoft, with interactive authorization&lt;br /&gt;
* &#039;&#039;&#039;Microsoft 365&#039;&#039;&#039;: Microsoft, without interactive authorization (Resource owner and password has to be filled)&lt;br /&gt;
* &#039;&#039;&#039;Gmail&#039;&#039;&#039;: Google, with interactive authorization&lt;br /&gt;
* &#039;&#039;&#039;Google Service Account&#039;&#039;&#039;:  Google, without interactive authorization (Client e-mail, Private Key ID and Private Key of the service account must be provided)&lt;br /&gt;
* &#039;&#039;&#039;Client secret post&#039;&#039;&#039;: Generic configuration where all parameters of the client secret post OAuth2 flow can be set.&lt;br /&gt;
* &#039;&#039;&#039;Private key jwt&#039;&#039;&#039;: Generic configuration where all parameters of the private key jwt OAuth2 flow can be set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example Redirect URIs ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PBX&#039;&#039;&#039;: &amp;lt;nowiki&amp;gt;https://example-pbx.domain.com/OAUTH2-CLIENT/auth.htm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Reporting&#039;&#039;&#039;: &amp;lt;nowiki&amp;gt;https://example-ap.domain.com/domain.com/reporting/auth.htm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Fax&#039;&#039;&#039;: &amp;lt;nowiki&amp;gt;https://example-ap.domain.com/domain.com/fax/auth.htm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Users&#039;&#039;&#039;: &amp;lt;nowiki&amp;gt;https://example-ap.domain.com/domain.com/usersapp/auth.htm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Connect&#039;&#039;&#039;: &amp;lt;nowiki&amp;gt;https://example-ap.domain.com/domain.com/messages/auth.htm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;AP Manager&#039;&#039;&#039;: &amp;lt;nowiki&amp;gt;https://example-ap.domain.com/manager/auth.htm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
=== Azure Portal ===&lt;br /&gt;
Log in to Microsoft Azure Portal (https://portal.azure.com) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
&lt;br /&gt;
=== Microsoft 365 admin center ===&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exchange admin center ===&lt;br /&gt;
Login to the Exchange admin center (https://admin.exchange.microsoft.com).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
=== Preparations === &lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* [[Reference16r1:PBX/Config/Authentication]]&lt;br /&gt;
* [[Reference16r1:Apps/PbxManager/Email]]&lt;br /&gt;
* [[Reference16r1:Concept App Connect#E-Mail configuration]]&lt;br /&gt;
* [[Reference16r1:Concept App Service Fax#Mail Configuration (SMTP_Server)]]&lt;br /&gt;
* [[Reference16r1:Concept App Service Reports#Configuration]]&lt;br /&gt;
* [[Reference16r1:Concept App Service Users#Users Admin App (innovaphone-usersadmin)]]&lt;br /&gt;
* [[Reference16r1:Concept App Platform#SMTP]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78200</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78200"/>
		<updated>2025-10-08T23:58:11Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Related Articles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
Most of the large email providers offer the possibility to define an app that is allowed to gain access of a certain scope like SMTP. &amp;lt;br&amp;gt;&lt;br /&gt;
It assigns a Client ID / Client Secret.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Authorization for sending from the mail account needs to be given one time either:&amp;lt;br&amp;gt;&lt;br /&gt;
* By providing resource owner username/password. Sending this to the token endpoint results in an access token and long term refresh token.&lt;br /&gt;
* By interactive authorization via a popup dialogue that is loaded from the authorization endpoint. After the credentials are verified, the dialogue redirects to the redirect URI with an authorization code that is traded to an access token and refresh token.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The access token is sent for authentication in SMTP. It needs regular refresh, which will be done automatically.&lt;br /&gt;
&lt;br /&gt;
=== Modes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Exchange&#039;&#039;&#039;: Microsoft, with interactive authorization&lt;br /&gt;
* &#039;&#039;&#039;Microsoft 365&#039;&#039;&#039;: Microsoft, without interactive authorization (Resource owner and password has to be filled)&lt;br /&gt;
* &#039;&#039;&#039;Gmail&#039;&#039;&#039;: Google, with interactive authorization&lt;br /&gt;
* &#039;&#039;&#039;Google Service Account&#039;&#039;&#039;:  Google, without interactive authorization (Client e-mail, Private Key ID and Private Key of the service account must be provided)&lt;br /&gt;
* &#039;&#039;&#039;Client secret post&#039;&#039;&#039;: Generic configuration where all parameters of the client secret post OAuth2 flow can be set.&lt;br /&gt;
* &#039;&#039;&#039;Private key jwt&#039;&#039;&#039;: Generic configuration where all parameters of the private key jwt OAuth2 flow can be set.&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
=== Azure Portal ===&lt;br /&gt;
Log in to Microsoft Azure Portal (https://portal.azure.com) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
&lt;br /&gt;
=== Microsoft 365 admin center ===&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exchange admin center ===&lt;br /&gt;
Login to the Exchange admin center (https://admin.exchange.microsoft.com).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
=== Preparations === &lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* [[Reference16r1:PBX/Config/Authentication]]&lt;br /&gt;
* [[Reference16r1:Apps/PbxManager/Email]]&lt;br /&gt;
* [[Reference16r1:Concept App Connect#E-Mail configuration]]&lt;br /&gt;
* [[Reference16r1:Concept App Service Fax#Mail Configuration (SMTP_Server)]]&lt;br /&gt;
* [[Reference16r1:Concept App Service Reports#Configuration]]&lt;br /&gt;
* [[Reference16r1:Concept App Service Users#Users Admin App (innovaphone-usersadmin)]]&lt;br /&gt;
* [[Reference16r1:Concept App Platform#SMTP]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=78199</id>
		<title>Reference14r2:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=78199"/>
		<updated>2025-10-08T23:58:03Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* SMTP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or above&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
** Proxmox/KVM/Qemu&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How to implement large PBXs#Technical data and recommended number of users supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App services and multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. Before version 130012, you must use ISA, as Virtio was not supported with older versions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
** Proxmox: follow this description here, just with the app-platform-ova.zip: https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Proxmox_VE&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: eg. your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: eg. DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: eg. TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: eg. your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How to retrieve files from the AP| Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nightly database analyse ===&lt;br /&gt;
&lt;br /&gt;
Every database is analysed at night to keep indexes in sync with the data. This triggers a &#039;&#039;vacuumdb -a -z&#039;&#039;, which updates optimizer statistics, but does &#039;&#039;&#039;not&#039;&#039;&#039; shrink the physical size of the database.&amp;lt;br/&amp;gt;&lt;br /&gt;
This must be done manually in the instance settings.&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13 Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
After the update has been downloaded and verified, your App Platform will reboot.&lt;br /&gt;
You can check the installation process after the reboot with the following URL: https://IP-of-AP/manager/ramdisk.log&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: A timezone string which is used by the App Platform Manager to do certain jobs according to the configured timezone.&lt;br /&gt;
** Note that this doesn&#039;t change the timezone of the linux itself!&lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: see [[#Backup_of_the_Apps| Backup of Apps]]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Current Webserver certificates&#039;&#039;: shows the current certificates with the ability to download them. &lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Encrypt ==&lt;br /&gt;
&lt;br /&gt;
Configure the certificate creation by Let&#039;s Encrypt here.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Enable&#039;&#039;: turns the automatic creation on or off&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App URL&#039;&#039;: the URL of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this URL from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App Password&#039;&#039;: the client password of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this password from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Key length&#039;&#039;: 2048, 3072 or 4096 (keep in mind, that [[{{NAMESPACE}}:Certificate_management#Certificate_Key_Length_and_CPU_Usage|a higher value provides higher security but also lower performance!]])&lt;br /&gt;
* &#039;&#039;DNS Name&#039;&#039;: the external DNS names of your device (up to 100 possible)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
Starting with 16r1 you also can configure OAuth2 Authentications. You can have a look into our HowTo Article for assistance: [[Howto16r1:Configure OAuth2 E-Mail]]&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
App Platform [[#App Platform replication|replication settings]]&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Updates the App Platform to the latest image available on the App Store.&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
Restarts the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Shutdown ==&lt;br /&gt;
Shuts down the App Platform.&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 or above on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
**Note: to ensure rapid recognition of the new DNS target, the definition of an appropriate TTL value is recommended&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.innovaphone.com/index.php?title=Howto14r2:Firmware_Upgrade_V14r1_V14r2#App_Platform_and_Apps&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= App Installer PBX Manager Plugin =&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V14 and above&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The app installer plugin allows IT administrator (with access to the PBX Manager) to install/update/delete new apps from the innovaphone app store including Partners apps. It is automatically available with existing app platforms or after adding a new one in the PBX Manager.&lt;br /&gt;
It offers a view to the App Platform Manager‘s App Store with all the available functionalities and simplifies the install, update and uninstall of apps.&lt;br /&gt;
&lt;br /&gt;
== Dedicated AP for each user ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app will install the app service and add a new instance with the user’s domain. The instance is automatically started.&amp;lt;br&amp;gt;&lt;br /&gt;
This further enables the configuration of the instance through its respective PBX Manager plugin. &amp;lt;br&amp;gt;&lt;br /&gt;
Uninstalling the app will remove the app service and the corresponding instance.&lt;br /&gt;
&lt;br /&gt;
== Shared AP between users ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app works in a similar way to that of the dedicated AP. However, each time a new user installs the app, only a new instance is created if the app service is already installed. &amp;lt;br&amp;gt;&lt;br /&gt;
A user can uninstall the app, in this case the corresponding instance is deleted. If no more instances exist, then the app service is uninstalled. &amp;lt;br&amp;gt;&lt;br /&gt;
The administrator can only update the app service in such scenario.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== App Platform doesn&#039;t start after an update ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
Note: This process can take a while, after it&#039;s finished it reboots and automatically change the &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; value. &lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine ===&lt;br /&gt;
&lt;br /&gt;
Boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition.&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
=== It still doesn&#039;t start ===&lt;br /&gt;
&lt;br /&gt;
If it still doesn&#039;t start, configure the App Platform to boot from /dev/sda3 (or inside a VM start the second boot loader entry) and login with SSH as root.&lt;br /&gt;
Then do a first check to verify that you have a specific error due to an incomplete update or a [[Howto15r1:Firmware Upgrade V14r2 V15r1#AP Upgrade to Image 130006|wrong update order]]:&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* /apps/manager/manager&lt;br /&gt;
* if this outputs &#039;&#039;&#039;error while loading shared libraries: libcrypto.so.3:&#039;&#039;&#039; you have a manager version which cannot run on the current image.&lt;br /&gt;
&lt;br /&gt;
In this case you must download an older build (14r1 1410593):&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* wget --no-check-certificate -O /apps/manager/manager https://webbuild.innovaphone.com/1410593/arm/manager/manager &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* wget --no-check-certificate -O /apps/webserver/webserver https://webbuild.innovaphone.com/1410593/arm/webserver/webserver &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* chown root:root /apps/manager/manager&lt;br /&gt;
* chown root:root /apps/webserver/webserver&lt;br /&gt;
* chmod +x /apps/manager/manager&lt;br /&gt;
* chmod +x /apps/webserver/webserver&lt;br /&gt;
* echo 110000 &amp;gt; /mnt/sda1/label&lt;br /&gt;
** this allows the manager to perform an image update again&lt;br /&gt;
* /etc/init.d/S92manager start&lt;br /&gt;
* now perform an image update and &#039;&#039;&#039;afterwards&#039;&#039;&#039; update your apps again&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files|Reference14r2:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine|Reference14r2:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or &#039;&#039;&#039;130007&#039;&#039;&#039; and lower than &#039;&#039;&#039;130015&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 130015 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
&lt;br /&gt;
=== All databases ===&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
=== single database ===&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and the App database is not available during this time&lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;br /&gt;
&lt;br /&gt;
== Move instance database to external database host ==&lt;br /&gt;
&lt;br /&gt;
In case you want to use an external database server instead of the integrated:&lt;br /&gt;
&lt;br /&gt;
* download a backup of the specific instance over the App Platform Manager&lt;br /&gt;
* create a postgresql database on the external host:&lt;br /&gt;
** createdb --encoding=UTF-8 exampledb&lt;br /&gt;
* restore the backup&lt;br /&gt;
** pg_restore -d exampledb backup-exampledb.dump&lt;br /&gt;
* change the ownership to a specific postgresql user (which you have to create yourself first)&lt;br /&gt;
** psql -d postgres -c &amp;quot;ALTER DATABASE exampledb OWNER TO exampleuser&amp;quot;&lt;br /&gt;
* configure the database host, name, user and password on the instance inside the App Platform Manager&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r2:Concept_App_Service_Users&amp;diff=78198</id>
		<title>Reference13r2:Concept App Service Users</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r2:Concept_App_Service_Users&amp;diff=78198"/>
		<updated>2025-10-08T23:56:53Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Apps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
&lt;br /&gt;
The App Services Users is an App Service which can be installed on an innovaphone App Platform. It is used to administrate the users on a innovaphone PBX and also stores additional profile information. It provides Apps for users and for admins for various purposes.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX from version 13r1&lt;br /&gt;
&lt;br /&gt;
==Technical Overview==&lt;br /&gt;
[[Image:concept_users.png]]&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
=== Profile App (innovaphone-profile) ===&lt;br /&gt;
This is an App, where the user can edit his own profile data. Here the personal data, the profile picture, the privacy filters and the call forwarding can be edited. Also leave and join groups is possible from this app. The provisioning of Phones, Softphones and Hostdesking can be done too.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Websocket: to establish the connection with the PbxAdminApi&lt;br /&gt;
;TableUsers: gives access to the replication of users from and to the PBX&lt;br /&gt;
;Admin: gives access to the PbxAdminApi, needed to get data from the PBX such as the config templates, the DNS name of the PBX, the current domain...&lt;br /&gt;
;Services: needed to use the Devices API (com.innovaphone.devices), so the phones can be provisioned&lt;br /&gt;
;Devices-API: gives access to the Devices App, which is needed for the provisioning of phones&lt;br /&gt;
&lt;br /&gt;
=== Users App (innovaphone-users) ===&lt;br /&gt;
This is an App, where all the users on the App Service Database are displayed (except the ones that have unchecked the Visible attribute on Profile for the current domain).&lt;br /&gt;
&lt;br /&gt;
=== Users Admin App (innovaphone-usersadmin) ===&lt;br /&gt;
This is the administation app for the App Service. There all the users and unverified users on the current App Service can be managed. The provisioning of Phones, Softphones and Hostdesking can also be done here for several users at once. The configuration parameters can also be set here (i.e. the password policy &#039;&#039;1.upper case letters | 2.lower case letters | 3.numeric digits | 4.special characters&#039;&#039;, SMTP settings, privacy settings...). The verification link will only be valid for 24 hours, after that a new registration must be started.&lt;br /&gt;
&lt;br /&gt;
Starting with 16r1 you also can configure OAuth2 Authentications. You can have a look into our HowTo Article for assistance: [[Howto16r1:Configure OAuth2 E-Mail]]&lt;br /&gt;
&lt;br /&gt;
=== Users APIs (innovaphone-usersapis) ===&lt;br /&gt;
This is a hidden App, which provides the Search API (com.innovaphone.search) and the Avatar API (com.innovaphone.avatar). The Search API is used by Phone, Softphone and Chat to search users from the App Service Database. The Avatar API is used by myApps, Phone, Softphone, Chat, Users and Fax to obtain the profile pictures.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Hidden: UsersAPIs must be a hidden App&lt;br /&gt;
;Websocket: to establish the authentication parameters for the Avatar API (com.innovaphone.avatar)&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
=== Users ===&lt;br /&gt;
&lt;br /&gt;
With the Users plugin App objects can be created, edited and deleted for Users, UsersAdmin, UsersAPIs and Profile Apps on the PBX. Some configuration parameters can be edited here too on &amp;quot;Change Configuration&amp;quot;. These are:&lt;br /&gt;
&lt;br /&gt;
;Which Profile App use as default: if there is more than one Profile App, the one selected here will be linked to the &amp;quot;Edit Profile&amp;quot; button on myApps.&lt;br /&gt;
;Allow to create a user account using a web registration form: if this option is enable, on myApps Login the link to the registration form will be displayed.&lt;br /&gt;
;Allow users to reset the password using a web form: if this option is enable, on myApps Login the link to the password forgotten form will be displayed.&lt;br /&gt;
;Allow users to delete their own accounts: if this option is enable, a &amp;quot;Delete account&amp;quot; button will be displayed on Profile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Import/Export with CSV/XML on Users Admin App ==&lt;br /&gt;
&lt;br /&gt;
=== CSV ===&lt;br /&gt;
&lt;br /&gt;
The CSV import file expects a semicolon ; as field separator. The column/field association can be controlled by a special header line that starts with an ampersand &amp;amp;. In such a line, each column contains a designator which defines the field that the subsequent column values are assigned to. Here is the list of designators:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table&amp;quot; style=&amp;quot;text-align: left;&amp;quot; border=1&lt;br /&gt;
|-&lt;br /&gt;
! Designator !! Field !! Example !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;n || ID || Mario Rossi || Must be unique&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;h323 || Username || mro || Use as key, must be unique&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;fn || First name || Mario || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;ln || Last name || Rossi || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;e164 || Extension || 13 || Must be unique within the node&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;config || Config Template || Config User || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;node || Node || root ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;pbx || PBX Name || hq ||&lt;br /&gt;
|-&lt;br /&gt;
| pseudo/&amp;amp;type || Executive/Secretary || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;dn || Display Name || Dottore Mario Rossi ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;em || E-Mail || mario.rossi.dvl-ckl2@class.local || Must be unique&lt;br /&gt;
|-&lt;br /&gt;
| grp/&amp;amp;name || Group name || group1 ||&lt;br /&gt;
|-&lt;br /&gt;
| grp/&amp;amp;mode || Group mode || active || Either &amp;quot;active&amp;quot; or &amp;quot;&amp;quot; (empty)&lt;br /&gt;
|-&lt;br /&gt;
| grp/&amp;amp;dyn || Dynamically in, out or static || in || Either &amp;quot;in&amp;quot; (user is currently in the group), &amp;quot;out&amp;quot; (user is currently off the group) or &amp;quot;&amp;quot; (empty, user is statically in the group)&lt;br /&gt;
|-&lt;br /&gt;
| grp/&amp;amp;active || Group active || true || Either &amp;quot;true&amp;quot; (active member), &amp;quot;false&amp;quot; (not active member) or &amp;quot;&amp;quot; (empty, same as &amp;quot;false&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| device/&amp;amp;hw || Hardware Id || 0090333e407e || &lt;br /&gt;
|-&lt;br /&gt;
| device/&amp;amp;text || Name || Phone IP112 || &lt;br /&gt;
|-&lt;br /&gt;
| device/&amp;amp;app || App || phone || &lt;br /&gt;
|-&lt;br /&gt;
| device/&amp;amp;admin || PBX Pwd || true || Either &amp;quot;true&amp;quot; (checked), &amp;quot;false&amp;quot; (not checked) or &amp;quot;&amp;quot; (empty, same as false)&lt;br /&gt;
|-&lt;br /&gt;
| device/&amp;amp;nofilter || No IP Filter || true || Either &amp;quot;true&amp;quot; (checked), &amp;quot;false&amp;quot; (not checked) or &amp;quot;&amp;quot; (empty, same as false)&lt;br /&gt;
|-&lt;br /&gt;
| device/&amp;amp;tls || TLS Only || true || Either &amp;quot;true&amp;quot; (checked), &amp;quot;false&amp;quot; (not checked) or &amp;quot;&amp;quot; (empty, same as false)&lt;br /&gt;
|-&lt;br /&gt;
| device/&amp;amp;nomob || No Mobility || true || Either &amp;quot;true&amp;quot; (checked), &amp;quot;false&amp;quot; (not checked) or &amp;quot;&amp;quot; (empty, same as false)&lt;br /&gt;
|-&lt;br /&gt;
| device/&amp;amp;trusted || Reverse Proxy || true || Either &amp;quot;true&amp;quot; (checked), &amp;quot;false&amp;quot; (not checked) or &amp;quot;&amp;quot; (empty, same as false)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;n;&amp;amp;h323;&amp;amp;e164;&amp;amp;config;&amp;amp;node;&amp;amp;pbx;pseudo/&amp;amp;type;&amp;amp;dn;&amp;amp;em;&amp;amp;fn;&amp;amp;ln&lt;br /&gt;
Mario Rossi;mro;13;Config User;root;hq;;Dottore Mario Rossi;mario.rossi.dvl-ckl2@class.local;Mario;Rossi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML ===&lt;br /&gt;
&lt;br /&gt;
With the XML format, a more complete information of the users can be provided. When importing no validation of the data takes place.&lt;br /&gt;
&lt;br /&gt;
==== User ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table&amp;quot; style=&amp;quot;text-align: left;&amp;quot; border=1&lt;br /&gt;
|-&lt;br /&gt;
! Attribute !! Field !! Example !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| cn || ID || Mario Rossi || Must be unique&lt;br /&gt;
|-&lt;br /&gt;
| guid || GUID || ac47a659-8a81-4595-9e73-9afba80d9d31 || Must be unique&lt;br /&gt;
|-&lt;br /&gt;
| h323 || Username || mro || Use as key, must be unique&lt;br /&gt;
|-&lt;br /&gt;
| fn || First name || Mario || &lt;br /&gt;
|-&lt;br /&gt;
| ln || Last name || Rossi || &lt;br /&gt;
|-&lt;br /&gt;
| e164 || Extension || 13 || Must be unique within the node&lt;br /&gt;
|-&lt;br /&gt;
| pwdx || Encrypted password ||  || &lt;br /&gt;
|-&lt;br /&gt;
| apps-my || List of apps attached to homescreen || &amp;quot;users,chat,phone&amp;quot; || Must be separeted by ,&lt;br /&gt;
|-&lt;br /&gt;
| config || Config Template || ConfigUser || &lt;br /&gt;
|-&lt;br /&gt;
| node || Node || root ||&lt;br /&gt;
|-&lt;br /&gt;
| loc || PBX Name || master ||&lt;br /&gt;
|-&lt;br /&gt;
| dn || Display Name || Dottore Mario Rossi ||&lt;br /&gt;
|-&lt;br /&gt;
| email || E-Mail || mario.rossi.dvl-ckl2@class.local || Must be unique&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Device ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table&amp;quot; style=&amp;quot;text-align: left;&amp;quot; border=1&lt;br /&gt;
|-&lt;br /&gt;
! Attribute !! Field !! Example !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| hw || Hardware ID || SwPh_mro_60929ce7 || &lt;br /&gt;
|-&lt;br /&gt;
| text || Name || Softphone || &lt;br /&gt;
|-&lt;br /&gt;
| app || App || softphone || &lt;br /&gt;
|-&lt;br /&gt;
| admin || PBX Pwd || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| no-filter || No IP Filter || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| tls || TLS only || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| no-mob || No Mobility || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| trusted || Reverse Proxy || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Allow ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table&amp;quot; style=&amp;quot;text-align: left;&amp;quot; border=1&lt;br /&gt;
|-&lt;br /&gt;
! Attribute !! Field !! Example !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| name || Name of the visibility filter || @test1.com || &lt;br /&gt;
|-&lt;br /&gt;
| online || Online || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| visible || Visible || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| presence || Presence || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| otf || On the phone || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| note || Presence note || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| dialog || Calls || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| ids || Calls with Number || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Grp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table&amp;quot; style=&amp;quot;text-align: left;&amp;quot; border=1&lt;br /&gt;
|-&lt;br /&gt;
! Attribute !! Field !! Example !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| name || Name of the group || grp1 || &lt;br /&gt;
|-&lt;br /&gt;
| mode || Active || active || Either &amp;quot;active&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| dyn || Dynamically in, out or static || in || Either &amp;quot;in&amp;quot; (dynamically in), &amp;quot;out&amp;quot; (dynamically out) or not displayed (static)&lt;br /&gt;
|-&lt;br /&gt;
| active || Active || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Cd ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table&amp;quot; style=&amp;quot;text-align: left;&amp;quot; border=1&lt;br /&gt;
|-&lt;br /&gt;
! Attribute !! Field !! Example !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| type || Call diversion type || cfu || Either &amp;quot;cfu&amp;quot; (always), &amp;quot;cfb&amp;quot; (busy) or &amp;quot;cfnr&amp;quot; (no response)&lt;br /&gt;
|-&lt;br /&gt;
| bool || Boolean || booltest || &lt;br /&gt;
|-&lt;br /&gt;
| bool_not || Not || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| src || Filters applied || &amp;amp;lt;src type=&amp;amp;quot;do&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;ep e164=&amp;amp;quot;789&amp;amp;quot; ext=&amp;amp;quot;true&amp;amp;quot; fwd=&amp;amp;quot;clid&amp;amp;quot;/&amp;amp;gt;&amp;amp;lt;/src&amp;amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| ep || Name/Number to forward the call || 1234 || h323 or e164&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Fork ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table&amp;quot; style=&amp;quot;text-align: left;&amp;quot; border=1&lt;br /&gt;
|-&lt;br /&gt;
! Attribute !! Field !! Example !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| hw || Hardware ID || Smartphone || &lt;br /&gt;
|-&lt;br /&gt;
| bool || Boolean || booltest || &lt;br /&gt;
|-&lt;br /&gt;
| bool_not || Not || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| e164 || Number || 1234 || &lt;br /&gt;
|-&lt;br /&gt;
| h323 || Name || user0 || &lt;br /&gt;
|-&lt;br /&gt;
| mobility || Mobility object || Mobility || &lt;br /&gt;
|-&lt;br /&gt;
| delay || Delay || 30 || &lt;br /&gt;
|-&lt;br /&gt;
| min || Min-Alert || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| max || Max-Alert || 20 || &lt;br /&gt;
|-&lt;br /&gt;
| cw || Call-Waiting || true || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|-&lt;br /&gt;
| off || Disable || 20 || Either &amp;quot;true&amp;quot; (checked) or not displayed (not checked)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;info&amp;gt;&lt;br /&gt;
	&amp;lt;user cn=&amp;quot;Mario Rossi&amp;quot; guid=&amp;quot;ac47a659-8a81-4595-9e73-9afba80d9d31&amp;quot; h323=&amp;quot;mro&amp;quot; fn=&amp;quot;Mario&amp;quot; ln=&amp;quot;Rossi&amp;quot; e164=&amp;quot;13&amp;quot; pwd=&amp;quot;********&amp;quot; pwdx=&amp;quot;...87&amp;quot; &lt;br /&gt;
apps-my=&amp;quot;users,chat,phone,dev%3ASwPh_mro_60929ce7&amp;quot; email=&amp;quot;mario.rossi.dvl-ckl2@class.local&amp;quot; node=&amp;quot;root&amp;quot; loc=&amp;quot;master&amp;quot; config=&amp;quot;ConfigUser&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;device hw=&amp;quot;SwPh_mro_60929ce7&amp;quot; text=&amp;quot;Softphone&amp;quot; app=&amp;quot;softphone&amp;quot; admin=&amp;quot;true&amp;quot; no-filter=&amp;quot;true&amp;quot; tls=&amp;quot;true&amp;quot; no-mob=&amp;quot;true&amp;quot; trusted=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;allow name=&amp;quot;@test1.com&amp;quot; visible=&amp;quot;true&amp;quot; presence=&amp;quot;true&amp;quot; otf=&amp;quot;true&amp;quot; note=&amp;quot;true&amp;quot; dialog=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;allow name=&amp;quot;department&amp;quot; grp=&amp;quot;true&amp;quot; visible=&amp;quot;true&amp;quot; _online=&amp;quot;true&amp;quot; dialog=&amp;quot;true&amp;quot; ids=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;grp name=&amp;quot;grp1&amp;quot; mode=&amp;quot;active&amp;quot; dyn=&amp;quot;in&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;grp name=&amp;quot;grp2&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;cd type=&amp;quot;cfu&amp;quot; bool=&amp;quot;booltest&amp;quot; src=&amp;quot;&amp;amp;lt;src type=&amp;amp;quot;do&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;ep e164=&amp;amp;quot;789&amp;amp;quot; ext=&amp;amp;quot;true&amp;amp;quot; fwd=&amp;amp;quot;clid&amp;amp;quot;/&amp;amp;gt;&amp;amp;lt;/src&amp;amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;ep e164=&amp;quot;1234&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/cd&amp;gt;&lt;br /&gt;
		&amp;lt;cd type=&amp;quot;cfb&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;ep h323=&amp;quot;user0&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/cd&amp;gt;&lt;br /&gt;
		&amp;lt;fork hw=&amp;quot;Smartphone&amp;quot; e164=&amp;quot;1234&amp;quot; bool=&amp;quot;booltest&amp;quot; mobility=&amp;quot;Mobility&amp;quot; delay=&amp;quot;20&amp;quot; min=&amp;quot;20&amp;quot; max=&amp;quot;20&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt;&lt;br /&gt;
	&amp;lt;user cn=&amp;quot;User0&amp;quot; guid=&amp;quot;ac47a659-8a81-4595-9e73-9afba80d9d31&amp;quot; h323=&amp;quot;user0&amp;quot; e164=&amp;quot;300&amp;quot; pwd=&amp;quot;********&amp;quot; pwdx=&amp;quot;...87&amp;quot; apps-my=&amp;quot;apps,main,chat,users&amp;quot; node=&amp;quot;root&amp;quot; loc=&amp;quot;master&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt;&lt;br /&gt;
&amp;lt;/info&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r1:Concept_App_Service_Reports&amp;diff=78197</id>
		<title>Reference14r1:Concept App Service Reports</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r1:Concept_App_Service_Reports&amp;diff=78197"/>
		<updated>2025-10-08T23:53:24Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
&lt;br /&gt;
The App Service Reporting is an App Service which can be installed on an innovaphone App Platform. It is used to provide call lists in myApps and to create call reports.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX from version 13r1&lt;br /&gt;
&lt;br /&gt;
== Technical Overview ==&lt;br /&gt;
[[Image:Concept_reporting.png]]&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
=== Reports App (innovaphone-reporting) ===&lt;br /&gt;
This is the Reporting UI App.&lt;br /&gt;
&lt;br /&gt;
[[File:Reference14r1_Concept_App_Service_Reports_App.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Legend of used symbols:&lt;br /&gt;
&lt;br /&gt;
[[Image:Reporting_symbol_legend.png]]&lt;br /&gt;
&lt;br /&gt;
You can display all or filtered calls and sort them by time, name, call and alert duration.&lt;br /&gt;
The amount of displayed entries in the UI is limited to 10000.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Websocket:&lt;br /&gt;
&lt;br /&gt;
=== Call List App (innovaphone-calllist) ===&lt;br /&gt;
This is the Call list App.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Websocket: &lt;br /&gt;
&lt;br /&gt;
=== Call List API (innovaphone-calllist-api) ===&lt;br /&gt;
This is an App, which provides the Call list API (com.innovaphone.calllist). This API can be used to find the recent calls of a user.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Websocket: &lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
=== Reporting ===&lt;br /&gt;
&lt;br /&gt;
With the Reporting plugin App objects can be created, edited and deleted for the provided Apps.&lt;br /&gt;
&lt;br /&gt;
====Configuration====&lt;br /&gt;
&lt;br /&gt;
Following configuration options are offered:&lt;br /&gt;
&lt;br /&gt;
* CDR handling&lt;br /&gt;
** automatic deletion of CDRs&lt;br /&gt;
** deletion interval - default is 90 days. If configured, deletion is performed at 3 a.m. UTC.&lt;br /&gt;
&lt;br /&gt;
* Account for CDR authentication&lt;br /&gt;
&lt;br /&gt;
* Account for authentication for external apps (When username and password are defined external app will be able to fetch PDF,XML or CSV report with HTTP GET requests using HTTP Authentication.)&lt;br /&gt;
&lt;br /&gt;
* SMTP Configuration&lt;br /&gt;
When reports should be send by email the SMTP Server address and the login credentials must be specified. An example configuration can be seen on the screen shot.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Reference14r1_Concept_App_Service_PBX-Manager-Plugin.png|400px|SMTP Configuration]]&lt;br /&gt;
&lt;br /&gt;
Starting with 16r1 you also can configure OAuth2 Authentications. You can have a look into our HowTo Article for assistance: [[Howto16r1:Configure OAuth2 E-Mail]]&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
===Database Structure===&lt;br /&gt;
&lt;br /&gt;
====cdrs====&lt;br /&gt;
The service receives CDRs in XML format at the URL http://AP-IP/DOMAIN/reporting/cdr . That URL must be configured at the PBX.&lt;br /&gt;
&lt;br /&gt;
Each received cdr-xml is formed by a cdr tag and an undefined number of event and group tags.&lt;br /&gt;
(Refer to: [[Reference13r3:Concept_Call_Detail_Record_CDR_PBX|CDR]])&lt;br /&gt;
&lt;br /&gt;
This section is composed by four tables: cdrs, events, groups and cdr_properties.&lt;br /&gt;
The first three tables contain the corresponding fields to store the information contained in the cdr, event and group tags.&amp;lt;br&amp;gt;&lt;br /&gt;
Each CDR represents the call in the view of one PBX object. So there might be multiple CDRs for one call if multiple PBX objects are used within the call.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cdr fields:&#039;&#039;&#039; &lt;br /&gt;
** id&lt;br /&gt;
** guid&lt;br /&gt;
** user_guid&lt;br /&gt;
** conf&lt;br /&gt;
** sys&lt;br /&gt;
** pbx&lt;br /&gt;
** node&lt;br /&gt;
** phys&lt;br /&gt;
** device&lt;br /&gt;
** h323&lt;br /&gt;
** e164&lt;br /&gt;
** cn&lt;br /&gt;
** dn&lt;br /&gt;
** email&lt;br /&gt;
** dir&lt;br /&gt;
** external&lt;br /&gt;
** licensed&lt;br /&gt;
** more_calls: set inside the CDR XML if there are multiple calls for the same call and user (e.g. multiple registrations)&lt;br /&gt;
** conn_duration&lt;br /&gt;
** alert_duration&lt;br /&gt;
** call_duration&lt;br /&gt;
** billing_duration&lt;br /&gt;
** utc_stamp: unix timestamp in &#039;&#039;&#039;milliseconds&#039;&#039;&#039; since 1970&lt;br /&gt;
** cause&lt;br /&gt;
** remote_e164&lt;br /&gt;
** remote_h323&lt;br /&gt;
** remote_dn&lt;br /&gt;
** call_list: CDR which is suitable for calllist or report queries (this flag is set depending on data received inside a CDR)&lt;br /&gt;
** missed_call&lt;br /&gt;
** status: the final state of the CDR (co: connected, al: alerting, er: error, bu: busy)&lt;br /&gt;
** further: flag is set if CDR has been cancelled with cause 26 (non selected user clearing) indicating that there will be another more suitable CDR for the same call&lt;br /&gt;
** user_id&lt;br /&gt;
** callback_e164&lt;br /&gt;
** callback_h323&lt;br /&gt;
** callback_dn&lt;br /&gt;
** callback_time&lt;br /&gt;
** remote_clir: this flag is set if the remote side suppresses the calling information (number, name etc.)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;event fields:&#039;&#039;&#039; &lt;br /&gt;
** id&lt;br /&gt;
** cdr_id&lt;br /&gt;
** msg&lt;br /&gt;
** ext&lt;br /&gt;
** e164&lt;br /&gt;
** h323&lt;br /&gt;
** dn&lt;br /&gt;
** conf&lt;br /&gt;
** cause&lt;br /&gt;
** time: the kernel uptime of the sending gateway in seconds. Substract time from a newer event (higher id) of a previous event to get the elapsed seconds inbetween.&lt;br /&gt;
** clir&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;group fields:&#039;&#039;&#039; &lt;br /&gt;
** id&lt;br /&gt;
** name&lt;br /&gt;
** active&lt;br /&gt;
** type&lt;br /&gt;
** cdr_id&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;id&#039;&#039;&#039; field is assigned by postgresql for each entry and has nothing to do with the information present in the cdr. It is different for each entry inside the table.&lt;br /&gt;
&lt;br /&gt;
The events table has two additional fields, called cdr_id, to associate these events to the corresponding cdr entry and order_index to keep their position inside the cdr.&lt;br /&gt;
Groups table has also the cdr_id field to associate the group entries to the corresponding cdr and events entries.&lt;br /&gt;
&lt;br /&gt;
 The table cdrp_properties from version 10 has been removed. Most columns can be now found directly in the table cdrs.&lt;br /&gt;
 If you need the callflow in a similar way, you can JOIN the events table (GROUP BY cdr_id) and run a query which creates an array string from the events table:&lt;br /&gt;
 &lt;br /&gt;
 array_agg(array[ev.msg, COALESCE(ev.e164,&#039;&#039;), COALESCE(ev.h323,&#039;&#039;), COALESCE(ev.dn,&#039;&#039;)] ORDER BY ev.id) AS callflow&lt;br /&gt;
&lt;br /&gt;
====cdr_users====&lt;br /&gt;
&lt;br /&gt;
This table contains a timestamp &#039;&#039;&#039;missed_calls_time&#039;&#039;&#039; for the last call list access by a user &#039;&#039;&#039;sip&#039;&#039;&#039;. It is used to retrieve information about missed calls since the last use of mypbx/myApps.&amp;lt;br&amp;gt;&lt;br /&gt;
The timestamp &#039;&#039;&#039;clear_report_time&#039;&#039;&#039; indicates the last clearance time.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Database query samples===&lt;br /&gt;
&lt;br /&gt;
====Calllist query====&lt;br /&gt;
&lt;br /&gt;
 SELECT cdr.id, cdr.cn, cdr.conf, dir, external, alert_duration, call_duration, conn_duration, billing_duration, &lt;br /&gt;
    sys, pbx, node, phys, cdr.cause, utc_stamp, status, further, &lt;br /&gt;
    CASE WHEN remote_clir THEN &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; ELSE remote_e164 END, &lt;br /&gt;
    CASE WHEN remote_clir THEN &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; ELSE remote_h323 END, &lt;br /&gt;
    CASE WHEN remote_clir THEN &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; ELSE remote_dn END, &lt;br /&gt;
    callback_e164, callback_h323, callback_dn, callback_time, cdr.e164, cdr.h323 &lt;br /&gt;
 FROM cdrs cdr &lt;br /&gt;
 JOIN cdr_users cu ON cdr.user_id = cu.id &lt;br /&gt;
 WHERE cu.cn NOT IN (&#039;_ADMIN_&#039;,&#039;_KADMIN_&#039;,&#039;_EXTERN_&#039;,&#039;_UNKNOWN_&#039;,&#039;_MASTER_&#039;,&#039;_STANDBY_&#039;,&#039;_ACTIVE_&#039;,&#039;_MOH_&#039;,&#039;_HTTP_&#039;,&#039;_CONF_&#039;) AND (cu.sip = &#039;sip&#039; OR cu.guid = &#039;00000000000000000000000000000000&#039;) &lt;br /&gt;
    AND cdr.call_list = true &lt;br /&gt;
    AND (cu.clear_report_time IS NULL OR utc_stamp &amp;gt; cu.clear_report_time) &lt;br /&gt;
 ORDER BY utc_stamp DESC, cdr.id DESC LIMIT &#039;5&#039; OFFSET &#039;0&#039;&lt;br /&gt;
&lt;br /&gt;
====Reporting query====&lt;br /&gt;
&lt;br /&gt;
 WITH inp AS (SELECT 1611187200000::BIGINT AS from, 1611211143042::BIGINT AS to, &#039;sip&#039;::VARCHAR AS sip, &#039;cn&#039;::VARCHAR AS cn, &#039;TRUE&#039;::BOOLEAN AS check_objects) &lt;br /&gt;
 SELECT cdr.id, cdr.cn, cdr.conf, dir, external, alert_duration, call_duration, conn_duration, &lt;br /&gt;
    billing_duration, sys, pbx, node, phys, cdr.cause, utc_stamp, status, further, remote_e164, &lt;br /&gt;
    remote_h323, remote_dn, callback_e164, callback_h323, callback_dn, callback_time, cdr.e164, &lt;br /&gt;
    cdr.h323, cdr.dn, &lt;br /&gt;
    array_agg(array[ev.msg, COALESCE(ev.e164,&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;), COALESCE(ev.h323,&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;), COALESCE(ev.dn,&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;), &#039;false&#039;] ORDER BY ev.id) &lt;br /&gt;
 FROM inp, cdrs cdr &lt;br /&gt;
 JOIN cdr_users cu ON cdr.user_id = cu.id &lt;br /&gt;
 JOIN events ev ON ev.cdr_id = cdr.id &lt;br /&gt;
 WHERE cdr.call_list = true &lt;br /&gt;
    AND cdr.licensed = true &lt;br /&gt;
    AND utc_stamp &amp;gt;= inp.from &lt;br /&gt;
    AND utc_stamp &amp;lt; inp.to &lt;br /&gt;
    AND (inp.check_objects=false OR LOWER(cu.sip) LIKE LOWER(inp.sip) OR LOWER(cu.cn) LIKE LOWER(inp.cn)) &lt;br /&gt;
 GROUP BY cdr.id &lt;br /&gt;
 ORDER BY utc_stamp ASC &lt;br /&gt;
 LIMIT 10000&lt;br /&gt;
&lt;br /&gt;
=== Database access ===&lt;br /&gt;
&lt;br /&gt;
You have to grant [[Reference14r1:Concept_App_Platform#Database|database access]] in the AP-Platform.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The database user and password can be configured for every Reporting instance inside the AP Manager if you edit the instance.&amp;lt;br&amp;gt;&lt;br /&gt;
These database credentials are just used internally and not e.g. inside the PBX App Objects.&lt;br /&gt;
&lt;br /&gt;
==== Write an own app ====&lt;br /&gt;
&lt;br /&gt;
Currently there can be two ways for an own App:&lt;br /&gt;
&lt;br /&gt;
* You receive the CDRs from the CDR interfaces yourself and store them into your own database with your own structure.&lt;br /&gt;
* You hand the Reporting database credentials to your own App and connect directly to the Reporting database within your own App. This saves you the parsing and storing of the data, but you must maintain your queries if something in the Reporting database is changed. It is important, that you should just access this data &#039;&#039;&#039;readonly&#039;&#039;&#039; and that you do &#039;&#039;&#039;not modify&#039;&#039;&#039; table data!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for automatic download of existing CSV files:&lt;br /&gt;
&lt;br /&gt;
#establish a web socket connection for reporting using [[Reference13r2:Concept_Talking_to_the_v13_Application_Platform_using_PHP | PHP ]]&lt;br /&gt;
#request the session key with { &amp;quot;mt&amp;quot;: &amp;quot;Start&amp;quot; }&lt;br /&gt;
#receive the session key which e.g. looks like {&amp;quot;mt&amp;quot;: &amp;quot;StartResult&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;189&amp;quot;, &amp;quot;key&amp;quot;: &amp;quot;552ca6fe05a19&amp;quot;}&lt;br /&gt;
#while the web socket connection is established, a GET request using received data can be sent like this:&lt;br /&gt;
#*&amp;lt;nowiki&amp;gt;http://AP-IP/DOMAIN/reporting/reports/report-20200408-1015.csv?session=189&amp;amp;key=552ca6fe05a19&amp;amp;lang=de&amp;amp;tz=Europe/Berlin&amp;amp;type=csv&amp;amp;sip=&amp;amp;from=1586304000000&amp;amp;to=1586333749607&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Remote Interface ====&lt;br /&gt;
&lt;br /&gt;
You can retrieve the PDF/XML/CSV report with a remote interface. After the configuration in the PBX Manager Plugin (Set user name and password under &#039;&#039;&#039;[[Reference14r1:Apps/PbxManager/App_Reports#Account_for_external_applications| Account for external applications]]&#039;&#039;&#039;) make a GET HTTP request to http://AP-IP/DOMAIN/reporting/ext/ with the following parameters:&lt;br /&gt;
&lt;br /&gt;
    from : the from date/time as a local timestamp&lt;br /&gt;
    to: the to date/time as a local timestamp&lt;br /&gt;
    type: the return format, allowed values:&lt;br /&gt;
        xml&lt;br /&gt;
        pdf&lt;br /&gt;
        csv&lt;br /&gt;
    [anonymous]: anonymizes names and numbers (&amp;quot;true&amp;quot; or &amp;quot;false&amp;quot;), default is true&lt;br /&gt;
    &lt;br /&gt;
    [filterNames]: use a filter with its name. You can use multiple filters inside of a filter array filterNames=[{&amp;quot;name&amp;quot;:&amp;quot;filter1&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;filter2&amp;quot;},...]&lt;br /&gt;
    [lang]: the language, e.g. &amp;quot;en&amp;quot; or &amp;quot;de&amp;quot;&lt;br /&gt;
    tz: the time zone corresponding to the time stamp&lt;br /&gt;
    [sip]: the SIP or Cn (Long Name) of the object you want to filter for&lt;br /&gt;
    &lt;br /&gt;
Parameters in [] are optional.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 http://ap.innovaphone.com/innovaphone.com/reporting/ext/report.xml?lang=en&amp;amp;tz=Europe/Berlin&amp;amp;type=xml&amp;amp;sip=&amp;amp;from=1692136800000&amp;amp;to=1698056896320&amp;amp;filterNames=&amp;amp;anonymous=true &lt;br /&gt;
&lt;br /&gt;
Gets all records between 2023-08-16 and 2011-10-23 in time zone Europe/Berlin.&lt;br /&gt;
&lt;br /&gt;
 http://ap.innovaphone.com/innovaphone.com/reporting/ext/report.xml?lang=en&amp;amp;tz=Europe/Berlin&amp;amp;type=xml&amp;amp;sip=&amp;amp;from=1692136800000&amp;amp;to=1698056896320&amp;amp;filterNames=[{&amp;quot;name&amp;quot;:&amp;quot;Only Incoming  Calls&amp;quot;}]&amp;amp;anonymous=true&lt;br /&gt;
&lt;br /&gt;
Gets all &amp;quot;Incoming calls&amp;quot; records between 2023-08-16 and 2011-10-23 in time zone Europe/Berlin. (The filter must be defined beforehand)&lt;br /&gt;
&lt;br /&gt;
===CSV, XML or PDF export===&lt;br /&gt;
&lt;br /&gt;
There is no limit of entries anymore concerning the export as XML,CSV or PDF (Previously there was a limit of 20000 entries). But keep in mind, that the creation of large reports will take a considerable amount of time and load. Depending on your hardware the download of very large reports may take several minutes and currently no feedback is given by the service when a &amp;quot;Download report&amp;quot; request is made. (This will be added in future versions). &lt;br /&gt;
&lt;br /&gt;
The field description applies to the &#039;&#039;&#039;CSV&#039;&#039;&#039; columns! &lt;br /&gt;
&lt;br /&gt;
* time: the node contains a formatted time string of the local time&lt;br /&gt;
* object: the PBX object name (also called cn)&lt;br /&gt;
* conference id: the conference id of the call&lt;br /&gt;
* call: &#039;&#039;&#039;int&#039;&#039;&#039; (internal) or &#039;&#039;&#039;ext&#039;&#039;&#039; (external) call&lt;br /&gt;
* Original Called,: In case of Call flow; The original called device&lt;br /&gt;
* Diverting,: In case of Call flow; The diverting device&lt;br /&gt;
* Transferring,: In case of Call flow; The transferring device&lt;br /&gt;
* node: the node of the PBX object&lt;br /&gt;
* pbx: the pbx of the PBX object&lt;br /&gt;
* phys: physical location name of the pbx&lt;br /&gt;
* cause: the decimal disconnect reason of the call (see [[Reference:ISDN_Cause_Codes]])&lt;br /&gt;
* remote:&lt;br /&gt;
** outgoing calls -&amp;gt; dialed endpoint&lt;br /&gt;
** incoming calls -&amp;gt; first ep2 above entry event or entry event if this is the first one&lt;br /&gt;
** incoming calls with incoming transfer after entry event -&amp;gt; transfer target&lt;br /&gt;
* status:&lt;br /&gt;
** outgoing calls -&amp;gt; best found status in call flow&lt;br /&gt;
** incoming calls -&amp;gt; status of entry event&lt;br /&gt;
** &#039;&#039;&#039;co&#039;&#039;&#039; (connected)&lt;br /&gt;
** &#039;&#039;&#039;al&#039;&#039;&#039; (alert)&lt;br /&gt;
** &#039;&#039;&#039;er&#039;&#039;&#039; (error)&lt;br /&gt;
** &#039;&#039;&#039;bu&#039;&#039;&#039; (busy)&lt;br /&gt;
* type: the type of the entry event or, if not set, the type of the next event, if given&lt;br /&gt;
** empty: direct call&lt;br /&gt;
** &#039;&#039;&#039;ct&#039;&#039;&#039;: call transfer&lt;br /&gt;
** &#039;&#039;&#039;cf&#039;&#039;&#039;: call forward&lt;br /&gt;
** &#039;&#039;&#039;cct&#039;&#039;&#039;: call transfer with consultation&lt;br /&gt;
** &#039;&#039;&#039;pu&#039;&#039;&#039;: call pickup&lt;br /&gt;
* direction: &#039;&#039;&#039;o&#039;&#039;&#039; (outgoing) if the first event is the entry event and the caller is ep1&lt;br /&gt;
* direction: &#039;&#039;&#039;i&#039;&#039;&#039; (incoming) if not o&lt;br /&gt;
* alert-duration: alert time&lt;br /&gt;
*Billing Duration: the duration, a user must be billed for&lt;br /&gt;
**  outgoing call -&amp;gt; duration from the first event until the last event in the flow&lt;br /&gt;
**  incoming call -&amp;gt; duration from the first transfer/forward event until the last event in the flow&lt;br /&gt;
* call-duration/Call Duration (Total): duration of the whole call, e.g. with the duration of a subsequent transfer&lt;br /&gt;
* conn-duration/Call Duration (User): just the time, the user was connected. Duration from the entry event until the event, where the local endpoint isn&#039;t connected any more&lt;br /&gt;
* Further Registration: If more than one devices is registered to the same object, each device creates a CDR. This field identifies the additional CDRs for the same call&lt;br /&gt;
* Object Info: combination of object names and number&lt;br /&gt;
* Date: extracted date only from the time_string&lt;br /&gt;
* Time_2: extracted time only from the time_string&lt;br /&gt;
&lt;br /&gt;
 Note that a CSV export doesn&#039;t contain the whole call flow!&lt;br /&gt;
&lt;br /&gt;
===Filters===&lt;br /&gt;
&lt;br /&gt;
==== General ====&lt;br /&gt;
&lt;br /&gt;
Filters are set up to create reports based on certain conditions. ( Attention must be taken as the filters are AND combined to the date filters &#039;&#039;&#039;From&#039;&#039;&#039; and &#039;&#039;&#039;To&#039;&#039;&#039; and the quick filter &#039;&#039;&#039;Name or SIP&#039;&#039;&#039;).  A filter can have multiple conditions (Name, Number, Group, PBX Name. Time... ) and multiple filters can be combined on report creation. Multiple filters are OR combined. So in the following picture you would see all incoming calls plus all transferred calls plus all calls made on the PBX Berlin.&lt;br /&gt;
A filter has a unique name.&lt;br /&gt;
&lt;br /&gt;
[[Image:Reference14r1_Concept_App_Service_Reports_Filters.png|600px]]&lt;br /&gt;
&lt;br /&gt;
There are five or seven condition sections depending on what is selected under States. Conditions inside same section are OR associated while different sections are AND associated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Name == Terra OR Name == Uranus) AND (PBX == sifi) AND (Number == 0049%)&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
==== SQL Wildcard ====&lt;br /&gt;
&lt;br /&gt;
Like seen in the previous line you may use the SQL wildcard &amp;quot;%&amp;quot; which matches everything (so Inn% matches Innovaphone, Inno, Innovahone Gmbh ...) and corresponds to the better known &amp;quot;*&amp;quot; wildcard.  &lt;br /&gt;
&lt;br /&gt;
==== Base filter ====&lt;br /&gt;
&lt;br /&gt;
If you select another filter as base filter, the conditions of the base filter are implicitly AND conjuncted, when the current filter is used.&lt;br /&gt;
So if the base filter defines two PBX values, e.g. &amp;quot;Berlin&amp;quot; and &amp;quot;Hamburg&amp;quot; and the current filter defines one PBX value, e.g. &amp;quot;Berlin&amp;quot;, only objects of the PBX &amp;quot;Berlin&amp;quot; will be filtered:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(pbx=&amp;quot;Berlin&amp;quot;) AND (pbx=&amp;quot;Berlin&amp;quot; OR pbx=&amp;quot;Hamburg&amp;quot;)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anonymous&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you check this flag, a report created with this filter or with a filter, where this filter is a base filter, will by anonymized.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Local&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Define one ore more conditions for the local party, defined by:&lt;br /&gt;
&lt;br /&gt;
    Name or SIP: the cn/PBX object name/sip&lt;br /&gt;
    Number: the number&lt;br /&gt;
    Groups: a group of the PBX object&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Define one or more conditions for the remote party, defined by:&lt;br /&gt;
&lt;br /&gt;
    Name: cn or sip&lt;br /&gt;
    Number: the number&lt;br /&gt;
    Remote display name: the display name&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PBX&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Define one ore more conditions for the PBX, defined by:&lt;br /&gt;
&lt;br /&gt;
    PBX: the PBX name&lt;br /&gt;
    Node: the node name&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;States&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    No Response&lt;br /&gt;
    Connected&lt;br /&gt;
    Busy&lt;br /&gt;
    No Channel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Directions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    Incoming&lt;br /&gt;
    Outgoing&lt;br /&gt;
    Transfer: calls, which have been transferred to the current local party (calls which were initiated by a transfer action)&lt;br /&gt;
    Call Forward: calls, which have been forwarded to the current local party&lt;br /&gt;
&lt;br /&gt;
[[Image:Reference14r1_Concept_App_Service_Reports_Filters_Second_Part.png|300px|thumb|left|Filter Definition lower part]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Call domain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    Internal calls&lt;br /&gt;
    External calls&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Call Duration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Time the call was connected.&lt;br /&gt;
&lt;br /&gt;
This condition will be AND with the others if all States are selected.&lt;br /&gt;
If Busy, No Channel or No Response is unselected, then the filter will search for Connected calls with connected time greater or smaller than Call Duration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alert Duration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Time the call was ringing independent of the status of the call afterwards.&lt;br /&gt;
&lt;br /&gt;
This condition will be AND with the others if all States are selected.&lt;br /&gt;
If Busy, No Channel or Connected is unselected, then the filter will search only for Not Connected Calls that were ringing more or less time than Alert Duration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Report times&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Define the time where calls should be counted.&lt;br /&gt;
You can optionally define the weekday(s) of calls.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using Patterns&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can use these PostgreSQL Patterns for every condition.&lt;br /&gt;
&lt;br /&gt;
== Report Mails ==&lt;br /&gt;
&lt;br /&gt;
You can send daily, weekly or monthly emails with attached reports and apply filters on them. There is no limit concerning the size of the reports but keep in mind, that your email provider might not allow attachments exceeding a certain size e.g. 20 MB. &lt;br /&gt;
The automatic report generation can be configured here:&lt;br /&gt;
&lt;br /&gt;
[[Image:Reference14r1_Concept_App_Service_Reports_Email.png|300px|thumb|left|Report Email Settings]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;User reports&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Creates for each matching user a separate report&lt;br /&gt;
Users are matched by Object (Long Name). A user report only contains calls for this user. The email address of the user is built by its H323 name and the System Name of its PBX (h323@systemname) or determined by the E-Mail field of the user&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Quick filter for the cn/sip&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Filter&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Applied filter to the report&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Output Format&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PDF,CSV,XML (CSV and XML can be gzip compressed)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Displayed Duration&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
used for PDF reports (call duration total/user, billing duration)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interval&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
daily: Mail will be send daily with the automatic period &amp;quot;last day&amp;quot;&lt;br /&gt;
weekly: Mail will be send weekly with the automatic period &amp;quot;last week&amp;quot;&lt;br /&gt;
monthly: Mail will be send daily with the automatic period &amp;quot;last month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Day&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
the day, at which the report is sent&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;E-mail adresse(s)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
recipients of the report (comma separated)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Compress&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
compress the attachment or not&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Language&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
language used for the report&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sorting&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
sort entries by time, name, call or alert duration&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Send time&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
the time of a day, when the report is sent&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Time zone&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
the time zone corresponding to the send time&lt;br /&gt;
&lt;br /&gt;
== Simple Statistics ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Reference14r1_Concept_App_Service_Reports_Statistics.png|300px|thumb|left|Report Email Settings]] The Reports App as well as PDF Reports offer simple statistics where the number of incoming and outgoing calls are displayed as well as their respective total and average call and alert duration. Be aware that a transferred call with multiple participants may be counted multiple times as in fact CDRs are displayed.&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
Trace flags for App instance on App Platform:&lt;br /&gt;
&lt;br /&gt;
*App&lt;br /&gt;
*App Database&lt;br /&gt;
*Webserver traffic (shows the communication with the PBX)&lt;br /&gt;
*App Websocket (shows the communication with the client in browser)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Trace flags for myAPPS Client:&lt;br /&gt;
&lt;br /&gt;
*Browser Console&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
=== Missed calls query takes long ===&lt;br /&gt;
In some scenerios, the missed calls query takes quite long. 13r3 addresses this issue by adding a new combined index.&lt;br /&gt;
You can add this index yourself in earlier version through SSH (as root user):&lt;br /&gt;
&lt;br /&gt;
 psql -d reporting_db_name&lt;br /&gt;
 CREATE INDEX cdrs_user_id_utc_stamp_index ON cdrs (user_id,utc_stamp);&lt;br /&gt;
&lt;br /&gt;
Do not change the index name, as updates to 13r3 will create a second index otherwise!&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Fax&amp;diff=78196</id>
		<title>Reference15r1:Concept App Service Fax</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Fax&amp;diff=78196"/>
		<updated>2025-10-08T23:50:53Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Mail Configuration (SMTP Server) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
&amp;lt;!-- Keywords: fax faxserver faxtomail fax2mail  --&amp;gt;&lt;br /&gt;
== Applies To == &lt;br /&gt;
* innovaphone PBX from version 15r1&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The App Service Fax is an app service which can be installed on an innovaphone App Platform. It provides sending or receiving FAX documents with the innovaphone PBX and a user app to manage the documents.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* The App Service Fax sends PDF documents as FAX documents and converts received FAX documents to PDF.&lt;br /&gt;
* Cover page with user content for outgoing FAX documents.&lt;br /&gt;
* The Fax app can forward the received [[{{NAMESPACE}}:Apps/PbxManager/App_Fax|fax documents by mail]], as notification only or with the document in PDF.&lt;br /&gt;
* Transmission reports and error notifications&lt;br /&gt;
* Contact search by using myApps search API providers, inclusive removing number decorations&lt;br /&gt;
* PBX node support&lt;br /&gt;
* Using several fax interfaces&lt;br /&gt;
* Group fax accounts&lt;br /&gt;
* Automatic deletion of older fax documents&lt;br /&gt;
* Customized email texts&lt;br /&gt;
* Mail2Fax&lt;br /&gt;
* [[{{NAMESPACE}}:Apps/PbxManager/App_Fax#Default_settings_for_mail_notifications|Centralized setup]] of mailing notifications&lt;br /&gt;
* App API (HTTP Post)&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* innovaphone App Platform &lt;br /&gt;
* Device with a [[{{NAMESPACE}}:Gateway/Interfaces#FAX_interface|FAX interface]]&lt;br /&gt;
* One port license to register the fax interface towards the fax object&lt;br /&gt;
* A UC or fax license for each PBX user which is allowed to receive or send personal fax documents&lt;br /&gt;
* A fax (or UC) license for each group fax account&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&#039;&#039;&#039;Fax App (innovaphone-fax)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
This app is provided for the users to send fax documents and view or download received documents. The app reads the argument mailbox=&amp;lt;sip name&amp;gt; to work with the given account instead of the user logged in. It uses the com.innovaphone.search API to search for contacts with FAX numbers.&lt;br /&gt;
&lt;br /&gt;
== Technical Overview ==&lt;br /&gt;
[[Image:Concept fax.png|concept_fax.png/]]&lt;br /&gt;
&lt;br /&gt;
== Technical Concept ==&lt;br /&gt;
The innovaphone fax feature needs three parts:&lt;br /&gt;
* An innovaphone PBX with one or more fax objects&lt;br /&gt;
* One or more FAX interface registered to fax objects&lt;br /&gt;
* The Fax app on the App Platform (AP)&lt;br /&gt;
&lt;br /&gt;
The app service on the AP provides a user app. Users can upload and download PDF documents. The app service converts them from and to a fax protocol compatible file (SFF).&lt;br /&gt;
The app service controls calls between the FAX interface and an external remote party. To do this, it requires a websocket connection to the PBX. The FAX interface accesses the file with authenticated WebDAV.&lt;br /&gt;
The documents saved in the app service are available with WebDAV with the app instance name as user name and the app instance password as password and in the directories&lt;br /&gt;
* &amp;lt;app-web-path&amp;gt;/sff for the SFF files&lt;br /&gt;
* &amp;lt;app-web-path&amp;gt;/doc for the PDF files&lt;br /&gt;
&lt;br /&gt;
==== Additional Information ====&lt;br /&gt;
* Files of deleted fax jobs are permanently deleted after two weeks.&lt;br /&gt;
* The myApps background picture (myapps.png) is also included in all HTML mail bodies with customized mail texts, if these texts contain the string &amp;quot;url(cid:myapps.png)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
==== PBX Manager Plugin ====&lt;br /&gt;
All possible configurations can be done with the [[{{NAMESPACE}}:Apps/PbxManager/App_Fax|PBX Manager plugin]] of the Fax App. The app service options can be set as well as the corresponding app objects in the PBX can be added, modified or deleted. Additionally, available devices with a fax interface can be found and configured.&amp;lt;br&amp;gt;&lt;br /&gt;
As with any app, the Fax App needs to be assigned to users and [[#Requirements| licensed accordingly]].&lt;br /&gt;
&lt;br /&gt;
==== Mail Configuration (SMTP Server) ====&lt;br /&gt;
The fax service has a built-in SMTP server, which is needed for Mail2Fax. Here, you activate the mail reception for the fax service, enter the fax domain and configure the credentials for the authentication against the SMTP server. The mails can contain a subject and body for the cover page, and &#039;&#039;&#039;one PDF document can be appended as attachment&#039;&#039;&#039;. No cover page is added if both the subject and the mail content are empty. The destination number must be included in the recipient mail address in this format: &amp;lt;destination number&amp;gt;@&amp;lt;fax server domain&amp;gt;. The fax server domain is the app service domain or the configured domain if different. Recipient addresses do not match are discarded.&lt;br /&gt;
&lt;br /&gt;
The supported charsets are UTF-8 and ISO 8859-1 (Latin 1).&lt;br /&gt;
&lt;br /&gt;
As of 14r2 the SMTP server only listens on port 25. STARTTLS is possible.&lt;br /&gt;
&lt;br /&gt;
For the Fax service to receive the mails in the first place, the mailserver needs to forward mails for the fax-domain to the APs IP address.&lt;br /&gt;
&lt;br /&gt;
An example for an Exchange configuration can be found [[Howto14r2:Fax App - Mail2Fax with Exchange 2019|here]]&lt;br /&gt;
&lt;br /&gt;
Starting with 16r1 you also can configure OAuth2 Authentications. You can have a look into our HowTo Article for assistance: [[Howto16r1:Configure OAuth2 E-Mail]]&lt;br /&gt;
&lt;br /&gt;
==== Mail Configuration (SMTP Client) ====&lt;br /&gt;
The SMTP configuration is to be set in the Fax App PBX Manager plugin to make mail forwarding, transmission reports and notifications available. Only email addresses of the user configured in his PBX object are used and each user has to enable the several mails in the burger menu of the Fax app.&lt;br /&gt;
Available types of mails:&lt;br /&gt;
* Forwarding of a received document as PDF&lt;br /&gt;
* Incoming notifications without a document&lt;br /&gt;
* Error notifications for outgoing fax jobs&lt;br /&gt;
* Transmission confirmations&lt;br /&gt;
* Transmission reports for outgoing fax jobs as PDF&lt;br /&gt;
&lt;br /&gt;
The mails are sent in the language the user set in myApps when the Fax app was last used, unless the language for mails was explicitly set within the app.&lt;br /&gt;
&lt;br /&gt;
If a failure occurs and mails cannot be sent, the app service retries the mail transmission of a mail every 30 minutes, but no longer than two days.&lt;br /&gt;
&lt;br /&gt;
==== PBX Node Configuration ====&lt;br /&gt;
The Fax app object can be assigned to a certain PBX node. If so, the node number is included within the user&#039;s fax number.&lt;br /&gt;
&lt;br /&gt;
==== Group Fax Account ====&lt;br /&gt;
If a Group Fax app is configured, all users have the same group account with this app, and the same jobs. The mail addresses configured in this Group app are available and used instead of the user&#039;s mail addresses.&lt;br /&gt;
&lt;br /&gt;
==== Sharing FAX Interfaces ====&lt;br /&gt;
FAX interfaces are normally registered to one app object. Other PBX Fax objects use these fax resources for calls if they are configured as external resource in the objects.&lt;br /&gt;
&lt;br /&gt;
== App API ==&lt;br /&gt;
A document to be sent can be uploaded with the HTTP post command. The arguments within the HTTP URL sets the data of the new fax job. The job is created in the context of a user and is shown in the app. If the file is successfully saved, the job is directly queued for sending.&lt;br /&gt;
&lt;br /&gt;
An API key must be configured to enable this feature and to authenticate the command.&lt;br /&gt;
&lt;br /&gt;
Arguments of the HTTP post command in the URL:&lt;br /&gt;
* api-key: The configured authentication key. Mandatory.&lt;br /&gt;
* user-sip: The SIP of the user which sends the document. Mandatory.&lt;br /&gt;
* contact-name: An optional contact name shown in the app as contact (must be url-encoded).&lt;br /&gt;
* contact-number: The contact number used for sending the document. Mandatory.&lt;br /&gt;
* cover-page-subject: The subject of an optional cover page if should be created (must be url-encoded).&lt;br /&gt;
* cover-page-content: The content of an optional cover page if should be created (must be url-encoded).&lt;br /&gt;
* cover-page-content-html: If set to true, the cover page content is in HTML.&lt;br /&gt;
* app-object: The app object of the PBX used for sending. If not set, any is used.&lt;br /&gt;
* file-name: An optional file name of the uploaded file. Not used in the app.&lt;br /&gt;
&lt;br /&gt;
Here an example:&lt;br /&gt;
&lt;br /&gt;
 curl -X POST &amp;quot;http://AP-DNS-name/DOMAIN/fax/?api-key=1234&amp;amp;user-sip=vgr&amp;amp;contact-number=00049703173009&amp;amp;cover-page-subject=Hello%20World&amp;amp;app-object=fax&amp;quot; -T testfax.pdf&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
==== Log Files ====&lt;br /&gt;
The progress of fax jobs is reported in the log file:&lt;br /&gt;
&lt;br /&gt;
 Info job id 58, &amp;lt;b&amp;gt;direction&amp;lt;/b&amp;gt; 0, &amp;lt;b&amp;gt;progress&amp;lt;/b&amp;gt; 0, &amp;lt;b&amp;gt;result&amp;lt;/b&amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
;direction &lt;br /&gt;
:0: incoming job&lt;br /&gt;
:1: outgoing job&lt;br /&gt;
&lt;br /&gt;
;progress&lt;br /&gt;
:0: job created&lt;br /&gt;
:1: job queued&lt;br /&gt;
:2: job converted&lt;br /&gt;
:3: job finished&lt;br /&gt;
&lt;br /&gt;
;result&lt;br /&gt;
:0: no error or successfully completed&lt;br /&gt;
:1: call aborted, repeating&lt;br /&gt;
:2: job stopped with an error&lt;br /&gt;
:3: job stopped caused by a conversion failure&lt;br /&gt;
&lt;br /&gt;
==== App Service Log ====&lt;br /&gt;
*App&lt;br /&gt;
*App WebSocket&lt;br /&gt;
*Browser&lt;br /&gt;
*SMTP (only if the problem is related to mail forwarding etc.)&lt;br /&gt;
&lt;br /&gt;
==== App Service Logs for Mail2Fax ====&lt;br /&gt;
*App&lt;br /&gt;
*Smtp&lt;br /&gt;
*TLS&lt;br /&gt;
*TCP&lt;br /&gt;
*DB files&lt;br /&gt;
-&amp;gt; Since these options creates huge logs, please just enable for tracing a current problem and deactivate afterward&lt;br /&gt;
&lt;br /&gt;
== Known Issues == &lt;br /&gt;
* &#039;&#039;&#039;Important:&#039;&#039;&#039; If using Mail2Fax, only &#039;&#039;&#039;ONE&#039;&#039;&#039; PDF attachment is allowed and can be handled by the Fax service. If multiple attachments are added to an E-Mail, the Faxservice will get in a broken status.&lt;br /&gt;
* Enabling of non-T.38 coder (audio-fax) is also possible for T.38-only capable devices.&lt;br /&gt;
: Has to be judged by the user himself, if selected fax interface features audio-fax.&lt;br /&gt;
* An IPVA is not capable of sending faxes with a non-T.38 coder (audio-fax coder, e.g. G.711A), because it has no DSPs which are needed for an audio-fax. Therefore, &#039;&#039;only&#039;&#039; T.38 faxes work on an IPVA FAX interface.&lt;br /&gt;
** &#039;&#039;&#039;Important:&#039;&#039;&#039; T.38 is to be enabled on &#039;&#039;all&#039;&#039; interfaces are used in the call flow, e.g. FAX, GW, SIP interface.&lt;br /&gt;
** &#039;&#039;&#039;Important:&#039;&#039;&#039; Often &amp;quot;exclusive&amp;quot; is activated on SIP interfaces. This prevents the renegotiation with the provider and T.38 can not be used. Therefore, the &amp;quot;exclusive&amp;quot; flag is to be disabled for such configurations.&lt;br /&gt;
* If the name (H.323) of an user is changed in the PBX, the data in the fax service are not accessible for this user and a new account is created for him in the service.&lt;br /&gt;
* With 14r1, faxes will be sent with 400dpi per default, and tried with a lower resolution again, if the remote side doesn&#039;t support 400dpi faxes. In a 13r3 fax app (no 400dpi support), you will see the first - non working - try, which is the normal behavior, since all faxes (working and non working) are shown in the fax app.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* For a more detailed description about the configuration, please refer to [https://class.innovaphone.com/moodle2/course/view.php?id=1705&amp;amp;topic=0#section-2 the book about fax application setup] as part of our IT Plus Training.&lt;br /&gt;
* [[{{NAMESPACE}}:Apps/PbxManager/App_Fax|PBX Manager plugin]] for the Fax App&lt;br /&gt;
* [[Howto: Mail2Fax with Exchange 2019]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Connect&amp;diff=78195</id>
		<title>Reference16r1:Concept App Connect</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Connect&amp;diff=78195"/>
		<updated>2025-10-08T23:47:11Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* E-Mail configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Category:Concept|Apps]]&lt;br /&gt;
{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&amp;lt;!-- Keywords: connect messages --&amp;gt;&lt;br /&gt;
The Connect app is a social intranet tool, which can be used for organization internal collaboration and is part of the [[Reference16r1:Concept App Service Messages|App Service Messages]]. &lt;br /&gt;
&lt;br /&gt;
== Applies To ==&lt;br /&gt;
* innovaphone PBX from version 16r1&lt;br /&gt;
 &lt;br /&gt;
== Features ==&lt;br /&gt;
* Post Messages, Reply to Messages&lt;br /&gt;
* Integrated Chat&lt;br /&gt;
* File Attachments&lt;br /&gt;
* Emojis&lt;br /&gt;
* Visibility of Messages organized in Zones&lt;br /&gt;
* Feed for Messages addressed to you&lt;br /&gt;
* Badge Counts for Feed and Chat&lt;br /&gt;
* Private Zone&lt;br /&gt;
* Search in Messages, with many filter Options&lt;br /&gt;
* Like Posts&lt;br /&gt;
* Hashtags&lt;br /&gt;
* Definition of Channels, based on Zones and hashtags&lt;br /&gt;
* Follow (users, Zones, Hashtags, Discussions, Channels)&lt;br /&gt;
* Direct/private Posts&lt;br /&gt;
* Address Groups or all Users&lt;br /&gt;
* Notifications via email or Push Notifications&lt;br /&gt;
* Integrated Help&lt;br /&gt;
* Translations, automatically or based on Messages&lt;br /&gt;
* Welcome Messages&lt;br /&gt;
* User Management (set inactive, anonymize, …)&lt;br /&gt;
* Different Roles (user, moderator, administrator)&lt;br /&gt;
* UC Integration (Presence, initiate calls, initiate Chats)&lt;br /&gt;
* [[Reference16r1:Apps/PbxManager/Shared Services|Shared services integration]]&lt;br /&gt;
* Onboarding for new Connect users with a guided tour&lt;br /&gt;
* Surveys in Connect via [[Reference16r1:Concept_App_Polls|Polls App]]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* innovaphone AppPlatform with a running Messages app and valid ntp settings&lt;br /&gt;
* innovaphone myApps&lt;br /&gt;
* Connect app license for each PBX user, who should use connect&lt;br /&gt;
&lt;br /&gt;
== Connect App UI concepts ==&lt;br /&gt;
&lt;br /&gt;
The Connect UI consists of two major parts. On the left side there is the main navigation, which covers feed, your personal home area, search, chat and more. On the central is the stream. The stream can either show the content of a channel, or a single discussion, entered from the search or the feed.&lt;br /&gt;
&lt;br /&gt;
For each button and icon in the UI, an [[#Integrated Help|Integrated Help]] can be used for better understanding of the corresponding function.&lt;br /&gt;
&lt;br /&gt;
=== Feed ===&lt;br /&gt;
&lt;br /&gt;
In your feed, you will see messages that are specific to you. These can be @ mentions or comments on posts that you follow or to which you have replied.&lt;br /&gt;
&lt;br /&gt;
The feed is seperated into thre lists:&lt;br /&gt;
* Inbox&lt;br /&gt;
* Noted&lt;br /&gt;
* Checked&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inbox:&#039;&#039;&#039; all pending notifications for you. If your inbox is empty, a placeholder is shown, that there is no current notification.&amp;lt;br&amp;gt;&#039;&#039;&#039;Noted:&#039;&#039;&#039; all notifications you marked as noted.&amp;lt;br&amp;gt;&#039;&#039;&#039;Checked:&#039;&#039;&#039; all previously checked notifications&lt;br /&gt;
&lt;br /&gt;
If you click on a notification in your feed, in the stream the message in the corresponding thread will be opened.&amp;lt;br&amp;gt;Also you have three symbols under each notification:&amp;lt;br&amp;gt;&lt;br /&gt;
* star - the noticitation is marked as noted, so you can check it later&lt;br /&gt;
* speech bubble with checkmark - all notifications in your feed from the same thread, will be marked as checked&lt;br /&gt;
* checked - the particular notification will be marked as checked&lt;br /&gt;
&lt;br /&gt;
=== Home ===&lt;br /&gt;
&lt;br /&gt;
Here you can customize your personal home area with pinned channels, zones and hashtags.&amp;lt;br&amp;gt;&lt;br /&gt;
If there are new and unread meessages inside a pinned channel, zone or followed hashtag since your last visit, a number will be displayed, which indicate unread messages.&amp;lt;br&amp;gt;&lt;br /&gt;
Due to performance reasons, it can happen, that a dot-symbol is shown. If you click on a channel/hashtag/zone, the exact number of unread messages will be displayed.&lt;br /&gt;
&lt;br /&gt;
=== Full text search ===&lt;br /&gt;
&lt;br /&gt;
For all words in the message bodies, an index is built, so that words or sequences of words may be found efficiently.&lt;br /&gt;
&lt;br /&gt;
For a search for multiple words, two modes are implemented. If the search entry is set in quotes, the exact sequence of the word must appear in the message for a message otherwise just all the words must be present.&lt;br /&gt;
&lt;br /&gt;
=== Chat ===&lt;br /&gt;
The integrated [[Reference16r1:Concept Chat#Additional Features with license|persistent chat]] feature.&lt;br /&gt;
The old separate chat app won&#039;t be developed any further and new features and fixes will only be integrated in the connect chat.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re having problems with chat after install, make sure that the &amp;quot;Impersonation&amp;quot; option is activated at the connect app object. You find the option at the &amp;quot;App&amp;quot; tab and then at &amp;quot;Grant access to APIs&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To open chat in connect via the old chat icon, enter the app name, which should use app at the [[Reference16r1:PBX/Config/Chat|corresponding field]] on the PBX.&lt;br /&gt;
&lt;br /&gt;
==== General information ====&lt;br /&gt;
Instant Messaging is a standard functionality of the innovaphone PBX. The messages are sent using instant messages calls with standard SIP method or proprietary H.323/H.450 facilities. The connect app provides a user interface for chat. &lt;br /&gt;
The PBX itself only provides the instant messaging calls and forwarding of the messages. No storing of the messages is provided.&lt;br /&gt;
&lt;br /&gt;
To add additional functionality to chat like storing of chats, group chats or file attachments, the PBX provides an API with the Messages App Object, so that this functionality can be added by an additional App Service. Access to this functionality is also provided to the connect app by an API. Chat can detect the presence of this API. The use of this API must be enabled by a license.&lt;br /&gt;
&lt;br /&gt;
For more technical details, see [[Reference16r1:Concept Chat|here]].&lt;br /&gt;
&lt;br /&gt;
==== Chat Features ====&lt;br /&gt;
&lt;br /&gt;
If the user has a chat license, additional features are available, which need the external Messages service:&lt;br /&gt;
&lt;br /&gt;
;Storing of Chats: No need to the destination of a chat to be online. The message can be sent and read asynchronously&lt;br /&gt;
;Badge Count: A badge count is displayed for unread messages. To clear the badge count, the chats containing new messages must be opened&lt;br /&gt;
;Group Chats: Groups can be defined and messages sent to these groups. The own chat groups can be seen in the burger menu at &amp;quot;Chat Groups&amp;quot;&lt;br /&gt;
;Reactions: React with likes and emojis to chat messages&lt;br /&gt;
;Direct Answering: Send a direct answer to a specific message&lt;br /&gt;
;Forwarding: Forward chat messages to other chat user/groups&lt;br /&gt;
;File Attachments: &lt;br /&gt;
*File attachments can be added to chat messages. Sending of attachments can be prevented using the [[{{NAMESPACE}}:PBX/Config/General#Common|option &amp;quot;Chat no Attachments&amp;quot;]].:&amp;lt;br&amp;gt;&lt;br /&gt;
*When an attachment is downloaded, the user gets feedback that the download has been started and cannot start it again for 5 seconds. This prevents the user from clicking on it again and again because he might think it won&#039;t work.&amp;lt;br&amp;gt;&lt;br /&gt;
*If the attachment is a video (at the moment recognized by the file name extension .mp4, .avi, .mov, or .wmf), the videocam be played directly in connect and doesn&#039;t have to be downloaded first.&lt;br /&gt;
** &#039;&#039;&#039;Only&#039;&#039;&#039; in Browser Mode, since h264 is not implemented in the used Chromium on the native client and the iPhone App&lt;br /&gt;
&lt;br /&gt;
==== The Badge Count ====&lt;br /&gt;
&lt;br /&gt;
The badge count on the chat tab inside connect is used to indicate the number of unread incoming chat messages. A chat message is considered read if the chat discussion is already open and the input field for a new message has the focus when the chat message arrives or if the chat discussion is opened. If a discussion inside the chat tab is opened, all messages of this discussion are considered read. If the chat tab is opened, but the discussion with unread messages is not opened, the badge count will not be reset to make sure this message is not overlooked.&lt;br /&gt;
These rules result in the following sequences, when a chat message arrives:&lt;br /&gt;
;Chat tab closed: The chat tab is loaded (if connect is set as default chat app) and a badge count is set. When the chat tab in connect is opened, a badge count is displayed at the respective discussion. The badge count is cleared when the chat tab and the respective discussion inside the chat app is opened.&lt;br /&gt;
;The chat tab is opened with a different discussion: A badge count is set at the chat tab and at the respective discussion. The badge count is cleared when the discussion is opened.&lt;br /&gt;
;The chat tab is opened with the same discussion, but message input does not have focus: Badge Count is set at the chat tab and at the discussion. The badge count is reset as soon as the message input gets the focus&lt;br /&gt;
;The chat tab is opened with the same discussion and message input has focus: No badge count is set&lt;br /&gt;
;Chat message is read on a different device: Badge count is reset on chat tab and on the respective discussion&lt;br /&gt;
&lt;br /&gt;
=== More ===&lt;br /&gt;
==== Channels ====&lt;br /&gt;
Lists all available channels. These can be selected and pinned on the home screen.&amp;lt;br&amp;gt;&lt;br /&gt;
Also new channels can be created.&lt;br /&gt;
&lt;br /&gt;
===== Channel customizing =====&lt;br /&gt;
A Channel can be customized with a name, banner and a description. The image for the banner should be at least 1412 x 68 pixels in size so that it does not look pixelated on Full HD screens (preferably even twice as large for higher resolutions).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;But beware: The banner images are currently automatically cropped or duplicated depending on the available screen space (no matter how large the image is), which means that images are cut off (depending on the device on which the user sees the image). This is why color gradients or graphic seamless patterns work best. Text, photos of people or objects are therefore not recommended. However, landscape images (such as typical Windows backgrounds) seems to be fine.&lt;br /&gt;
&lt;br /&gt;
==== Zones ====&lt;br /&gt;
&lt;br /&gt;
Each App within the PBX, that has access to connect defines a zone within messages, named as the App Object. This way, each App has its private zone within Messages, so that a channel maybe defined especially for messages from this App.&amp;lt;br&amp;gt;&lt;br /&gt;
The access to these zones is defined by the access to the Apps. In addition, subzones to these zones may be defined. These subzones can be configured within the Messages App. For each subzone, it can be defined separately which users or groups of users have access. The groups defined in the PBX are used for this purpose.&lt;br /&gt;
&lt;br /&gt;
==== Tags ====&lt;br /&gt;
Tags can be attached to messages for search and filter purposes. The user can assign tags in the form of hashtags within the message text. Tags are valid across zones. There are mechanisms to filter messages based on tags&lt;br /&gt;
&lt;br /&gt;
==== User ====&lt;br /&gt;
List of all available connect user.&lt;br /&gt;
&lt;br /&gt;
==== Groups ====&lt;br /&gt;
List of all available connect groups, which are active groups inside the PBX.&lt;br /&gt;
&lt;br /&gt;
==== Following ====&lt;br /&gt;
List of hashtags, which the user follows and therefore get notifications in his feed.&lt;br /&gt;
&lt;br /&gt;
==== Noted ====&lt;br /&gt;
All overall messages you marked as noted (not including noted messages in your feed).&lt;br /&gt;
&lt;br /&gt;
==== Connect Tour ====&lt;br /&gt;
New users can familiarize themselves with Connect and its features through a guided tour of the app. A small tutorial with simple &amp;quot;tasks&amp;quot; that reflect real-world usage, similar to an introductory tutorial in a video game or certain apps.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The Stream ==&lt;br /&gt;
&lt;br /&gt;
The central part of the UI is the main message stream. It displays the messages from the selected channel or from a specific discussion. It is used to post messages. When messages are posted, tags are assigned automatically so that the message fits to the selected channel or the message is added to the selected discussion. Unread messages are marked. A click from the user is needed to mark a message as read. A message marked as read in the context of one channel, it appears as read in all matching channels.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The display of messages is organized in discussions. Initially, only the first message of a discussion is displayed. By click on the respective control, the discussion is expanded, so that all messages of the discussion are displayed.&lt;br /&gt;
&lt;br /&gt;
Messages within a discussion are always displayed in their chronological order.&lt;br /&gt;
&lt;br /&gt;
Messages can be posted in response to other messages. When a response is posted, it is always displayed at the end of the discussion, even if it was a response to an early message of the discussion. To identify to which message the response was posted, a control is provided at a displayed message to hide all messages of the discussion except the messages to which this message was a response.&lt;br /&gt;
&lt;br /&gt;
If [[#Chat|chat]] is used, the central part is also used by chat for the chat messages. The list of available chats is listed on the left side, where the feed in connect is placed.&lt;br /&gt;
&lt;br /&gt;
=== Integrated Help ===&lt;br /&gt;
In the top right corner is a question mark (?) visible. If clicked, question marks appear all over the UI. If you click on one of them, a popup with an explanation appears of what these sections are for.&lt;br /&gt;
&lt;br /&gt;
To deactivate the integrated help, just click on the question mark in the upper right corner again.&lt;br /&gt;
&lt;br /&gt;
=== myApps Assistant App ===&lt;br /&gt;
The myApps Assistant App can be integrated inside connect, to access a remote large language model (LLM).&amp;lt;br&amp;gt;&lt;br /&gt;
For more information, see [https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_myApps_Assistant the corresponding concept article]&lt;br /&gt;
&lt;br /&gt;
[[image:connect_button_assistant.png|connect_button_assistant.png/|connect_button_assistant.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Direct/Group Messages ===&lt;br /&gt;
To address a user directly, simply write a message a add an &#039;&#039;@&amp;lt;username&amp;gt;&#039;&#039;. You will also get a list of users you can address to select from, after just writing an &#039;&#039;@&#039;&#039;. If you&#039;ve selected the user, just press enter. After the message is sent, the user will get a notification in his feed, and by clicking on that, connect will directly jump to that specific message.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;So that a user can be tagged, the user has to open the Connect app at least once.&lt;br /&gt;
&lt;br /&gt;
To address a whole group of users, you have to write &#039;&#039;@@&#039;&#039; and then select the listed group. The list of groups is the list of groups, which exist inside the PBX. The groups need the &amp;quot;active&amp;quot; option activated in the users&#039; configuration, so it can be addressed.&amp;lt;br /&amp;gt;&lt;br /&gt;
After sending the message, all users who are members of the tagged group, will get a notification in their feed inside Connect.&lt;br /&gt;
&lt;br /&gt;
To address all connect users at once, simply add &#039;&#039;@@&#039;&#039; without selecting a group.&amp;lt;br&amp;gt;&lt;br /&gt;
This message will address all connect users.&lt;br /&gt;
&lt;br /&gt;
=== Likes ===&lt;br /&gt;
&lt;br /&gt;
User can add likes to messages. The likes are displayed in the notification area of the UI&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Notifications ===&lt;br /&gt;
&lt;br /&gt;
An email connector can be configured within the messages app, which is used to send emails to notify a user of a new message. There are several conditions under which a notification is sent:&lt;br /&gt;
;Notify: If a user is notified within the message with @&amp;lt;user&amp;gt; an email notification is sent as well&lt;br /&gt;
;Reply: A message posted as reply to a message from the user results in a email notification. This happens for any posts to a discussion, the user has posted to regardless if the reply was to a message of the user directly or any other message of the discussion&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
==== PBX Settings Plugin ====&lt;br /&gt;
*open the PBX Settings plugin for the Messages app&lt;br /&gt;
*click on &amp;quot;add App&amp;quot;&lt;br /&gt;
*select &amp;quot;Connect&amp;quot;&lt;br /&gt;
*enter an appropriate (Long)Name and SIP name (&amp;quot;Connect&amp;quot; and &amp;quot;connect&amp;quot; for example)&lt;br /&gt;
*choose the config templates, which should distribute the app to the user, as well as grant administrator and moderator mode&lt;br /&gt;
*click on &amp;quot;OK&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The app object is now created in the PBX and automatically connected to the Messages app instance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; If the app object for connect was created manually, make sure, to activate the following options in the &#039;&#039;App&#039;&#039; tab: &#039;&#039;&#039;Websocket&#039;&#039;&#039;, &#039;&#039;&#039;PbxSignal&#039;&#039;&#039;, &#039;&#039;&#039;PbxApi&#039;&#039;&#039; and &#039;&#039;&#039;Impersonation&#039;&#039;&#039; (for Chat)&lt;br /&gt;
&lt;br /&gt;
==== Connect Admin-Mode ====&lt;br /&gt;
A user who has access to the admin mode of connect has the ability to set additional options in the burger menu:&lt;br /&gt;
* [[#Manage users|Manage users]]&lt;br /&gt;
* [[#Manage Groups|Manage groups]]&lt;br /&gt;
* [[#Zones 2|Zones]]&lt;br /&gt;
* [[Reference16r1:Apps/PbxManager/Shared Services|Federation Domains]]&lt;br /&gt;
* [[#E-Mail configuration|E-Mail configuration]]&lt;br /&gt;
&lt;br /&gt;
To get the admin access mode, a user simply needs to get the &#039;&#039;connect~admin&#039;&#039; app granted in the user object.&lt;br /&gt;
&lt;br /&gt;
[[image:connect_admin_mode.png|connect_admin_mode.png/|connect_admin_mode.png/]]&lt;br /&gt;
&lt;br /&gt;
==== Connect Moderator-Mode ====&lt;br /&gt;
A user who has access to the moderator mode of connect has the ability to set additional options in the burger menu:&lt;br /&gt;
* [[#Hashtags|Hashtags]]&lt;br /&gt;
* [[#Welcome post|Welcome post]]&lt;br /&gt;
* [[#Manage users|Manage users]] (read only)&lt;br /&gt;
* [[#Manage groups|Manage groups]] (read only)&lt;br /&gt;
&lt;br /&gt;
To get the moderator mode, a user simply needs to get the &#039;&#039;connect~moderator&#039;&#039; app granted in the user object.&lt;br /&gt;
&lt;br /&gt;
[[image:connect_moderator_mode.png|connect_moderator_mode.png/|connect_moderator_mode.png/]]&lt;br /&gt;
&lt;br /&gt;
==== connect admin-service mode ====&lt;br /&gt;
Used by other apps to be able to post to connect. For example, the [[Reference16r1:Concept App Service Projects|Projects App]].&lt;br /&gt;
&lt;br /&gt;
Needs to be activated at the connect app object, and the app object which should post to connect.&lt;br /&gt;
&lt;br /&gt;
==== Options in detail ====&lt;br /&gt;
&lt;br /&gt;
===== Hashtags =====&lt;br /&gt;
Hashtags can be renamed and corrected.&amp;lt;br&amp;gt;&lt;br /&gt;
By doing this, all occurrences are changed. (This can lead to many feed entries, since all affected posts are edited)&amp;lt;br&amp;gt;&lt;br /&gt;
You can also combine two hashtags by renaming one to the same value as the other.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[image:Connect_moderator_hashtags_overview.png|thumb|none|300px|connect_moderator_hashtags_overview.png/|connect_moderator_hashtags_overview.png/]]&lt;br /&gt;
[[image:Connect_moderator_hashtags_detail.png|thumb|none|300px|connect_moderator_hashtags_detail.png/|connect_moderator_hashtags_detail.png/]]&lt;br /&gt;
&lt;br /&gt;
===== Welcome post =====&lt;br /&gt;
Moderators can create automated private welcome posts with useful information for new users. These posts are sent as private messages to help users get started.&lt;br /&gt;
&lt;br /&gt;
===== Manage users =====&lt;br /&gt;
All PBX users with configured access to the connect app can open it up.&amp;lt;br&amp;gt;&lt;br /&gt;
Inside the Connct app users are created, after they accessed it once.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If users are deleted in the PBX, they also need to be deactivated in connect or else, they still can be addressed. (only possible in connect &#039;&#039;&#039;admin mode&#039;&#039;&#039;)&amp;lt;br&amp;gt;&lt;br /&gt;
-&amp;gt; the same applies to &#039;&#039;&#039;groups&#039;&#039;&#039;. So if a group is deleted in the PBX, the group needs to be disabled in connect.&lt;br /&gt;
===== Manage groups =====&lt;br /&gt;
Groups can be defined in the PBX, which can then be used in connect to address multiple users at once. You must use @@&amp;lt;groupname&amp;gt; to do this. The user receiving such a message must be an active member of this group.&lt;br /&gt;
&lt;br /&gt;
If groups are deleted in the PBX, they also need to be deactivated in connect or else, they still can be addressed. (only possible in connect &#039;&#039;&#039;admin mode&#039;&#039;&#039;)&amp;lt;br&amp;gt;&lt;br /&gt;
-&amp;gt; the same applies to &#039;&#039;&#039;users&#039;&#039;&#039;. So if a user is deleted in the PBX, the user needs to be disabled in connect.&lt;br /&gt;
&lt;br /&gt;
===== Zones =====&lt;br /&gt;
An administrator can define a zone that is only visible to a certain number of people. A good example of such a zone would be Human Resources or Management. &lt;br /&gt;
&lt;br /&gt;
To create it, open &#039;&#039;Access Rights&#039;&#039; in the burger menu and click the + button. Configure a name and SIPid for this zone. While the name can be chosen freely, the SIPid must have a specific syntax. The SIPid must start with the Connect object name, followed by a question mark and then a short identifier.&amp;lt;br /&amp;gt;&lt;br /&gt;
So for a &amp;quot;Human Ressources&amp;quot; Zone, the syntax could be: &#039;&#039;&#039;connect?human-ressources&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Please note that the normal rules for SIPid&#039;s apply here. A simple rule of thumb is to use only A-Z, a-z, 0-9, and . (period) and - (hyphen). However, the name must not start with a . (dot). Although it is not strictly required, we recommend not using uppercase letters.&lt;br /&gt;
&lt;br /&gt;
[[image:connect_zones.png|connect_zones.png/|connect_zones.png/]]&lt;br /&gt;
&lt;br /&gt;
After creating a zone, you can assign the zone to users or groups.&lt;br /&gt;
&lt;br /&gt;
===== E-Mail configuration =====&lt;br /&gt;
For Connect to send E-Mails to tagged users/groups, you have to enter valid SMTP settings here.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[image:connect_smtp_settings.png|connect_smtp_settings.png/|connect_smtp_settings.png/]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Client&#039;&#039;: this entry will create a clickable link in the received mail, where after clicking, myApps will automatically open the conversation in the Connect app&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;App URL&#039;&#039;: This will create a web link, which jump to the conversation in your default browser&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OAuth2&#039;&#039;: Alternatively OAuth2 credentials to authenticate for e-mail sending. See [[Howto16r1:Configure_OAuth2_E-Mail]].&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
==== App Service Log ====&lt;br /&gt;
*App WebSocket&lt;br /&gt;
*Database&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
&lt;br /&gt;
[[Reference16r1:Concept App Service Messages]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Reference16r1:Concept Chat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Reference16r1:Apps/PbxManager/App Messages]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78194</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78194"/>
		<updated>2025-10-08T22:27:55Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Related Articles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
Most of the large email providers offer the possibility to define an app that is allowed to gain access of a certain scope like SMTP. &amp;lt;br&amp;gt;&lt;br /&gt;
It assigns a Client ID / Client Secret.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Authorization for sending from the mail account needs to be given one time either:&amp;lt;br&amp;gt;&lt;br /&gt;
* By providing resource owner username/password. Sending this to the token endpoint results in an access token and long term refresh token.&lt;br /&gt;
* By interactive authorization via a popup dialogue that is loaded from the authorization endpoint. After the credentials are verified, the dialogue redirects to the redirect URI with an authorization code that is traded to an access token and refresh token.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The access token is sent for authentication in SMTP. It needs regular refresh, which will be done automatically.&lt;br /&gt;
&lt;br /&gt;
=== Modes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Exchange&#039;&#039;&#039;: Microsoft, with interactive authorization&lt;br /&gt;
* &#039;&#039;&#039;Microsoft 365&#039;&#039;&#039;: Microsoft, without interactive authorization (Resource owner and password has to be filled)&lt;br /&gt;
* &#039;&#039;&#039;Gmail&#039;&#039;&#039;: Google, with interactive authorization&lt;br /&gt;
* &#039;&#039;&#039;Google Service Account&#039;&#039;&#039;:  Google, without interactive authorization (Client e-mail, Private Key ID and Private Key of the service account must be provided)&lt;br /&gt;
* &#039;&#039;&#039;Client secret post&#039;&#039;&#039;: Generic configuration where all parameters of the client secret post OAuth2 flow can be set.&lt;br /&gt;
* &#039;&#039;&#039;Private key jwt&#039;&#039;&#039;: Generic configuration where all parameters of the private key jwt OAuth2 flow can be set.&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
=== Azure Portal ===&lt;br /&gt;
Log in to Microsoft Azure Portal (https://portal.azure.com) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
&lt;br /&gt;
=== Microsoft 365 admin center ===&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exchange admin center ===&lt;br /&gt;
Login to the Exchange admin center (https://admin.exchange.microsoft.com).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
=== Preparations === &lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* [[Reference16r1:PBX/Config/Authentication]]&lt;br /&gt;
* [[Reference16r1:Apps/PbxManager/Email]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78193</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78193"/>
		<updated>2025-10-08T22:27:01Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Related Articles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
Most of the large email providers offer the possibility to define an app that is allowed to gain access of a certain scope like SMTP. &amp;lt;br&amp;gt;&lt;br /&gt;
It assigns a Client ID / Client Secret.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Authorization for sending from the mail account needs to be given one time either:&amp;lt;br&amp;gt;&lt;br /&gt;
* By providing resource owner username/password. Sending this to the token endpoint results in an access token and long term refresh token.&lt;br /&gt;
* By interactive authorization via a popup dialogue that is loaded from the authorization endpoint. After the credentials are verified, the dialogue redirects to the redirect URI with an authorization code that is traded to an access token and refresh token.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The access token is sent for authentication in SMTP. It needs regular refresh, which will be done automatically.&lt;br /&gt;
&lt;br /&gt;
=== Modes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Exchange&#039;&#039;&#039;: Microsoft, with interactive authorization&lt;br /&gt;
* &#039;&#039;&#039;Microsoft 365&#039;&#039;&#039;: Microsoft, without interactive authorization (Resource owner and password has to be filled)&lt;br /&gt;
* &#039;&#039;&#039;Gmail&#039;&#039;&#039;: Google, with interactive authorization&lt;br /&gt;
* &#039;&#039;&#039;Google Service Account&#039;&#039;&#039;:  Google, without interactive authorization (Client e-mail, Private Key ID and Private Key of the service account must be provided)&lt;br /&gt;
* &#039;&#039;&#039;Client secret post&#039;&#039;&#039;: Generic configuration where all parameters of the client secret post OAuth2 flow can be set.&lt;br /&gt;
* &#039;&#039;&#039;Private key jwt&#039;&#039;&#039;: Generic configuration where all parameters of the private key jwt OAuth2 flow can be set.&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
=== Azure Portal ===&lt;br /&gt;
Log in to Microsoft Azure Portal (https://portal.azure.com) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
&lt;br /&gt;
=== Microsoft 365 admin center ===&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exchange admin center ===&lt;br /&gt;
Login to the Exchange admin center (https://admin.exchange.microsoft.com).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
=== Preparations === &lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* https://wiki.innovaphone.com/index.php?title=Reference16r1:PBX/Config/Authentication&lt;br /&gt;
* https://wiki.innovaphone.com/index.php?title=Reference16r1:Apps/PbxManager/Email&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78191</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78191"/>
		<updated>2025-10-08T21:47:44Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* General Information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
Most of the large email providers offer the possibility to define an app that is allowed to gain access of a certain scope like SMTP. &amp;lt;br&amp;gt;&lt;br /&gt;
It assigns a Client ID / Client Secret.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Authorization for sending from the mail account needs to be given one time either:&amp;lt;br&amp;gt;&lt;br /&gt;
* By providing resource owner username/password. Sending this to the token endpoint results in an access token and long term refresh token.&lt;br /&gt;
* By interactive authorization via a popup dialogue that is loaded from the authorization endpoint. After the credentials are verified, the dialogue redirects to the redirect URI with an authorization code that is traded to an access token and refresh token.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The access token is sent for authentication in SMTP. It needs regular refresh, which will be done automatically.&lt;br /&gt;
&lt;br /&gt;
=== Modes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Exchange&#039;&#039;&#039;: Microsoft, with interactive authorization&lt;br /&gt;
* &#039;&#039;&#039;Microsoft 365&#039;&#039;&#039;: Microsoft, without interactive authorization (Resource owner and password has to be filled)&lt;br /&gt;
* &#039;&#039;&#039;Google&#039;&#039;&#039;: Google, with interactive authorization&lt;br /&gt;
* &#039;&#039;&#039;Google Service Account&#039;&#039;&#039;:  Google, without interactive authorization (previously generated Private Key ID and Private Key must be provided)&lt;br /&gt;
* &#039;&#039;&#039;Client secret post&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;Private key jwt&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
=== Azure Portal ===&lt;br /&gt;
Log in to Microsoft Azure Portal (https://portal.azure.com) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
&lt;br /&gt;
=== Microsoft 365 admin center ===&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exchange admin center ===&lt;br /&gt;
Login to the Exchange admin center (https://admin.exchange.microsoft.com).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
=== Preparations === &lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
https://wiki.innovaphone.com/index.php?title=Reference16r1:PBX/Config/Authentication&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78190</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78190"/>
		<updated>2025-10-08T21:34:18Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Principle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
Most of the large email providers offer the possibility to define an app that is allowed to gain access of a certain scope like SMTP. &amp;lt;br&amp;gt;&lt;br /&gt;
It assigns a Client ID / Client Secret.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Authorization for sending from the mail account needs to be given one time either:&amp;lt;br&amp;gt;&lt;br /&gt;
* By providing resource owner username/password. Sending this to the token endpoint results in an access token and long term refresh token.&lt;br /&gt;
* By interactive authorization via a popup dialogue that is loaded from the authorization endpoint. After the credentials are verified, the dialogue redirects to the redirect URI with an authorization code that is traded to an access token and refresh token.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The access token is sent for authentication in SMTP. It needs regular refresh, which will be done automatically.&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
=== Azure Portal ===&lt;br /&gt;
Log in to Microsoft Azure Portal (https://portal.azure.com) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
&lt;br /&gt;
=== Microsoft 365 admin center ===&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exchange admin center ===&lt;br /&gt;
Login to the Exchange admin center (https://admin.exchange.microsoft.com).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
=== Preparations === &lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
https://wiki.innovaphone.com/index.php?title=Reference16r1:PBX/Config/Authentication&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78188</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78188"/>
		<updated>2025-10-08T14:38:49Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Exchange admin center */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
=== Azure Portal ===&lt;br /&gt;
Log in to Microsoft Azure Portal (https://portal.azure.com) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
&lt;br /&gt;
=== Microsoft 365 admin center ===&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exchange admin center ===&lt;br /&gt;
Login to the Exchange admin center (https://admin.exchange.microsoft.com).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
=== Preparations === &lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
https://wiki.innovaphone.com/index.php?title=Reference16r1:PBX/Config/Authentication&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78187</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78187"/>
		<updated>2025-10-08T14:38:24Z</updated>

		<summary type="html">&lt;p&gt;Tfu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
=== Azure Portal ===&lt;br /&gt;
Log in to Microsoft Azure Portal (https://portal.azure.com) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
&lt;br /&gt;
=== Microsoft 365 admin center ===&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exchange admin center ===&lt;br /&gt;
Login to the Exchange admin center (&amp;lt;nowiki&amp;gt;https://admin.exchange.microsoft.com&amp;lt;/nowiki&amp;gt;).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
=== Preparations === &lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
&lt;br /&gt;
=== PBX Example configuration === &lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
https://wiki.innovaphone.com/index.php?title=Reference16r1:PBX/Config/Authentication&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78186</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78186"/>
		<updated>2025-10-08T14:03:08Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Microsoft 365 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
Log in to Microsoft Azure Portal (https://portal.azure.com) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
Login to the Exchange admin center (&amp;lt;nowiki&amp;gt;https://admin.exchange.microsoft.com&amp;lt;/nowiki&amp;gt;).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
https://wiki.innovaphone.com/index.php?title=Reference16r1:PBX/Config/Authentication&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78185</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78185"/>
		<updated>2025-10-08T14:00:31Z</updated>

		<summary type="html">&lt;p&gt;Tfu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
Log in to Microsoft Azure Portal (&amp;lt;nowiki&amp;gt;https://portal.azure.com&amp;lt;/nowiki&amp;gt;) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
Login to the Exchange admin center (&amp;lt;nowiki&amp;gt;https://admin.exchange.microsoft.com&amp;lt;/nowiki&amp;gt;).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
https://wiki.innovaphone.com/index.php?title=Reference16r1:PBX/Config/Authentication&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78184</id>
		<title>Howto16r1:Configure OAuth2 E-Mail</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Configure_OAuth2_E-Mail&amp;diff=78184"/>
		<updated>2025-10-08T13:59:43Z</updated>

		<summary type="html">&lt;p&gt;Tfu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
innovaphone PBX and apps can be configured to send E-Mails for various subjects and purposes. Major E-Mail providers intent to discontinue the username/password authentication schemes in favour of OAuth2. PBX and Apps version 16r1 does support OAuth2 authentication for SMTP. Here is a step by step guide how to set up OAuth2 support in Microsoft 365 through the Azure Portal and how to set it up on a Google Gmail account in the Google Cloud Console.&lt;br /&gt;
&lt;br /&gt;
== Microsoft 365 ==&lt;br /&gt;
Log in to Microsoft Azure Portal (&amp;lt;nowiki&amp;gt;https://portal.azure.com&amp;lt;/nowiki&amp;gt;) and go to Microsoft Entra ID.&lt;br /&gt;
[[File:AzureMicrosoftEntraID.png|none|thumb|600x600px|/AzureMicrosoftEntraID.png|/AzureMicrosoftEntraID.png]]&lt;br /&gt;
Add a new app registration to create client credentials.&lt;br /&gt;
[[File:AzureAddAppRegistration.png|none|thumb|600x600px|/AzureAddAppRegistration.png|/AzureAddAppRegistration.png]]&lt;br /&gt;
Register the application and maybe already fill in the redirect URI for Web based application type to path OAUTH2-CLIENT/auth.htm at the PBX.&lt;br /&gt;
[[File:AzureRegisterAnApplication.png|none|thumb|600x600px|/AzureRegisterAnApplication.png|/AzureRegisterAnApplication.png]]&lt;br /&gt;
App registration is complete. Client ID and tenant needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureApp.png|none|thumb|600x600px|/AzureApp.png|/AzureApp.png]]&lt;br /&gt;
Create a client secret. Note that expiry is limited to no longer than 2 years. The client secret must be renewed before expiry and the new secret configured and interactive authorisation carried out again to ensure continuous operation.&lt;br /&gt;
[[File:AzureAddClientSecret.png|none|thumb|600x600px|/AzureAddClientSecret.png|/AzureAddClientSecret.png]]&lt;br /&gt;
Copy the client secret. It also needs to be configured at the PBX and every app that will be sending e-mails.&lt;br /&gt;
[[File:AzureCopyClientSecret.png|none|thumb|600x600px|/AzureCopyClientSecret.png|/AzureCopyClientSecret.png]]&lt;br /&gt;
Add permissions located in APIs my organization uses.&lt;br /&gt;
[[File:AzureAddApiPermissionMyOrganization.png|none|thumb|600x600px|/AzureAddApiPermissionMyOrganization.png|/AzureAddApiPermissionMyOrganization.png]]&lt;br /&gt;
More precisely located in Office 365 Exchange Online.&lt;br /&gt;
[[File:AzureAddApiPermissionExchange.png|none|thumb|600x600px|/AzureAddApiPermissionExchange.png|/AzureAddApiPermissionExchange.png]]&lt;br /&gt;
And there in the application permissions.&lt;br /&gt;
[[File:AzureAddApiExchangeApplication.png|none|thumb|600x600px|/AzureAddApiExchangeApplication.png|/AzureAddApiExchangeApplication.png]]&lt;br /&gt;
Namely SMTP Mail.Send.&lt;br /&gt;
[[File:AzureAddApiSendMailAsUser.png|none|thumb|600x600px|/AzureAddApiSendMailAsUser.png|/AzureAddApiSendMailAsUser.png]]&lt;br /&gt;
Grant admin permission for Mail.Send.&lt;br /&gt;
[[File:AzureGrantApiPermissions.png|none|thumb|600x600px|/AzureGrantApiPermissions.png|/AzureGrantApiPermissions.png]]&lt;br /&gt;
API permissions are now granted.&lt;br /&gt;
[[File:AzureApiPermissionsGranted.png|none|thumb|600x600px|/AzureApiPermissionsGranted.png|/AzureApiPermissionsGranted.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:AzureRedirectUris.png|none|thumb|600x600px|/AzureRedirectUris.png|/AzureRedirectUris.png]]&lt;br /&gt;
Allow public client flows of OAuth2. Resource Owner Password Credentials Flow has the advantage that it doesn&#039;t need interactive authorization.&lt;br /&gt;
[[File:AzureAllowPublicClientFlows.png|none|thumb|600x600px|/AzureAllowPublicClientFlows.png|/AzureAllowPublicClientFlows.png]]&lt;br /&gt;
Log in to the Microsoft 365 admin center (https://admin.cloud.microsoft).&lt;br /&gt;
[[File:MS365AdminCenter.png|none|thumb|600x600px|/MS365AdminCenter.png|/MS365AdminCenter.png]]&lt;br /&gt;
Make sure that Microsoft 365 licenses are assigned to your user.&lt;br /&gt;
[[File:MS365UserLicenses.png|none|thumb|600x600px|/MS365UserLicenses.png|/MS365UserLicenses.png]]&lt;br /&gt;
Set your user active.&lt;br /&gt;
[[File:MS365ActiveUsers.png|none|thumb|600x600px|/MS365ActiveUsers.png|/MS365ActiveUsers.png]]&lt;br /&gt;
Locate the Mail tab of your user.&lt;br /&gt;
[[File:MS365UserEMail.png|none|thumb|600x600px|/MS365UserEMail.png|/MS365UserEMail.png]]&lt;br /&gt;
Allow authenticated SMTP.&lt;br /&gt;
[[File:MS365AuthenticatedSMTP.png|none|thumb|600x600px|/MS365AuthenticatedSMTP.png|/MS365AuthenticatedSMTP.png]]&lt;br /&gt;
Login to the Exchange admin center (&amp;lt;nowiki&amp;gt;https://admin.exchange.microsoft.com&amp;lt;/nowiki&amp;gt;).&lt;br /&gt;
[[File:ExchangeAdminCenter.png|none|thumb|600x600px|/ExchangeAdminCenter.png|/ExchangeAdminCenter.png]]&lt;br /&gt;
Remove deactivation of the SMTP AUTH protocol.&lt;br /&gt;
[[File:ExchangeRemoveDeavtivatedOAuth2.png|none|thumb|600x600px|/ExchangeRemoveDeavtivatedOAuth2.png|/ExchangeRemoveDeavtivatedOAuth2.png]]&lt;br /&gt;
With this Microsoft setup the OAuth2 configuration for the resource owner password credentials flow can be filled in as follows. &lt;br /&gt;
[[File:OAuth2ResourceOwnerPasswordCredentials.png|none|thumb|600x600px|/OAuth2ResourceOwnerPasswordCredentials.png|/OAuth2ResourceOwnerPasswordCredentials.png]]&lt;br /&gt;
For interactive authorization this is the OAuth2 configuration. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveAuthorization.png|none|thumb|600x600px|/OAuth2InteractiveAuthorization.png|/OAuth2InteractiveAuthorization.png]]&lt;br /&gt;
&lt;br /&gt;
== Gmail ==&lt;br /&gt;
Login to the Google Cloud Console (https://console.cloud.google.com), select a project, New project.&lt;br /&gt;
[[File:GoogleSelectProject.png|none|thumb|600x600px|/GoogleSelectProject.png|/GoogleSelectProject.png]]&lt;br /&gt;
Create the project.&lt;br /&gt;
[[File:GoogleCreateProject.png|none|thumb|600x600px|/GoogleCreateProject.png|/GoogleCreateProject.png]]&lt;br /&gt;
Client credentials will be created in this project.&lt;br /&gt;
[[File:GoogleProjectCreated.png|none|thumb|600x600px|/GoogleProjectCreated.png|/GoogleProjectCreated.png]]&lt;br /&gt;
From the library specify the APIs needed to access.&lt;br /&gt;
[[File:GoogleApisServicesFromLibrary.png|none|thumb|600x600px|/GoogleApisServicesFromLibrary.png|/GoogleApisServicesFromLibrary.png]]&lt;br /&gt;
These are in the Gmail API.&lt;br /&gt;
[[File:GoogleApisServicesApiLibrary.png|none|thumb|600x600px|/GoogleApisServicesApiLibrary.png|/GoogleApisServicesApiLibrary.png]]&lt;br /&gt;
Choose the Gmail API and enable it.&lt;br /&gt;
[[File:GoogleGmailApis.png|none|thumb|600x600px|/GoogleGmailApis.png|/GoogleGmailApis.png]]&lt;br /&gt;
Credentials need to be created.&lt;br /&gt;
[[File:GoogleGmailApiAdded.png|none|thumb|600x600px|/GoogleGmailApiAdded.png|/GoogleGmailApiAdded.png]]&lt;br /&gt;
Invoke the help me choose wizard.&lt;br /&gt;
[[File:GoogleCreateCredentialsHelpMeChoose.png|none|thumb|600x600px|/GoogleCreateCredentialsHelpMeChoose.png|/GoogleCreateCredentialsHelpMeChoose.png]]&lt;br /&gt;
User data access is needed.&lt;br /&gt;
[[File:GoogleCredentialsUserData.png|none|thumb|600x600px|/GoogleCredentialsUserData.png|/GoogleCredentialsUserData.png]]&lt;br /&gt;
Configure the consent screen of the interactive authorization.&lt;br /&gt;
[[File:GoogleOAuthConsentScreen.png|none|thumb|600x600px|/GoogleOAuthConsentScreen.png|/GoogleOAuthConsentScreen.png]]&lt;br /&gt;
Specify the permissions that need to be authorized by the user.&lt;br /&gt;
[[File:GoogleOAuthScopes.png|none|thumb|600x600px|/GoogleOAuthScopes.png|/GoogleOAuthScopes.png]]&lt;br /&gt;
Its mail.google.com in general.&lt;br /&gt;
[[File:GoogleScopeMailGoogleCom.png|none|thumb|600x600px|/GoogleScopeMailGoogleCom.png|/GoogleScopeMailGoogleCom.png]]&lt;br /&gt;
And its to send email on the users behalf.&lt;br /&gt;
[[File:GoogleScopeAuthGmailSend.png|none|thumb|600x600px|/GoogleScopeAuthGmailSend.png|/GoogleScopeAuthGmailSend.png]]&lt;br /&gt;
These are the scopes needed.&lt;br /&gt;
[[File:GoogleScopes.png|none|thumb|600x600px|/GoogleScopes.png|/GoogleScopes.png]]&lt;br /&gt;
Ask client credentials for Web type application.&lt;br /&gt;
[[File:GoogleOAuthClientID.png|none|thumb|600x600px|/GoogleOAuthClientID.png|/GoogleOAuthClientID.png]]&lt;br /&gt;
Tell all redirect URIs that the PBX and the apps will be using during interactive authorization.&lt;br /&gt;
[[File:GoogleRedirectURIs.png|none|thumb|600x600px|/GoogleRedirectURIs.png|/GoogleRedirectURIs.png]]&lt;br /&gt;
Download the credentials. This json file contains all information for OAuth2 configuration.&lt;br /&gt;
[[File:GoogleClientCredentialsDownload.png|none|thumb|600x600px|/GoogleClientCredentialsDownload.png|/GoogleClientCredentialsDownload.png]]&lt;br /&gt;
Customize the OAuth consent screen&lt;br /&gt;
[[File:GoogleOAuthConsentScreenSettings.png|none|thumb|600x600px|/GoogleOAuthConsentScreenSettings.png|/GoogleOAuthConsentScreenSettings.png]]&lt;br /&gt;
Start the customization wizard.&lt;br /&gt;
[[File:GoogleConsentScreenWizard.png|none|thumb|600x600px|/GoogleConsentScreenWizard.png|/GoogleConsentScreenWizard.png]]&lt;br /&gt;
Choose which users may authorize.&lt;br /&gt;
[[File:GoogleAudienceExternal.png|none|thumb|600x600px|/GoogleAudienceExternal.png|/GoogleAudienceExternal.png]]&lt;br /&gt;
Google workspace users may choose internal audience. Users not in Google workspace proceed with external.&lt;br /&gt;
[[File:GoogleContactInformation.png|none|thumb|600x600px|/GoogleContactInformation.png|/GoogleContactInformation.png]]&lt;br /&gt;
Add a test user.&lt;br /&gt;
[[File:GoogleTestUserAdded.png|none|thumb|600x600px|/GoogleTestUserAdded.png|/GoogleTestUserAdded.png]]&lt;br /&gt;
The OAuth2 parameters can be filled in with the information from the json file downloaded above. Authorize e-mail access one time and send a test mail to verify everything went well.&lt;br /&gt;
[[File:OAuth2InteractiveGmail.png|none|thumb|600x600px|/OAuth2InteractiveGmail.png|/OAuth2InteractiveGmail.png]]&lt;br /&gt;
&lt;br /&gt;
== Generic ==&lt;br /&gt;
&lt;br /&gt;
For other e-mail providers the client secret post OAuth2 flow may be configured in a generic way. Details need to be supplied by the e-mail provider.&lt;br /&gt;
&lt;br /&gt;
For the Microsoft 365 setup above it would be as follows with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://login.microsoftonline.com/af326a34-169c-469e-946b-1ef57925306b/oauth2/v2.0/authorize?scope=https://outlook.office.com/SMTP.Send&amp;lt;/nowiki&amp;gt; offline_access&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.[[File:OAuth2ClientSecretPost.png|none|thumb|600x600px|/OAuth2ClientSecretPost.png|/OAuth2ClientSecretPost.png]]&lt;br /&gt;
For the Gmail example above the generic confguration would be like this with Token endpoint &#039;&#039;&amp;lt;nowiki&amp;gt;https://oauth2.googleapis.com/token&amp;lt;/nowiki&amp;gt;&#039;&#039; Authorization URL &#039;&#039;&amp;lt;nowiki&amp;gt;https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;amp;scope=https://mail.google.com/&amp;lt;/nowiki&amp;gt;&#039;&#039; The configuration appends &#039;&#039;&amp;amp;response_type=code&amp;amp;prompt=consent&amp;amp;login_hint=...&amp;amp;redirect_uri=...&amp;amp;client_id=...&#039;&#039; automatically.&lt;br /&gt;
[[File:OAith2ClientSecretPostGmail.png|none|thumb|600x600px|/OAith2ClientSecretPostGmail.png]]&lt;br /&gt;
The private key jwt OAuth2 flow can be configured generically as well.[[File:OAuth2PrivateKeyJWT.png|none|thumb|600x600px|/OAuth2PrivateKeyJWT.png|/OAuth2PrivateKeyJWT.png]]&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
https://wiki.innovaphone.com/index.php?title=Reference16r1:PBX/Config/Authentication&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Services/Logging&amp;diff=78172</id>
		<title>Reference16r1:Services/Logging</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Services/Logging&amp;diff=78172"/>
		<updated>2025-10-06T12:20:56Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Alarms and Errors as Email */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
== Log Server ==&lt;br /&gt;
External &#039;&#039;&#039;logging&#039;&#039;&#039; is disabled by default (Off). You can still view log messages in real time (see [[Reference7:Administration/Diagnostics/Logging|Logging]]), but messages are not stored or sent to an external destination.&lt;br /&gt;
&lt;br /&gt;
Available &#039;&#039;Type&#039;&#039;s:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Off:&#039;&#039;&#039;&lt;br /&gt;
| Logging is disabled.&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;TCP:&#039;&#039;&#039;&lt;br /&gt;
| The device transmits the syslog entries using a TCP connection.&lt;br /&gt;
* In the &#039;&#039;&#039;Address&#039;&#039;&#039; field, the remote IP-address is entered.&lt;br /&gt;
* In the &#039;&#039;&#039;Port&#039;&#039;&#039; field, the remote port is specified.&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;SYSLOG:&#039;&#039;&#039;&lt;br /&gt;
| The syslog entries are transmitted to a syslog recipient (also referred to as syslogd, syslog server or syslog daemon).&lt;br /&gt;
* In the &#039;&#039;&#039;Address&#039;&#039;&#039; field, the IP-address of the syslogd server is entered.&lt;br /&gt;
* In the &#039;&#039;&#039;Class&#039;&#039;&#039; field, the syslog message class for the syslog entries sent is entered. The class is a numeric value between 0 and 7, it will be used as &#039;&#039;Facility&#039;&#039; (0 =&amp;gt; local0, ... 7 =&amp;gt; local7).  The &#039;&#039;Severity&#039;&#039; field will always be 6 (informational).  See [http://de.wikipedia.org/wiki/Syslog wikipedia.org/wiki/Syslog] for details.&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;HTTP:&#039;&#039;&#039;&lt;br /&gt;
| The syslog entries are transferred to a web server. Each individual syslog entry is transferred to the server as an individual request. &lt;br /&gt;
* In the &#039;&#039;&#039;Address&#039;&#039;&#039; field, the IP-address of remote server is entered.&lt;br /&gt;
* In the &#039;&#039;&#039;Path&#039;&#039;&#039; field, the relative URL to be used in the HTTP request is entered.&lt;br /&gt;
* The Method field selects the method used to send the request. There are 3 formats available:&lt;br /&gt;
{|&lt;br /&gt;
| Format || Request Type || URI  || Description&lt;br /&gt;
|-&lt;br /&gt;
| Standard || POST || &#039;&#039;hardwired&#039;&#039; || This should be used to forward log messages to another innovaphone device, e.g. to store it on a central CF card&lt;br /&gt;
|-&lt;br /&gt;
| External(POST) || POST || as defined in the Path field || This is identical to the &#039;&#039;Standard&#039;&#039; method, except that you may specifiy the URI to be used&lt;br /&gt;
|-&lt;br /&gt;
| External(GET) || GET || as defined in the Path field || The log message will be coded into GET &#039;&#039;form data&#039;&#039; (a.k.a. &#039;&#039;query args&#039;&#039;). This method is compatible to the method used in firmware versions 5.01 and 6.&lt;br /&gt;
|}&lt;br /&gt;
For more information on HTTP request formatting, see [[Reference7:HTTP Request Message Format]].&lt;br /&gt;
&lt;br /&gt;
If the addressed Web server requires authentication, an &#039;&#039;Authenticated URL&#039;&#039; has to be configured on the [[Reference:Configuration/General/HTTP-Client|HTTP-Client]] Page. The &#039;&#039;URL&#039;&#039; constructed by the logger is shown right next to the &#039;&#039;Path&#039;&#039; field. It must be entered in exactly this format on the [[Reference:Configuration/General/HTTP-Client|HTTP-Client]] Page. The device has to be restarted after the &#039;&#039;Authenticated URL&#039;&#039; has been set. &lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;LOCAL:&#039;&#039;&#039;&lt;br /&gt;
| The syslog entries are saved to [[Reference:Administration/Diagnostics/CF|the local CF card]] into the &#039;&#039;&#039;/log&#039;&#039;&#039; directory, e.g. &#039;&#039;&#039;\\&#039;&#039;ipaddr&#039;&#039;\drive\CF0\log&#039;&#039;&#039;.  Log files named &#039;&#039;&#039;LOG0.&#039;&#039;n&#039;&#039;&#039;&#039;&#039; are created, where &#039;&#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;&#039; goes from 0 to 3. The next log file is created when either the &#039;&#039;&#039;Max File Size&#039;&#039;&#039; is reached or the &#039;&#039;&#039;Backup Time&#039;&#039;&#039; has passed.  &#039;&#039;&#039;LOG0.0&#039;&#039;&#039; is the newest log file always.&lt;br /&gt;
&lt;br /&gt;
To concentrate all syslog messages to a single CF card, you would use the &#039;&#039;&#039;HTTP Log Server Type&#039;&#039;&#039; in all but one boxes with &#039;&#039;&#039;Method&#039;&#039;&#039; set to &#039;&#039;&#039;Standard&#039;&#039;&#039;.  &#039;&#039;&#039;Address&#039;&#039;&#039; must be set to the IP-address of the single box that has the CF card used for log message storage. &#039;&#039;&#039;Port&#039;&#039;&#039; must be set to  the port configured for the [[Reference:Configuration/General/HTTP-Server|HTTP-Server]] of this box.  &lt;br /&gt;
&lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;LOCAL-AP:&#039;&#039;&#039;&lt;br /&gt;
|The logs are transmitted to the local Linux application platform. Logs are stored under \\AP-IP\webdav\log\ and alarms under \\AP-IP\webdav\alarm\&lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;REMOTE-AP:&#039;&#039;&#039;&lt;br /&gt;
|The logs are transmitted to a remote Linux application platform. Store path is the same as under LOCAL-AP.&lt;br /&gt;
* In the Address  field, you enter the IP address of the remote Linux application platform.&lt;br /&gt;
* In the Port field, you specify the port to which the connection is set up.&lt;br /&gt;
Remark: Don&#039;t forget to enable access to \\AP-IP\ap\log.fcgi as [[Reference10:Concept_Linux_Application_Platform#Use_as_Log_or_Alarm_Server | required for use of LinAP as logserver]].&lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;REMOTE-AP-S:&#039;&#039;&#039;&lt;br /&gt;
|Same as REMOTE-AP, just a secure transmission is used.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A second server may be configured as &#039;&#039;&#039;Log Server Shadow&#039;&#039;&#039; receiving the same records as the first server.&lt;br /&gt;
&lt;br /&gt;
== Alarm and Event Handling ==&lt;br /&gt;
Alarm and event forwarding is configured independently from the handling of log messages.&lt;br /&gt;
&lt;br /&gt;
If no &#039;&#039;&#039;Forward Server&#039;&#039;&#039; is configured in the &#039;&#039;&#039;Alarm and Event Forward Server&#039;&#039;&#039; area, alarms and events are stored locally as specified in the &#039;&#039;&#039;Local Alarm and Event Queues&#039;&#039;&#039; area below.  Otherwise, alarms and events are additionally forwarded to the external server using HTTP requests. Each individual alarm or event entry is transferred to the server as an individual request.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;SYSLOG&amp;lt;/code&amp;gt; option is only available on Gateway devices. Phones should use HTTP to forward alarm/events to an innovaphone gateway which may forward the collected events to a syslog server. &lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Address&#039;&#039;&#039; is used to set the IP-address of an external HTTP server that will receive the forwarded alarms and events.&lt;br /&gt;
* The &#039;&#039;&#039;Port&#039;&#039;&#039; defines the TCP port the HTTP request is sent to.&lt;br /&gt;
* The &#039;&#039;&#039;Method&#039;&#039;&#039; selects the method used to send the the requests. The same methods as for the &#039;&#039;&#039;Log Server&#039;&#039;&#039; are available here. (only on gateways)&lt;br /&gt;
&lt;br /&gt;
To collect all alarms and events in a single device card, you would use the &#039;&#039;&#039;Standard Method&#039;&#039;&#039; in all but one boxes. &#039;&#039;&#039;Address&#039;&#039;&#039; must be set to the IP-address of the central box. &#039;&#039;&#039;Port&#039;&#039;&#039; must be set to the port configured for the [[{{NAMESPACE}}:Configuration/General/HTTP-Server|HTTP-Server]] of this box.&amp;lt;br/&amp;gt;&lt;br /&gt;
The collected alarms and events may further be forwarded to one or two SYSLOG server(s) as XML-encoded records. &lt;br /&gt;
This is achieved by configuring a &#039;&#039;&#039;Forward Server&#039;&#039;&#039; with &#039;&#039;&#039;Method&#039;&#039;&#039; SYSLOG, the server address under &#039;&#039;&#039;Address&#039;&#039;&#039; and the SYSLOG-Class under &#039;&#039;&#039;Class&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Local Alarm and Event Queues&#039;&#039;&#039; area allows you to control the number of events and alarms that are kept in memory and stored in non-volatile memory during restarts.&lt;br /&gt;
&lt;br /&gt;
== Alarms and Errors as Email ==&lt;br /&gt;
Definition of email target to send alarms and errors as email to.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Sender Address&#039;&#039;&#039;: email adress of sender&lt;br /&gt;
* &#039;&#039;&#039;Senders&#039; Name&#039;&#039;&#039;: alias of sender name&lt;br /&gt;
* &#039;&#039;&#039;Recipient Address&#039;&#039;&#039;: email adress of recipient&lt;br /&gt;
* &#039;&#039;&#039;Recipients&#039; Name&#039;&#039;&#039;: alias of recipient name&lt;br /&gt;
* &#039;&#039;&#039;Email Server Address&#039;&#039;&#039;: ip-adress or DNS name of smtp email server. TLS will be supported automatically, if demanded by the server. &lt;br /&gt;
* &#039;&#039;&#039;User&#039;&#039;&#039;: user account at email server&lt;br /&gt;
* &#039;&#039;&#039;Password&#039;&#039;&#039;: user password at email server&lt;br /&gt;
* &#039;&#039;&#039;OAuth2&#039;&#039;&#039;: Alternatively OAuth2 credentials to authenticate for e-mail sending. See [[Howto16r1:Configure_OAuth2_E-Mail]].&lt;br /&gt;
&lt;br /&gt;
== Handling of incoming Alarms/Events ==&lt;br /&gt;
{|&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Authenticate:&#039;&#039;&#039;&lt;br /&gt;
| When enabled request HTTP Authentication for the incoming HTTP Alarms/Events messages. You must configure in the sender the HTTP credentials to be able to deliver the Alarms/Events. &lt;br /&gt;
|-&lt;br /&gt;
{|&lt;br /&gt;
== Local Alarm and Event Queues ==&lt;br /&gt;
{|&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Memory Queue Entries:&#039;&#039;&#039;&lt;br /&gt;
| Maximum number of faults and alarms to hold in volatile memory (DRAM)(Default:100).&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Persistent Queue Entries:&#039;&#039;&#039;&lt;br /&gt;
| Maximum number of faults and alarms to keep in flash memory (Default:50).&lt;br /&gt;
|-&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
== Catch trace on Event ==&lt;br /&gt;
&lt;br /&gt;
Event codes (up to 4 different) may be configured, on which the tracing is stopped. The event codes can be copied from actual events displayed on Maintenance/Events. Hexadecimal values was converted and stored as Decimal values.&lt;br /&gt;
&lt;br /&gt;
After the event has happend the trace was stopped, the trace can be read which hopefully contains what caused the event.&lt;br /&gt;
&lt;br /&gt;
You can restart the logfile by emptying the [[{{NAMESPACE}}:Maintenance/Diagnostics/Tracing |buffer]].&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r1:Services/Logging&amp;diff=78171</id>
		<title>Reference13r1:Services/Logging</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r1:Services/Logging&amp;diff=78171"/>
		<updated>2025-10-06T12:20:33Z</updated>

		<summary type="html">&lt;p&gt;Tfu: Undo revision 78169 by Tmo (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Log Server ==&lt;br /&gt;
External &#039;&#039;&#039;logging&#039;&#039;&#039; is disabled by default (Off). You can still view log messages in real time (see [[Reference7:Administration/Diagnostics/Logging|Logging]]), but messages are not stored or sent to an external destination.&lt;br /&gt;
&lt;br /&gt;
Available &#039;&#039;Type&#039;&#039;s:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Off:&#039;&#039;&#039;&lt;br /&gt;
| Logging is disabled.&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;TCP:&#039;&#039;&#039;&lt;br /&gt;
| The device transmits the syslog entries using a TCP connection.&lt;br /&gt;
* In the &#039;&#039;&#039;Address&#039;&#039;&#039; field, the remote IP-address is entered.&lt;br /&gt;
* In the &#039;&#039;&#039;Port&#039;&#039;&#039; field, the remote port is specified.&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;SYSLOG:&#039;&#039;&#039;&lt;br /&gt;
| The syslog entries are transmitted to a syslog recipient (also referred to as syslogd, syslog server or syslog daemon).&lt;br /&gt;
* In the &#039;&#039;&#039;Address&#039;&#039;&#039; field, the IP-address of the syslogd server is entered.&lt;br /&gt;
* In the &#039;&#039;&#039;Class&#039;&#039;&#039; field, the syslog message class for the syslog entries sent is entered. The class is a numeric value between 0 and 7, it will be used as &#039;&#039;Facility&#039;&#039; (0 =&amp;gt; local0, ... 7 =&amp;gt; local7).  The &#039;&#039;Severity&#039;&#039; field will always be 6 (informational).  See [http://de.wikipedia.org/wiki/Syslog wikipedia.org/wiki/Syslog] for details.&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;HTTP:&#039;&#039;&#039;&lt;br /&gt;
| The syslog entries are transferred to a web server. Each individual syslog entry is transferred to the server as an individual request. &lt;br /&gt;
* In the &#039;&#039;&#039;Address&#039;&#039;&#039; field, the IP-address of remote server is entered.&lt;br /&gt;
* In the &#039;&#039;&#039;Path&#039;&#039;&#039; field, the relative URL to be used in the HTTP request is entered.&lt;br /&gt;
* The Method field selects the method used to send the request. There are 3 formats available:&lt;br /&gt;
{|&lt;br /&gt;
| Format || Request Type || URI  || Description&lt;br /&gt;
|-&lt;br /&gt;
| Standard || POST || &#039;&#039;hardwired&#039;&#039; || This should be used to forward log messages to another innovaphone device, e.g. to store it on a central CF card&lt;br /&gt;
|-&lt;br /&gt;
| External(POST) || POST || as defined in the Path field || This is identical to the &#039;&#039;Standard&#039;&#039; method, except that you may specifiy the URI to be used&lt;br /&gt;
|-&lt;br /&gt;
| External(GET) || GET || as defined in the Path field || The log message will be coded into GET &#039;&#039;form data&#039;&#039; (a.k.a. &#039;&#039;query args&#039;&#039;). This method is compatible to the method used in firmware versions 5.01 and 6.&lt;br /&gt;
|}&lt;br /&gt;
For more information on HTTP request formatting, see [[Reference7:HTTP Request Message Format]].&lt;br /&gt;
&lt;br /&gt;
If the addressed Web server requires authentication, an &#039;&#039;Authenticated URL&#039;&#039; has to be configured on the [[Reference:Configuration/General/HTTP-Client|HTTP-Client]] Page. The &#039;&#039;URL&#039;&#039; constructed by the logger is shown right next to the &#039;&#039;Path&#039;&#039; field. It must be entered in exactly this format on the [[Reference:Configuration/General/HTTP-Client|HTTP-Client]] Page. The device has to be restarted after the &#039;&#039;Authenticated URL&#039;&#039; has been set. &lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;LOCAL:&#039;&#039;&#039;&lt;br /&gt;
| The syslog entries are saved to [[Reference:Administration/Diagnostics/CF|the local CF card]] into the &#039;&#039;&#039;/log&#039;&#039;&#039; directory, e.g. &#039;&#039;&#039;\\&#039;&#039;ipaddr&#039;&#039;\drive\CF0\log&#039;&#039;&#039;.  Log files named &#039;&#039;&#039;LOG0.&#039;&#039;n&#039;&#039;&#039;&#039;&#039; are created, where &#039;&#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;&#039; goes from 0 to 3. The next log file is created when either the &#039;&#039;&#039;Max File Size&#039;&#039;&#039; is reached or the &#039;&#039;&#039;Backup Time&#039;&#039;&#039; has passed.  &#039;&#039;&#039;LOG0.0&#039;&#039;&#039; is the newest log file always.&lt;br /&gt;
&lt;br /&gt;
To concentrate all syslog messages to a single CF card, you would use the &#039;&#039;&#039;HTTP Log Server Type&#039;&#039;&#039; in all but one boxes with &#039;&#039;&#039;Method&#039;&#039;&#039; set to &#039;&#039;&#039;Standard&#039;&#039;&#039;.  &#039;&#039;&#039;Address&#039;&#039;&#039; must be set to the IP-address of the single box that has the CF card used for log message storage. &#039;&#039;&#039;Port&#039;&#039;&#039; must be set to  the port configured for the [[Reference:Configuration/General/HTTP-Server|HTTP-Server]] of this box.  &lt;br /&gt;
&lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;LOCAL-AP:&#039;&#039;&#039;&lt;br /&gt;
|The logs are transmitted to the local Linux application platform. Logs are stored under \\AP-IP\webdav\log\ and alarms under \\AP-IP\webdav\alarm\&lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;REMOTE-AP:&#039;&#039;&#039;&lt;br /&gt;
|The logs are transmitted to a remote Linux application platform. Store path is the same as under LOCAL-AP.&lt;br /&gt;
* In the Address  field, you enter the IP address of the remote Linux application platform.&lt;br /&gt;
* In the Port field, you specify the port to which the connection is set up.&lt;br /&gt;
Remark: Don&#039;t forget to enable access to \\AP-IP\ap\log.fcgi as [[Reference10:Concept_Linux_Application_Platform#Use_as_Log_or_Alarm_Server | required for use of LinAP as logserver]].&lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;REMOTE-AP-S:&#039;&#039;&#039;&lt;br /&gt;
|Same as REMOTE-AP, just a secure transmission is used.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A second server may be configured as &#039;&#039;&#039;Log Server Shadow&#039;&#039;&#039; receiving the same records as the first server.&lt;br /&gt;
&lt;br /&gt;
== Alarm and Event Handling ==&lt;br /&gt;
Alarm and event forwarding is configured independently from the handling of log messages.&lt;br /&gt;
&lt;br /&gt;
If no &#039;&#039;&#039;Forward Server&#039;&#039;&#039; is configured in the &#039;&#039;&#039;Alarm and Event Forward Server&#039;&#039;&#039; area, alarms and events are stored locally as specified in the &#039;&#039;&#039;Local Alarm and Event Queues&#039;&#039;&#039; area below.  Otherwise, alarms and events are additionally forwarded to the external server using HTTP requests. Each individual alarm or event entry is transferred to the server as an individual request.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;SYSLOG&amp;lt;/code&amp;gt; option is only available on Gateway devices. Phones should use HTTP to forward alarm/events to an innovaphone gateway which may forward the collected events to a syslog server. &lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Address&#039;&#039;&#039; is used to set the IP-address of an external HTTP server that will receive the forwarded alarms and events.&lt;br /&gt;
* The &#039;&#039;&#039;Port&#039;&#039;&#039; defines the TCP port the HTTP request is sent to.&lt;br /&gt;
* The &#039;&#039;&#039;Method&#039;&#039;&#039; selects the method used to send the the requests. The same methods as for the &#039;&#039;&#039;Log Server&#039;&#039;&#039; are available here. (only on gateways)&lt;br /&gt;
&lt;br /&gt;
To collect all alarms and events in a single device card, you would use the &#039;&#039;&#039;Standard Method&#039;&#039;&#039; in all but one boxes. &#039;&#039;&#039;Address&#039;&#039;&#039; must be set to the IP-address of the central box. &#039;&#039;&#039;Port&#039;&#039;&#039; must be set to the port configured for the [[{{NAMESPACE}}:Configuration/General/HTTP-Server|HTTP-Server]] of this box.&amp;lt;br/&amp;gt;&lt;br /&gt;
The collected alarms and events may further be forwarded to one or two SYSLOG server(s) as XML-encoded records. &lt;br /&gt;
This is achieved by configuring a &#039;&#039;&#039;Forward Server&#039;&#039;&#039; with &#039;&#039;&#039;Method&#039;&#039;&#039; SYSLOG, the server address under &#039;&#039;&#039;Address&#039;&#039;&#039; and the SYSLOG-Class under &#039;&#039;&#039;Class&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Local Alarm and Event Queues&#039;&#039;&#039; area allows you to control the number of events and alarms that are kept in memory and stored in non-volatile memory during restarts.&lt;br /&gt;
&lt;br /&gt;
== Alarms and Errors as Email ==&lt;br /&gt;
Definition of email target to send alarms and errors as email to.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Sender Address&#039;&#039;&#039;: email adress of sender&lt;br /&gt;
* &#039;&#039;&#039;Senders&#039; Name&#039;&#039;&#039;: alias of sender name&lt;br /&gt;
* &#039;&#039;&#039;Recipient Address&#039;&#039;&#039;: email adress of recipient&lt;br /&gt;
* &#039;&#039;&#039;Recipients&#039; Name&#039;&#039;&#039;: alias of recipient name&lt;br /&gt;
* &#039;&#039;&#039;Email Server Address&#039;&#039;&#039;: ip-adress or DNS name of smtp email server. TLS will be supported automatically, if demanded by the server. &lt;br /&gt;
* &#039;&#039;&#039;User&#039;&#039;&#039;: user account at email server&lt;br /&gt;
* &#039;&#039;&#039;Password&#039;&#039;&#039;: user password at email server&lt;br /&gt;
&lt;br /&gt;
== Handling of incoming Alarms/Events ==&lt;br /&gt;
{|&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Authenticate:&#039;&#039;&#039;&lt;br /&gt;
| When enabled request HTTP Authentication for the incoming HTTP Alarms/Events messages. You must configure in the sender the HTTP credentials to be able to deliver the Alarms/Events. &lt;br /&gt;
|-&lt;br /&gt;
{|&lt;br /&gt;
== Local Alarm and Event Queues ==&lt;br /&gt;
{|&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Memory Queue Entries:&#039;&#039;&#039;&lt;br /&gt;
| Maximum number of faults and alarms to hold in volatile memory (DRAM)(Default:100).&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Persistent Queue Entries:&#039;&#039;&#039;&lt;br /&gt;
| Maximum number of faults and alarms to keep in flash memory (Default:50).&lt;br /&gt;
|-&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
== Catch trace on Event ==&lt;br /&gt;
&lt;br /&gt;
Event codes (up to 4 different) may be configured, on which the tracing is stopped. The event codes can be copied from actual events displayed on Maintenance/Events. Hexadecimal values was converted and stored as Decimal values.&lt;br /&gt;
&lt;br /&gt;
After the event has happend the trace was stopped, the trace can be read which hopefully contains what caused the event.&lt;br /&gt;
&lt;br /&gt;
You can restart the logfile by emptying the [[{{NAMESPACE}}:Maintenance/Diagnostics/Tracing |buffer]].&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Apps/PbxManager/Email&amp;diff=78163</id>
		<title>Reference16r1:Apps/PbxManager/Email</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Apps/PbxManager/Email&amp;diff=78163"/>
		<updated>2025-10-06T11:01:51Z</updated>

		<summary type="html">&lt;p&gt;Tfu: Created page with &amp;quot;{{FIXME|reason=This product is in the beta phase and is not yet finished}} This PBX Manager Plugin configures the E-Mail Account of all PBXes in the system. The same configuration can be found in the advanced UI of the individual PBXes at PBX/Config/Authentication.  == Add Email Account == ; SMTP Server : Your SMTP Server  ; Email Address : The used From Address  ; Username : The username for the authorization  ; Password : The...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
This PBX Manager Plugin configures the E-Mail Account of all PBXes in the system. The same configuration can be found in the advanced UI of the individual PBXes at [[Reference13r2:PBX/Config/Authentication|PBX/Config/Authentication]].&lt;br /&gt;
&lt;br /&gt;
== Add Email Account ==&lt;br /&gt;
; SMTP Server&lt;br /&gt;
: Your SMTP Server&lt;br /&gt;
&lt;br /&gt;
; Email Address&lt;br /&gt;
: The used From Address&lt;br /&gt;
&lt;br /&gt;
; Username&lt;br /&gt;
: The username for the authorization&lt;br /&gt;
&lt;br /&gt;
; Password&lt;br /&gt;
: The password for the authorization&lt;br /&gt;
&lt;br /&gt;
; Sender&#039;s name&lt;br /&gt;
: The used Name in the From field&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Services/Logging&amp;diff=78162</id>
		<title>Reference16r1:Services/Logging</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Services/Logging&amp;diff=78162"/>
		<updated>2025-10-06T11:01:19Z</updated>

		<summary type="html">&lt;p&gt;Tfu: Created page with &amp;quot;{{FIXME|reason=This product is in the beta phase and is not yet finished}} == Log Server == External &amp;#039;&amp;#039;&amp;#039;logging&amp;#039;&amp;#039;&amp;#039; is disabled by default (Off). You can still view log messages in real time (see Logging), but messages are not stored or sent to an external destination.  Available &amp;#039;&amp;#039;Type&amp;#039;&amp;#039;s:  {| |valign=top nowrap=true|&amp;#039;&amp;#039;&amp;#039;Off:&amp;#039;&amp;#039;&amp;#039; | Logging is disabled. |- |valign=top nowrap=true|&amp;#039;&amp;#039;&amp;#039;TCP:&amp;#039;&amp;#039;&amp;#039; | The device transmits the syslog...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
== Log Server ==&lt;br /&gt;
External &#039;&#039;&#039;logging&#039;&#039;&#039; is disabled by default (Off). You can still view log messages in real time (see [[Reference7:Administration/Diagnostics/Logging|Logging]]), but messages are not stored or sent to an external destination.&lt;br /&gt;
&lt;br /&gt;
Available &#039;&#039;Type&#039;&#039;s:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Off:&#039;&#039;&#039;&lt;br /&gt;
| Logging is disabled.&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;TCP:&#039;&#039;&#039;&lt;br /&gt;
| The device transmits the syslog entries using a TCP connection.&lt;br /&gt;
* In the &#039;&#039;&#039;Address&#039;&#039;&#039; field, the remote IP-address is entered.&lt;br /&gt;
* In the &#039;&#039;&#039;Port&#039;&#039;&#039; field, the remote port is specified.&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;SYSLOG:&#039;&#039;&#039;&lt;br /&gt;
| The syslog entries are transmitted to a syslog recipient (also referred to as syslogd, syslog server or syslog daemon).&lt;br /&gt;
* In the &#039;&#039;&#039;Address&#039;&#039;&#039; field, the IP-address of the syslogd server is entered.&lt;br /&gt;
* In the &#039;&#039;&#039;Class&#039;&#039;&#039; field, the syslog message class for the syslog entries sent is entered. The class is a numeric value between 0 and 7, it will be used as &#039;&#039;Facility&#039;&#039; (0 =&amp;gt; local0, ... 7 =&amp;gt; local7).  The &#039;&#039;Severity&#039;&#039; field will always be 6 (informational).  See [http://de.wikipedia.org/wiki/Syslog wikipedia.org/wiki/Syslog] for details.&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;HTTP:&#039;&#039;&#039;&lt;br /&gt;
| The syslog entries are transferred to a web server. Each individual syslog entry is transferred to the server as an individual request. &lt;br /&gt;
* In the &#039;&#039;&#039;Address&#039;&#039;&#039; field, the IP-address of remote server is entered.&lt;br /&gt;
* In the &#039;&#039;&#039;Path&#039;&#039;&#039; field, the relative URL to be used in the HTTP request is entered.&lt;br /&gt;
* The Method field selects the method used to send the request. There are 3 formats available:&lt;br /&gt;
{|&lt;br /&gt;
| Format || Request Type || URI  || Description&lt;br /&gt;
|-&lt;br /&gt;
| Standard || POST || &#039;&#039;hardwired&#039;&#039; || This should be used to forward log messages to another innovaphone device, e.g. to store it on a central CF card&lt;br /&gt;
|-&lt;br /&gt;
| External(POST) || POST || as defined in the Path field || This is identical to the &#039;&#039;Standard&#039;&#039; method, except that you may specifiy the URI to be used&lt;br /&gt;
|-&lt;br /&gt;
| External(GET) || GET || as defined in the Path field || The log message will be coded into GET &#039;&#039;form data&#039;&#039; (a.k.a. &#039;&#039;query args&#039;&#039;). This method is compatible to the method used in firmware versions 5.01 and 6.&lt;br /&gt;
|}&lt;br /&gt;
For more information on HTTP request formatting, see [[Reference7:HTTP Request Message Format]].&lt;br /&gt;
&lt;br /&gt;
If the addressed Web server requires authentication, an &#039;&#039;Authenticated URL&#039;&#039; has to be configured on the [[Reference:Configuration/General/HTTP-Client|HTTP-Client]] Page. The &#039;&#039;URL&#039;&#039; constructed by the logger is shown right next to the &#039;&#039;Path&#039;&#039; field. It must be entered in exactly this format on the [[Reference:Configuration/General/HTTP-Client|HTTP-Client]] Page. The device has to be restarted after the &#039;&#039;Authenticated URL&#039;&#039; has been set. &lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;LOCAL:&#039;&#039;&#039;&lt;br /&gt;
| The syslog entries are saved to [[Reference:Administration/Diagnostics/CF|the local CF card]] into the &#039;&#039;&#039;/log&#039;&#039;&#039; directory, e.g. &#039;&#039;&#039;\\&#039;&#039;ipaddr&#039;&#039;\drive\CF0\log&#039;&#039;&#039;.  Log files named &#039;&#039;&#039;LOG0.&#039;&#039;n&#039;&#039;&#039;&#039;&#039; are created, where &#039;&#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;&#039; goes from 0 to 3. The next log file is created when either the &#039;&#039;&#039;Max File Size&#039;&#039;&#039; is reached or the &#039;&#039;&#039;Backup Time&#039;&#039;&#039; has passed.  &#039;&#039;&#039;LOG0.0&#039;&#039;&#039; is the newest log file always.&lt;br /&gt;
&lt;br /&gt;
To concentrate all syslog messages to a single CF card, you would use the &#039;&#039;&#039;HTTP Log Server Type&#039;&#039;&#039; in all but one boxes with &#039;&#039;&#039;Method&#039;&#039;&#039; set to &#039;&#039;&#039;Standard&#039;&#039;&#039;.  &#039;&#039;&#039;Address&#039;&#039;&#039; must be set to the IP-address of the single box that has the CF card used for log message storage. &#039;&#039;&#039;Port&#039;&#039;&#039; must be set to  the port configured for the [[Reference:Configuration/General/HTTP-Server|HTTP-Server]] of this box.  &lt;br /&gt;
&lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;LOCAL-AP:&#039;&#039;&#039;&lt;br /&gt;
|The logs are transmitted to the local Linux application platform. Logs are stored under \\AP-IP\webdav\log\ and alarms under \\AP-IP\webdav\alarm\&lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;REMOTE-AP:&#039;&#039;&#039;&lt;br /&gt;
|The logs are transmitted to a remote Linux application platform. Store path is the same as under LOCAL-AP.&lt;br /&gt;
* In the Address  field, you enter the IP address of the remote Linux application platform.&lt;br /&gt;
* In the Port field, you specify the port to which the connection is set up.&lt;br /&gt;
Remark: Don&#039;t forget to enable access to \\AP-IP\ap\log.fcgi as [[Reference10:Concept_Linux_Application_Platform#Use_as_Log_or_Alarm_Server | required for use of LinAP as logserver]].&lt;br /&gt;
|-  &lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;REMOTE-AP-S:&#039;&#039;&#039;&lt;br /&gt;
|Same as REMOTE-AP, just a secure transmission is used.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A second server may be configured as &#039;&#039;&#039;Log Server Shadow&#039;&#039;&#039; receiving the same records as the first server.&lt;br /&gt;
&lt;br /&gt;
== Alarm and Event Handling ==&lt;br /&gt;
Alarm and event forwarding is configured independently from the handling of log messages.&lt;br /&gt;
&lt;br /&gt;
If no &#039;&#039;&#039;Forward Server&#039;&#039;&#039; is configured in the &#039;&#039;&#039;Alarm and Event Forward Server&#039;&#039;&#039; area, alarms and events are stored locally as specified in the &#039;&#039;&#039;Local Alarm and Event Queues&#039;&#039;&#039; area below.  Otherwise, alarms and events are additionally forwarded to the external server using HTTP requests. Each individual alarm or event entry is transferred to the server as an individual request.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;SYSLOG&amp;lt;/code&amp;gt; option is only available on Gateway devices. Phones should use HTTP to forward alarm/events to an innovaphone gateway which may forward the collected events to a syslog server. &lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Address&#039;&#039;&#039; is used to set the IP-address of an external HTTP server that will receive the forwarded alarms and events.&lt;br /&gt;
* The &#039;&#039;&#039;Port&#039;&#039;&#039; defines the TCP port the HTTP request is sent to.&lt;br /&gt;
* The &#039;&#039;&#039;Method&#039;&#039;&#039; selects the method used to send the the requests. The same methods as for the &#039;&#039;&#039;Log Server&#039;&#039;&#039; are available here. (only on gateways)&lt;br /&gt;
&lt;br /&gt;
To collect all alarms and events in a single device card, you would use the &#039;&#039;&#039;Standard Method&#039;&#039;&#039; in all but one boxes. &#039;&#039;&#039;Address&#039;&#039;&#039; must be set to the IP-address of the central box. &#039;&#039;&#039;Port&#039;&#039;&#039; must be set to the port configured for the [[{{NAMESPACE}}:Configuration/General/HTTP-Server|HTTP-Server]] of this box.&amp;lt;br/&amp;gt;&lt;br /&gt;
The collected alarms and events may further be forwarded to one or two SYSLOG server(s) as XML-encoded records. &lt;br /&gt;
This is achieved by configuring a &#039;&#039;&#039;Forward Server&#039;&#039;&#039; with &#039;&#039;&#039;Method&#039;&#039;&#039; SYSLOG, the server address under &#039;&#039;&#039;Address&#039;&#039;&#039; and the SYSLOG-Class under &#039;&#039;&#039;Class&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Local Alarm and Event Queues&#039;&#039;&#039; area allows you to control the number of events and alarms that are kept in memory and stored in non-volatile memory during restarts.&lt;br /&gt;
&lt;br /&gt;
== Alarms and Errors as Email ==&lt;br /&gt;
Definition of email target to send alarms and errors as email to.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Sender Address&#039;&#039;&#039;: email adress of sender&lt;br /&gt;
* &#039;&#039;&#039;Senders&#039; Name&#039;&#039;&#039;: alias of sender name&lt;br /&gt;
* &#039;&#039;&#039;Recipient Address&#039;&#039;&#039;: email adress of recipient&lt;br /&gt;
* &#039;&#039;&#039;Recipients&#039; Name&#039;&#039;&#039;: alias of recipient name&lt;br /&gt;
* &#039;&#039;&#039;Email Server Address&#039;&#039;&#039;: ip-adress or DNS name of smtp email server. TLS will be supported automatically, if demanded by the server. &lt;br /&gt;
* &#039;&#039;&#039;User&#039;&#039;&#039;: user account at email server&lt;br /&gt;
* &#039;&#039;&#039;Password&#039;&#039;&#039;: user password at email server&lt;br /&gt;
&lt;br /&gt;
== Handling of incoming Alarms/Events ==&lt;br /&gt;
{|&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Authenticate:&#039;&#039;&#039;&lt;br /&gt;
| When enabled request HTTP Authentication for the incoming HTTP Alarms/Events messages. You must configure in the sender the HTTP credentials to be able to deliver the Alarms/Events. &lt;br /&gt;
|-&lt;br /&gt;
{|&lt;br /&gt;
== Local Alarm and Event Queues ==&lt;br /&gt;
{|&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Memory Queue Entries:&#039;&#039;&#039;&lt;br /&gt;
| Maximum number of faults and alarms to hold in volatile memory (DRAM)(Default:100).&lt;br /&gt;
|-&lt;br /&gt;
|valign=top nowrap=true|&#039;&#039;&#039;Persistent Queue Entries:&#039;&#039;&#039;&lt;br /&gt;
| Maximum number of faults and alarms to keep in flash memory (Default:50).&lt;br /&gt;
|-&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
== Catch trace on Event ==&lt;br /&gt;
&lt;br /&gt;
Event codes (up to 4 different) may be configured, on which the tracing is stopped. The event codes can be copied from actual events displayed on Maintenance/Events. Hexadecimal values was converted and stored as Decimal values.&lt;br /&gt;
&lt;br /&gt;
After the event has happend the trace was stopped, the trace can be read which hopefully contains what caused the event.&lt;br /&gt;
&lt;br /&gt;
You can restart the logfile by emptying the [[{{NAMESPACE}}:Maintenance/Diagnostics/Tracing |buffer]].&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:PBX/Config/Authentication&amp;diff=78159</id>
		<title>Reference16r1:PBX/Config/Authentication</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:PBX/Config/Authentication&amp;diff=78159"/>
		<updated>2025-10-06T06:55:57Z</updated>

		<summary type="html">&lt;p&gt;Tfu: /* Related Articles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept_OAuth2]]&lt;br /&gt;
[[Category:Concept_myApps]]&lt;br /&gt;
{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
The authentication for myApps and myPBX is configured on this page. &lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
== Authentication ==&lt;br /&gt;
* &#039;&#039;&#039;Two-factor authentication&#039;&#039;&#039; Requires users to additionally approve their logins using an existing session or by clicking a link sent via email. (myApps only)&lt;br /&gt;
* &#039;&#039;&#039;Authentication type&#039;&#039;&#039; (myApps and myPBX)&lt;br /&gt;
** &#039;&#039;&#039;PBX only&#039;&#039;&#039; Login is allowed with PBX user password only.&lt;br /&gt;
** &#039;&#039;&#039;Netlogon only&#039;&#039;&#039; Login is allowed with Windows password only.&lt;br /&gt;
** &#039;&#039;&#039;PBX and Netlogon&#039;&#039;&#039; Login is allowed with both PBX user password and Windows password.&lt;br /&gt;
** &#039;&#039;&#039;OAuth2 only&#039;&#039;&#039; Login is allowed with OpenID/OAuth2 only. (myApps only)&lt;br /&gt;
** &#039;&#039;&#039;PBX and OAuth2&#039;&#039;&#039; Login is allowed with both PBX user password and OpenId/OAuth2. (myApps only)&lt;br /&gt;
* &#039;&#039;&#039;OAuth2 provider name&#039;&#039;&#039; A user friendly name of the OAuth2 provider that shall be displayed on the login form, e.g. &amp;quot;Windows&amp;quot; or &amp;quot;Active Directory&amp;quot;. (myApps only)&lt;br /&gt;
* &#039;&#039;&#039;OAuth2 domain&#039;&#039;&#039; This configuration is needed, if the OAuth2 user domain does not match the PBX domain. If a domain is configured, users of that domain will be treated like members of the PBX domain.&lt;br /&gt;
** Example: No domain configured. user@example.com -&amp;gt; user@example.com&lt;br /&gt;
** Example: example.com configured. user@example.com -&amp;gt; user&lt;br /&gt;
&lt;br /&gt;
== Email verification ==&lt;br /&gt;
An email account that is used by the PBX for sending mails. It is used for:&lt;br /&gt;
* Sending verification emails for two-factor authentication.&lt;br /&gt;
* Emails from the voicemail object.&lt;br /&gt;
Configuration:&lt;br /&gt;
* &#039;&#039;&#039;SMTP server&#039;&#039;&#039; The IP address or DNS name of the SMTP server.&lt;br /&gt;
* &#039;&#039;&#039;Client host name&#039;&#039;&#039; The hostname or IP address for the EHLO message. Optional, defaulting to 127.0.0.1.&lt;br /&gt;
* &#039;&#039;&#039;Sender name&#039;&#039;&#039; A readable name that is used as the sender of the emails.&lt;br /&gt;
* &#039;&#039;&#039;Email address&#039;&#039;&#039; The email address for sending mails.&lt;br /&gt;
* &#039;&#039;&#039;Username&#039;&#039;&#039; The username of the email account.&lt;br /&gt;
* &#039;&#039;&#039;Password&#039;&#039;&#039; The password of the email account.&lt;br /&gt;
* &#039;&#039;&#039;OAuth2&#039;&#039;&#039; Alternatively OAuth2 credentials to authenticate for e-mail sending. See [[Howto16r1:Configure_OAuth2_E-Mail]].&lt;br /&gt;
* &#039;&#039;&#039;Verification link&#039;&#039;&#039; The link that is used for accepting or rejecting sessions. Configure &amp;lt;code&amp;gt;https://PBX-IP-or-DNS-name/PBX0/session.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Test&#039;&#039;&#039; Here you can send a test mail using the configured account.&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
[[Reference16r1:Concept OAuth2 Windows Authentication]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Howto16r1:Configure_OAuth2_E-Mail]]&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r1:Apps/PbxManager/App_Microsoft365&amp;diff=78026</id>
		<title>Reference14r1:Apps/PbxManager/App Microsoft365</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r1:Apps/PbxManager/App_Microsoft365&amp;diff=78026"/>
		<updated>2025-10-02T11:51:54Z</updated>

		<summary type="html">&lt;p&gt;Tfu: Reverted edit by The (talk) to last revision by Tfu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With the Connector for Microsoft 365 PBX-Manager plugin, the needed app object can be created and configured automatically. &lt;br /&gt;
&lt;br /&gt;
== Add an app object == &lt;br /&gt;
&lt;br /&gt;
;name&lt;br /&gt;
:The &#039;&#039;name&#039;&#039; displayed for the app object which must be unique.&lt;br /&gt;
&lt;br /&gt;
;SIP&lt;br /&gt;
:The &#039;&#039;sip&#039;&#039; from the app object which must be unique.&lt;/div&gt;</summary>
		<author><name>Tfu</name></author>
	</entry>
</feed>