Event Source Notifications in Native iOS Applications

improve this page | report issue

Overview

Prerequisite: Make sure to read the Push notifications in native iOS applications tutorial first.

Event source notifications are notification messages that are targeted to devices with a user subscription.
While the user subscription exists, MobileFirst Server can produce push notifications for the subscribed user. These notifications can be delivered by the adapter code to all or some of the devices from which the user subscribed.

To learn more about the architecture and terminology of event-source push notifications refer to the Push notification overview tutorial.

Implementation of the push notification API consists of the following main steps:

On the server side:

  • Creating an event source
  • Sending notification

On the client side:

  • Sending the token and initializing the WLPush class
  • Registering the event source
  • Subscribing to/unsubscribing from the event source

Agenda

Notification API - Server-side

Creating an event source

To create an event source, you declare a notification event source in the adapter JavaScript code at a global level (outside any JavaScript function):

WL.Server.createEventSource({
    name: 'PushEventSource',
    onDeviceSubscribe: 'deviceSubscribeFunc',
    onDeviceUnsubscribe: 'deviceUnsubscribeFunc',
    securityTest:'PushApplication-strong-mobile-securityTest'
});

  • name – a name by which the event source is referenced.
  • onDeviceSubscribe – an adapter function that is invoked when the user subscription request is received.
  • onDeviceUnsubscribe – an adapter function that is invoked when the user unsubscription request is received.
  • securityTest – a security test from the authenticationConfig.xml file, which is used to protect the event source.

An additional event source option:

poll: {
    interval: 3,
    onPoll: 'getNotificationsFromBackend'
}

  • poll – a method that is used for notification retrieval.
    The following parameters are required:

    • interval – the polling interval in seconds.
    • onPoll – the polling implementation. An adapter function to be invoked at specified intervals.

Sending a notification

As described previously, notifications can be either polled from the back-end system or pushed by one. In this example, a submitNotifications() adapter function is invoked by a back-end system as an external API to send notifications.

function submitNotification(userId, notificationText) {
    var userSubscription = WL.Server.getUserNotificationSubscription('PushAdapter.PushEventSource', userId);
    if (userSubscription === null) {
        return { result: "No subscription found for user :: " + userId };
    }
    var badgeDigit = 1;
    var notification = WL.Server.createDefaultNotification(notificationText, badgeDigit, {custom:"data"});
        WL.Server.notifyAllDevices(userSubscription, notification);
    return {
        result: "Notification sent to user :: " + userId
    };
}

The submitNotification function receives the userId to send notification to and the notificationText.

function submitNotification(userId, notificationText) {

A user subscription object contains the information about all of the user’s subscriptions. Each user subscription can have several device subscriptions. The object structure is as follows:

{
    userId: 'bjones',
    state: {
        customField: 3
    },
    getDeviceSubscriptions: function()[}
};

Next line:

var userSubscription = WL.Server.getUserNotificationSubscription('PushAdapter.PushEventSource', userId);

If the user has no subscriptions for the specified event source, a null object is returned.

if (userSubscription === null) {
        return { result: "No subscription found for user :: " + userId };
    }

The WL.Server.createDefaultNotification API method creates and returns a default notification JSON block for the supplied values.

var badgeDigit = 1;
var notification = WL.Server.createDefaultNotification(notificationText, badgeDigit, {custom:"data"});

  • notificationText - The text to be pushed to the device.
  • Badge (number) - A number that is displayed on the application icon or tile (in environments that support it).
  • custom - Custom, or Payload, is a JSON object that is transferred to the application and that can contain custom properties.

The WL.Server.notifyAllDevices API method sends notification to all the devices that are subscribed to the user.

WL.Server.notifyAllDevices(userSubscription, notification);


Several APIs exist for sending notifications:

  • WL.Server.notifyAllDevices(userSubscription, options) - to send notification to all user’s devices.
  • WL.Server.notifyDevice(userSubscription, device, options) - to send notification to a specific device that belongs to a specific user subscription.
  • WL.Server.notifyDeviceSubscription(deviceSubscription, options) - to send the notification to a specific device.

Notification API - Client-side

A device subscription belongs to a user subscription and exists in the scope of a specific user and event source. A user subscription can have several device subscriptions.

The device subscription is created when the application on a device calls the [[WLPush sharedInstance]subscribe] method.

The device subscription is deleted either by an application that calls [[WLPush sharedInstance] unsubscribe] or when the push mediator informs MobileFirst Platform Server that the device is permanently not accessible.

  1. Access the WLPush functionality by using [WLPush sharedInstance] anywhere in your application.

  2. Create an instance of onReadyToSubscribeListener and set values for alias, adaptername and eventsource.

    ReadyToSubscribeListener *readyToSubscribeListener = [[ReadyToSubscribeListener alloc] initWithController:self];
      readyToSubscribeListener.alias = self.alias;
      readyToSubscribeListener.adapterName = self.adapterName;
      readyToSubscribeListener.eventSourceName = self.eventSourceName;

  3. Set the onReadyToSubscribeListener on WLPush.

    [[WLPush sharedInstance] setOnReadyToSubscribeListener:readyToSubscribeListener];

  4. Pass the token to WLPush.
    [[WLPush sharedInstance] setTokenFromClient:deviceToken.description];

Sending token to client and initializing WLPush

The user must initialize the WLPush sharedInstance in the application's ViewController load method.

AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
[[WLPush sharedInstance]init];

The user must add this method to the app delegate to get the token.
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
}

