Implement the PUSH notifications in native iOS APP with PortSIP PBX 12.x
This guide gives you step-by-step instructions on how to create a native iOS app based on PortSIP VoIP SDK, which could receive VoIP push notifications sent from PortSIP PBX 12.x.
This manual supports the new PushKit push notification policy that is introduced in iOS 13 and Xcode 11.
For iOS 13.0 and later, if you fail to report a call to CallKit, the system will terminate your app. Repeatedly failing to report calls may cause the system to stop delivering any more VoIP push notifications to your app. If you want to initiate a VoIP call without using CallKit, register for PUSH notifications by using the UserNotifications framework instead of PushKit.
PortPBX 12.x uses VoIP PUSH for push VoIP calls, and APNs PUSH for IM messages.
1. VoIP notifications
The official documentation can be found here. Some of the advantages are:
• The device is woken up only when VoIP pushes occur, which saves energy. • Unlike standard push notifications, which the user must respond to before your app can perform an action, VoIP pushes go straight to your app for processing. • VoIP pushes are considered high-priority notifications and are delivered without delay. • VoIP pushes can include more data than what is provided with standard push notifications. • Your app is automatically relaunched if it’s not running when a VoIP push is received. • Your app is given runtime to process a push, even if your app is operating in the background
2. Prerequisite settings
Apple provides us with a framework called PushKit to support using this VoIP push feature. However, we need to configure some additional settings to get this working.
3. Creating an App ID
In case you don’t have an app (and consequently an App ID), you need to create one. First, login to your Apple developer account and access Certificates, Identifier & Profiles:
Next, go to Identifiers and click on the + button.
Two important things to fill out here are: App ID Description and so-called Bundle ID (this will most likely be something like com.yourdomain.yourappname):
Select “Push Notifications”
Although not seen in the screenshots above, I used com.portsip.portsipvoipdemo as Bundle ID. This will be important in the next step.
4. Generating a VoIP push certificate for VoIP Call
Click on the All button in the Certificates section on the left-hand side and the + button:
On the next page you need to select the VoIP Services Certificate:
After this you need to select the App ID for which you’re creating this VoIP certificate:
Next, you’ll be presented with instructions to choose CSR (Certificate Signing Request) file:
Once the file is created, you’ll select it for upload on the next screen. If everything goes well you’ll be given the certificate which you have to download:
After downloading the certificate, open it up, and this should open the Keychain Access application. Now you should see the certificate under the My Certificates section:
5. Generating an APNs push certificate for Instant Messaging
Click on the All button in the Certificates section of the left navigation tree and the + button:
On the next page you need to select the Apple Push Notification service SSL (Sandbox & Production):
After this you need to select the App ID for which you’re creating this Apple Push Notification certificate:
Next, you’ll be presented with instructions to choose CSR (Certificate Signing Request) file:
Once the file is created, you’ll select it for uploading on the next screen. If everything goes well, you’ll be given the certificate which you have to download.
After you download the certificate, open it up, and this should open the Keychain Access application. Now you should see the certificate under the My Certificates section:
6. Adding PUSH support into the project
As the feature has been implemented in our latest SIPSample, you can download it from our latest SIPSample.
Take special care when setting the Product Name as the Bundle Identifier is set automatically from it. We need to set this the same as the Bundle Identifier that we've set in the previous steps.
7. Setting the appropriate capabilities
On the project’s Signing & Capabilities tab, add “Push Notifications” and “Background Modes”. Make sure that the “Audio, AirPlay and Picture in Picture”, “Voice over IP”, “Remote notifications” options are enabled.
8. Adding the code
Open AppDelegate.m and add the import PushKit and UserNotifications statement at the top of it.
#import <PushKit/PushKit.h> #import <UserNotifications/UserNotifications.h> @interfaceAppDelegate()PKPushRegistryDelegate,UNUserNotificationCenterDelegate> @end
Next, in the didFinishLaunchingWithOptions part of the application function make sure you register for notifications like this:
At this point, you will get an error on the pushRegistry.delegate = self; line saying "Cannot assign a value of type 'AppDelegate' to type 'PKPushRegistryDelegate!'".
The delegate for pushRegistry is of type PKPushRegistryDelegate which has three methods, two of which are required. (didUpdatePushCredentials and didReceiveIncomingPushWithPayload). We have to define a so-called extension of the AppDelegate class. We do that by adding the following code after all the current code in the AppDelegate.m file:
After adding this extension you will note that the previously mentioned error disappears.
In the first function, we merely output the device token. We will need this token in the next section when we'll be testing our app with sending VoIP push notifications.
In the second one we 'act' on the received VoIP push notification. On iOS 13.0 and later, we must report a call to CallKit. The third function (didInvalidatePushTokenForType) is used for handling when the token is invalidated.
We need to notify PortPBX that this client has enabled PUSH by adding sip header "x-p-push” to REGISTER message.
When app receives PUSH or APP is running, it should register to server automatically:
9. Preparing the certificate files
The VoIP certificate file that we’ve downloaded and added to the KeyChain has to be converted to a different file format so that we’ll be able to use it with the tools and services that I’ve listed above.
First, you need to open the KeyChain app on your Mac and Export (right click and select Export) the VoIP Services certificate:
You will get a YOUR_CERT.p12 (e.g voip_push.p12) file. Now export the Apple Push Services certificate file. Navigate to the folder where you have exported this file to and execute the following command:
Creating a Push Credential with your VoIP Service Certificate.
Creating a Push Credential with your Apple Push Service Certificate.
We need merge two Push Credential to one file:
This will generate portpbx_push.pem
and portpbx_push_key.pem
files that we’ll use in the PBX Server.
10. Houston
The Houston will allows us to send the PUSH notifications for test from the terminal window.
The VoIP certificate file that we’ve downloaded and added to the KeyChain has to be converted to a different file format so that we’ll be able to use it with the tools and services I’ve listed above. Even though the docs say you can install it simply with gem install houston, you will most likely end up (after some StackOverflow searching) using this command to install it:
This way you’ll install it to your local bin directory to which you have full rights. Houston installed one more tool that will help us send the notifications like this: With Terminal navigate to the folder where you have your certificate:
Testing VoIP PUSH:
Copy the device Token from APP didUpdatePushCredentials and execute a command as follows:
You should get the following output in your terminal:
1 push notification sent successfully
And, you should see a push message for APP didReceiveIncomingPushWithPayload on your phone in case it was in the foreground.
Test APNs PUSH:
Copy the device Token from APP didUpdatePushCredentials and execute the command as follows:
You should get the following output in your terminal:
1 push notification sent successfully
And, you should see a push message for APP didReceiveNotificationResponse in the background or willPresentNotification in the foreground.
If you like UI, you can download Knuff, the debug application for Apple Push Notification Service (APNs).
11. PortSIP PBX
Now sign in PortSIP PBX 12.0 Management Console, select menu “Settings” > “Mobile PUSH”.
Click “Add New App” button, you will see below screen:
Please set the following items:
Enabled – check it to enable PUSH and un-check to disable PUSH.
Apple and Google both are provided with the production PUSH server and development PUSH server for sending PUSH notifications. The development production server is usually used during the development stage. Once your app is released, you can change this setting to the production server.
App ID – the ID that you created in step 3. Note, this ID is case-sensitive.
Apple certificate file and private key file. The certificate files you generated in step 9. Please keep in mind that the private key file must be without the password (portpbx_push.pem and portpbx_push_key.pem).
Click the “Apply” button and the PUSH service is enabled in PBX.
Last updated