Integrating the Push Notifications in Native iOS APP
This guide provides step-by-step instructions on creating a native iOS app using the PortSIP VoIP SDK, enabling it to receive VoIP push notifications from PortSIP PBX.
This manual supports the new PushKit push notification policy 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 using the UserNotifications framework instead of PushKit.
PortSIP PBX uses VoIP PUSH for 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 require user interaction 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 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 it is operating in the background.
2. Prerequisite Settings
Apple provides a framework called PushKit to support the VoIP push feature. However, additional settings need to be configured to get this working.
3. Creating an App ID
If you don’t have an app (and consequently an App ID), you need to create one. First, log in to your Apple developer account and access Certificates, Identifiers & Profiles:
Next, go to Identifiers and click on the + button.
Two important fields to fill out here are:
App ID Description: A brief description of your app.
Bundle ID: This will most likely be something like
com.yourdomain.yourappname
.
Select Push Notifications:
Although not shown in the screenshots above, I used com.portsip.portsipvoipdemo
as the Bundle ID. This will be important in the next step.
4. Generating a VoIP Push Certificate for VoIP Calls
Click on the All button in the Certificates section on the left-hand side, then click 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 a 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 need to download:
After downloading the certificate, open it. This should launch the Keychain Access application. You should now 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, then click 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 upload on the next screen. If everything goes well, you’ll be given the certificate, which you need to download.
After you download the certificate, open it. This should launch the Keychain Access application. You should now see the certificate under the My Certificates section.
6. Adding PUSH Support to the Project
The push notification feature has been implemented in our latest SIPSample, which you can download from our latest SIPSample.
Take special care when setting the Product Name as the Bundle Identifier is set automatically from it. Ensure that this matches the Bundle Identifier set in the previous steps.
7. Setting the Appropriate Capabilities
On the project’s Signing & Capabilities tab, add Push Notifications and Background Modes. Ensure that the Audio, AirPlay, and Picture in Picture, Voice over IP, and Remote notifications options are enabled.
8. Adding the Code
Open AppDelegate.m
and add the import PushKit
and import UserNotifications
statements at the top of the file.
#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 need to define an 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 notice 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 test our app with sending VoIP push notifications.
In the second function, 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 the SIP header X-Push to the REGISTER message.
When the app receives a PUSH notification or is running, it should automatically register to the server:
9. Preparing the Certificate Files
The VoIP certificate file that we’ve downloaded and added to the KeyChain needs to be converted to a different file format so that we can use it with the tools and services listed above.
First, open the KeyChain app on your Mac and export the VoIP Services certificate (right-click and select Export):
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 and execute the following command to create a Push Credential with your VoIP Service Certificate:
Creating a Push credential with your Apple Push Service Certificate:
We need to merge two Push Credentials to one file:
This process will generate portpbx_push.pem
and portpbx_push_key.pem
files, which we will use in the PortSIP PBX.
10. Houston
Houston allows us to send PUSH notifications for testing from the terminal window. The VoIP certificate file that we’ve downloaded and added to the KeyChain needs to be converted to a different file format so that we can use it with the tools and services mentioned above.
Although the documentation suggests installing it with gem install houston
, you will most likely end up using this command after some StackOverflow searching:
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:
This way, you’ll install it to your local bin directory, where you have full rights.
Houston also installs an additional tool that helps us send notifications. To use it, follow these steps:
Open Terminal and navigate to the folder where you have your certificate:
Testing VoIP push notifications
Copy the device token from the APP didUpdatePushCredentials
method and execute the following command:
You should see the following output in your terminal:
1 push notification sent successfully
And, you should see a push message for APP didReceiveIncomingPushWithPayload
on your phone if it was in the foreground.
Testing APNs push notifications:
Copy the device token from the APP didUpdatePushCredentials
method and execute the following command:
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 prefer a UI, you can download Knuff, the debug application for Apple Push Notification Service (APNs).
11. PortSIP PBX
Now, sign in to the PortSIP PBX Web portal. Navigate to Advanced > Mobile Push and click the Add button. You will see the following screen:
Please set the following items:
Enabled: Check this box to enable push notifications and uncheck it to disable them.
Apple and Google Servers: Both Apple and Google provide production and development push servers for sending notifications. The development server is typically used during the development stage. Once your app is released, switch to the production server.
App ID: Enter the ID you created in step 3. Note that this ID is case-sensitive.
Apple Certificate File and Private Key File: Copy and paste the certificate files content you generated in step 9. Ensure that the private key file is without a password (
portpbx_push.pem
andportpbx_push_key.pem
).
Click the OK button to enable the push service in PortSIP PBX.
Last updated