The token that is received by this method must be passed to the WLPush method.

[[WLPush sharedInstance] setTokenFromClient:deviceToken.description];

Registering the event source

IBM MobileFirst Platform Foundation provides the customizable onReadyToSubscribe function, which is used to register an event source.
Set up your onReadyToSubscribe function in Listener, which implements WLOnReadyToSubscribeListener.

This function is called when authentication finishes.

#import "ReadyToSubscribeListener.h"
#import "MyEventSourceListener.h
@implementation ReadyToSubscribeListener
-(void)OnReadyToSubscribe{
  MyEventSourceListener *eventSourceListener=[[MyEventSourceListener alloc]init];
  [[WLPush sharedInstance] registerEventSourceCallback:self.alias :self.adapterName
  :self.eventSourceName :eventSourceListener];
}
@end


Subscribing to the event source

Prerequisite: To subscribe, a user must authenticate.

To set up subscription to the event source, use the following API:

- (IBAction)subscribe:(id)sender {
  MySubscribeListener *mySubscribeListener = [[MySubscribeListener alloc] initWithController:self];
  [[WLPush sharedInstance]subscribe:self.alias :nil :mySubscribeListener];
}

[[WLPush sharedInstance] subscribe] takes the following parameters:

  • An alias, as declared in [[WLPush sharedInstance] registerEventSourceCallback]
  • WLPushOptions - instance contains the custom subscription parameters that the event source supports (optional)
  • id WLDelegate - The listener object instance, whose onSuccess and onFailure callback methods are called (optional)

Delegates receive a response object if one is required.

Unsubscribing from an event source

To set up unsubscription from an event source, use the following API:

- (IBAction)unsubscribe:(id)sender {
  MyUnsubscribeListener *myUnsubscribelistener = [[MyUnsubscribeListener alloc]initWithController:self];
  [[WLPush sharedInstance]unsubscribe:self.alias :myUnsubscribelistener];
}

[[WLPush sharedInstance] unsubscribe] takes the following parameters:

  • An alias, as declared in [[WLPush sharedInstance] registerEventSourceCallback]
  • id WLDelegate - The listener object instance, whose onSuccess and onFailure callback methods are called (optional)

Delegates receive a response object if one is required.

Additional client-side APIs

[[WLPush sharedInstance]isPushSupported] – Returns true if push notifications are supported by the platform, or false otherwise.
[[WLPush sharedInstance]isSubscribed:alias] – Returns whether the currently logged-in user is subscribed to a specified event source alias. The call does not connect to the server, it returns the local state.


When a push notification is received by a device, the didReceiveRemoteNotification method is called in the app delegate. Logic to handle the notification should be defined here.

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    NSLog(@"Received Notification %@",userInfo.description);
}

If the application was in background mode (or inactive) when the push notification arrived, this callback is called when the application returns to the foreground.

Sample application

Click to download the MobileFirst project.

Click to download the Native project.

  • The EventSourceNotifications project contains a MobileFirst native API that you can deploy to your MobileFirst server.
  • The EventSourceNotificationsObjC project contains a native iOS application that uses a MobileFirst native API library to subscribe for push notification and receive notifications from APNS.
  • Make sure to update the worklight.plist file in the native project with the relevant server settings.

missing_alt

Sending a notification

To test the application is able to receive a push notification you can perform one of the following:

  1. Right-click the adapter in MobileFirst Studio and select Call MobileFirst Adapter
  2. If using the CLI, for example:
    $ mfp adapter call
    [?] Which endpoint do you want to use? PushAdapter/submitNotification
    [?] Enter the comma-separated parameters: "the-user-name", "hello!"
    [?] How should the procedure be called? GET
Inclusive terminology note: The Mobile First Platform team is making changes to support the IBM® initiative to replace racially biased and other discriminatory language in our code and content with more inclusive language. While IBM values the use of inclusive language, terms that are outside of IBM's direct influence are sometimes required for the sake of maintaining user understanding. As other industry leaders join IBM in embracing the use of inclusive language, IBM will continue to update the documentation to reflect those changes.
Last modified on November 28, 2017