-
Notifications
You must be signed in to change notification settings - Fork 28
App Registration for Mobile SDK 3.x
For SDK v3.0.0 onwards, you are required to register your Apps on the developer portal to obtain the correct clientId and clientSecret with the required scopes by following this guide.
-
Choose
Yes
forWill this integration use a mobile SDK?
- Provide a name for your integration. This will be shown on the permissions consent page for your users
- Provide a contact email for your App.
- Upload an icon or choose from one of the defaults that is available.
- Provide a description for your app. This will also be visible to your users on the consent page.
- Provide one or more redirect URIs for your app. These will be used by the
OAuth2
flow to capture the auth code. You'll be providing this to the SDK while creating theOAuthAuthenticator
instance.
- Now click on
Add integration
at the bottom. Congrats, now your integration has been created successfully.
Note: If you do not plan on using CUCM incoming call push notification capabilities, Please feel free to skip the remainder of the guide.
Follow the steps below for enabling CUCM push notifications
-
To create an APNs auth key, Visit the Apple Developer Member Center.
-
Click on “Certificates, Identifiers & Profiles”.
-
Go to Keys from the Left Menu and Create a new Auth Key by clicking on the “+” button.
-
On the following page, add a Key Name, select APNs and hit
Continue
-
Hit the register button.
-
On this page, you will be able to download your auth key file
-
In the webex developer portal, navigate to the settings page of your integration and click on
Add new APNS
. Here you'll have to base64 encode your APNS private key and fill in the other fields in the JSON format as below. e.g:{ "keyId": "73Q8JZND1V", "bundleId": "com.example.KitchenSink", "teamId": "D7A3215KHV", "keyFile": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR1RBZ0VBTUNNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJIa3dkd0lCQVFRZzRWM0dJOVZ1SWFjWXNTcksKSU5qYzBNQ3RJVkcyMmFlSVNtL2tFQjBia2phZ0NnWUlLb1pJemowREFRZWhSQU5DQUFTZWdZT0RNTzhuNTZDQgpnQUxLek1yUkEybE1UMnZJallQQ1Y3dTN1UVE2N2FZenFCN0JYdW16Y2NPRFlSYVhBeUdUcjg1L0c3R2htdkJOCkIyUnhQTkQ2Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=" }
Note: Every time you add new APNS credentials, the previous one is overridden. Click on
clear
to clear all stored credentialsNote: It may take up to 24 Hours for your unique app id to become active for push notifications as the server maintains a cache of applications, and syncs them every 24 hours
-
In your app, please fetch your APNs VOIP token by using
PKPushRegistryDelegate
sfunc pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType)
method. -
Create the following payload and make a
PUT
request tohttps://<cucm_ip>:8443/cucm-uds/user/<userid>/device/<devicePkid>/devicetoken
<token> <pushNotifyToken>pushNotifyToken</pushNotifyToken> <!-- Your APNs voip device token --> <pushChannelType>APNS</pushChannelType><!--format : APNS, APNS:dev--> <key>base64_encoded_secret_key</key><!--Base64 encoded secret key. This secret key will be used for encryption of notification payload by CUCM. Same secret key(base64 decoded) should be used for decrypting the APNS payload--> <algorithm>A256GCM</algorithm> <application>you_unique_app_id_from_dev_portal</application> <payloadVersion>V2</payloadVersion> </token>
NOTE: For cucm_ip and devicePkid values in the above request, communicate with your CUCM admin.
Check SSO Access Token with UDS for SSO based authentication with UDS
Check UDS API References for more details.
-
When you receive a new push notification from CUCM, you can listen for it in
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void)
method. The payload will be encrypted using the above key that you've provided. You'll need to decrypt it using the same key and algorithm. A reference third-party pod for this decryption would be SwCrypt. -
Your implementation of the
didReceiveIncomingPushWith
method must report notifications of type VoIP to the CallKit framework, by calling thereportNewIncomingCall(with:update:completion:)
method of your app'sCXProvider
object. When you call that method, the system displays the standard incoming call interface to the user unless an error occurs. Check Apple's documentation for further details -
After decrypting the push notification, you'll have a field called
pushId
. You'll need to pass this towebex.phone.getCallIdFromNotificationId(notificationId: pushId, notificationType: .CUCM)
and you'll get a callId which can be used to answer the call
Follow the steps below for enabling CUCM push notifications for the android application
-
Get your FCM service account file. Go to Firebase Projects page
-
Select your project and as shown below and go to your Project Settings
-
Click on the Service accounts tab, then click
Generate new private key
. A file named<your-project>-firebase-adminsdk-<first-numbers-of your-key>.json
will be generated. This is your ServiceAccount json file -
On the webex developer portal, go to your integration's settings page and Click on
Add new FCMs
. Here you'll have to base64 encode your FCM serviceAccount json file's content and fill it in as the value for theserviceAccount
key in the json, as shown below. e.g:{ "serviceAccount": "ICAgewogICJ0eXBlIjogInNlcnZpY2VfYWNjb3VudCIsCiAgInByb2plY3RfaWQiOiAia2l0Y2hlbnNpbmstZGVtby1hcHAtYXY2YWIiLAogICJwcml2YXRlX2tleV9pZCI6ICI3N2Q5YTE2YjExMjZlOGJkY2VhY2tjNDk0ZGQwMzVlYzQwZTk2OTVjIiwKICAicHJpdmF0ZV9rZXkiOiAiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXG5NSUlFdlFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLY3dnZ1NqQWdFQUFvSUJBUURWcnhrd1RGQXlKaDl6XG5TTENXdHVLNzkwTVk2ZVpPSWE3SUZUclFjUlpWeG9QeVJpOXEyOGJhRTFWeUZ5MC9tZVV4eGNKYU9vUDZ3a1AxXG5uU0NBRTJhbk5NRUNBdWoyWWRkeG1RSDBJdGQrdWptbHUrdmdQdW5JamFwUys0ajFoVDlKcG54M1phSjVJZXpSXG5Xa0lLWXFEZUVrY1hpSlZNYVE1aEZnRFh5RnV3L3lYakJFY0dPTzdpV0JmRE1xR041N1cybWZkWXZrZVg2ZXBOXG5KeWtYSDRvSlhYYVNzMldjbFBuNExYNFRqekFJelRvZE1NaUF2YzJhekE2dkxOQmZYZUdwSWtOajlzdWpWWGN1XG5lT3VWMzM4U2hEQXhydTNuUkNCV3U2Y2s0S3l1SGw3eUZ1NHBQQU96ZDlFS3pCa3UyVXFnT0g5eUwySkVYT0xMXG5aNGxZNXh3bEFnTUJBQUVDZ2dFQUdiTFIvdkRDbVZGajZXZTEweDVpRk5TSEpZVWx6VUk0UkxobTV5QWVuVWkvXG5ZQ0VJUFZ2NnBZbjdOZm9yRnpIUk1tUHovSWw2aTJzWEpNQVZvMG1TQ0N4c1JPdG9MSTkyUzJOcExIMFBPUjY0XG41YUY4Mis1OUM4RmIyVmlHYjI2cnZwWU85SVlNM1BBVFROZER4MzkybE5hU1piWm5yRFdiUk5wU1ZpRXl3ODJuXG5hTHRPQXYxcWpHeUJjUzV4dzNlVlNUS096TjZwbGVpVWZaVlRIRmFQYStrRnNVMnpOYVg4S1g5RnFLUWorUW9BXG5EdVhzTFBYR1ZZWVd3MXAwblNaaXBDOEREeFI0NitTK21QQmNHUU41TXI5UW5FK0doNVBJclIwTHlCbGVQT3BDXG5Oa1VFZXNpQVBZZ2NDZExsT1dRMXIwUXB5bjI1L1YvZm1LWmtSeGl4bVFLQmdRRHowbTlRSjNheGtSeGxKRnNUXG5yTDVkYkM2ZFZ1VURPemMzQjBvNGkvakJ2OWlxd0t5T0RwdFFPSjgrYVBId0pvVVlVUThZY0kzK0gzNDMzblVoXG56NVBTbUVTTnozci9ZMUdKVWJTMTgvZTU3blF4UnZCMVVURnVlQjE1aXVzTUpkbmJEL0puQUJpUmZ1dEtHL0F3XG52WGV5TURGOW9mRU50RnRDTVAvckw0bTh1UUtCZ1FEZ1cwL0lMYlpMTVFjRTlhWVVxSmdpWjd6YU0wMEUrWkpRXG5Fc2sxdEdNMkZreW91emlYelJQbnNEb3BLUnM4YzVEc3hORHFYRmFFWnYrVjB4TEYvQW1RY0tNQ2g4NmxlemFLXG5vMGxEVmNVS3Z5VjZWRUppMGp0eTk1UnB4QjBnejdVdEp3aWNnYkFkM0l5S2dnMkhJN0w0ekhoOW5VeEJ2SzNXXG5lSHJNdHN6Y3pRS0JnUUNyOHJuQm96TVhvcWlOdzRmZlpqR1NITnI2NXU3MnltbjBDdFlTN3ROdGYraEM4MEk5XG5wSnR2aFo3NEduYVV6L1dJNHBGc3dPUENWVjlqOHlSVHhkb1A2SVpnSS9RdjYxRHpNSVhxMDdUZWtRV3NRc1VOXG5WMGN2Q3RKdWhzT2dlNGtaN2pNYTVIeHZEenpMdE13ODgwRllqcGc0YTE1ZU5kVXQ1dlIwWGNBYk1RS0JnRGdHXG4xWCtaMnNJZ05pNkk0YmFhKzVMcjhQOVVmRkZYdWJBQllQbm1XRGd6aldVOWk3NXMyaUdyb25xUTUxcExTYysyXG52cTBuN2ZzV2RaRUdxdE9DUXlrczE2aFVIY2k1WWo5dzAyVGJVRitFcUdsS0RXSDhPaGhWdDF4S096UHNhc1FoXG4wVWEwSkRUdzFLL3FGbEsvR1h5RUl6ckxRelhQVm1JT3FDdmpJbm1wQW9HQVVKN0ttSmNQRzNsc01aL0tUTDk2XG5uZjRSQXRLRXJCTnNWY2dkMFNVZ0F1WlI4NlhDaVhGQzYzdVE1NEViaXBiem1sQ3dGL2IyeFJGZTZ4RzlBZ0lFXG5kVjkvdXlLVG95Qk5zdXNwdm9jdEEyMHNUdUR1M1dOQWd5S0tRVTlaVVdnbDZHWFVKM0t5QWdQL0xGTStnU2RoXG41K1RHaTJ0RWVZa0w5aUg2cUd2NzJqRT1cbi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1cbiIsCiAgImNsaWVudF9lbWFpbCI6ICJmaXJlYmFzZS1hZG1pbnNkay1pMmthZEBraXRjaGVuc2luay1kZW1vLWF2NmFiLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwKICAiY2xpZW50X2lkIjogIjExMDQ3MjQ0Nzc2NDEwNDMwMDM2MSIsCiAgImF1dGhfdXJpIjogImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi9hdXRoIiwKICAidG9rZW5fdXJpIjogImh0dHBzOi8vb2F1dGgyLmdvb2dsZWFwaXMuY29tL3Rva2VuIiwKICAiYXV0aF9wcm92aWRlcl94NTA5X2NlcnRfdXJsIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92MS9jZXJ0cyIsCiAgImNsaWVudF94NTA5X2NlcnRfdXJsIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3JvYm90L3YxL21ldGFkYXRhL3g1MDkvZmlyZWJhc2UtYWRtaW5zZGstaTJrYWQlNDBraXRjaGVuc2luay1kZW1vLWF2NmFiLmlhbS5nc2VydmljZWFjY291bnQuY29tIgp9" }
Note: Every time you add a new FCM secret, the previous one is overridden. Click on
clear
to clear all stored secretsNote: It may take up to 24 Hours for your unique app id to become active for push notifications as the server maintains a cache of applications, and syncs them every 24 hours
-
In your android app, fetch your FCM registration token. Check FCM Documentation for android for how to get your registration token
-
Create the following payload and make a
PUT
request tohttps://<cucm_ip>:8443/cucm-uds/user/<userid>/device/<devicePkid>/devicetoken
<token> <pushNotifyToken>pushNotifyToken</pushNotifyToken> <!-- Your FCM device/registration token --> <pushChannelType>FCM</pushChannelType> <key>base_64_encoded_secret_key</key><!--Base64 encoded secret key. This secret key will be used for encryption of notification payload by CUCM. Same secret key(base64 decoded) should be used for decrypting the FCM payload--> <algorithm>A256GCM</algorithm> <application>you_unique_app_id_from_dev_portal</application> <payloadVersion>V2</payloadVersion> </token>
Now your app is ready to receive FCM notification for incoming CUCM calls.
NOTE: For cucm_ip and devicePkid values in the above request, communicate with your CUCM admin.
Check SSO Access Token with UDS for SSO based authentication with UDS
Check UDS API References for more details.
-
FCM notification would contain data in the following format:
class PushRestPayloadModel ( @SerializedName("type") val type: String?, @SerializedName("pushid") val pushId: String?, @SerializedName("displayname") val displayname: String?, @SerializedName("displaynumber") val displaynumber: String?, @SerializedName("payloadversion") val payloadversion: String?, @SerializedName("huntpilotdn") val huntpilotdn: String?, @SerializedName("ringexpiretime") val ringexpiretime: String? )
This payload data will be in an encrypted format and needs to be first decrypted using the same key that was provided in step 6 above.
NOTE: Need to use some third-party library for encryption/decryption which supports the AES256GCM algorithm.
An example library that you can use is given below :
Gradle dependency -
implementation “com.nimbusds:nimbus-jose-jwt:9.0”
Sample method for decryption using the nimbus jose library:
@param payload : the payload obtained from FCM notification @param decryptionKey : the key that was used for encryption. // Decode if encoded in base64 fun decryptPushRESTPayload(payload: String, decryptionKey: String): String { val jweObject = JWEObject.parse(payload) jweObject.decrypt(DirectDecrypter(decryptionKey.toByteArray())) val decryptedPayload = jweObject.payload return decryptedPayload.toString() }
-
After decryption, you'll have a field called
pushid
, as shown in the classPushRestPayloadModel
in step 7. You'll need to pass this towebex.getCallIdByNotificationId(notificationId = pushId, callType = NotificationCallType.Cucm)
and you'll get a callId which can be used to answer the call