iOS Interactive Push

Let users take actions on push notifications right from the notification banner or alert

Among other improvements and changes that come along in iOS 8+, Apple introduced interactive notifications that let you take actions on push notifications right from the notification banner or alert without losing focus from the app you're in at the moment.

Pushwoosh has recently added so-called iOS Categories that allow you to create custom push buttons right from your Pushwoosh Control Panel.

Creating Categories in Pushwoosh Control Panel

  1. First of all, you should create a Category in your Pushwoosh Control Panel. A category contains either one or two buttons.

  2. Open a Configure page of your application in Pushwoosh, and click the Edit Actions button.

  3. Give a name to the Category you are about to create, you will use it for your further reference.

  4. Specify the text which will be used as a button label. iOS displays up to 2 lines of text.

  5. Select a button type:

    • Destructive – the button is red, signifies actions such as delete, reject, dismiss, etc.

    • Non-destructive – the button is blue, signifies positive actions.

  6. Choose whether you would like your app to be launched in the foreground when a user taps on the button by enabling the “Launch app on action” checkbox.

  7. Click "Save changes", and it will be saved in Pushwoosh with a Category ID.

API

When your application calls registerDevice, Pushwoosh API returns the response that contains a list of available Categories with their IDs and details for each button as follows:

{
  "status_code": 200,
  "status_message": "OK",
  "response": {
    "iosCategories": [
      {
        "categoryId": 65,
        "buttons": [
          {
            "id": 0,
            "label": "Rate",
            "type": "1",
            "startApplication": 1
          },
          {
            "id": 1,
            "label": "Later",
            "type": "0",
            "startApplication": 0
          }
        ]
      }
    ]
  }
}

These Categories are now available on the device, so they can be properly displayed when a message arrives and your application is not running in the foreground.

In order to send your push with a category from the Pushwoosh Journey, simply select it in the iOS platform settings while composing your message. In case you are sending your pushes remotely through Pushwoosh API, in the createMessage requests you should use the "ios_category" parameter with a corresponding Category ID as a value:

 {
        "categoryId": 65,  // Optional. String value. iOS8 category ID from Pushwoosh

When a push message containing a category ID arrives, Pushwoosh SDK displays the notification with a set of buttons this category contains.

Buttons & Actions in Pushwoosh iOS SDK

In order to perform various actions upon opening an app, you should create a custom UNUserNotificationCenterDelegate implementation and override its didReceiveNotificationResponse method:

class CustomDelegate: NSObject, UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        let identifier = response.actionIdentifier
        let category = response.notification.request.content.categoryIdentifier
        
        if category == "10212" {
            if identifier == "1" {
                // DO SOMEHTING
            } else {
                // DO SOMETHING ELSE
            }
        }
        
        completionHandler()
    }
}

where identifier is a button ID, and category is derived from the notification payload. Then, create an instance of this class and pass it to Pushwoosh SDK using the proxy method:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        Pushwoosh.sharedInstance().registerForPushNotifications()
        
        let customDelegate = CustomDelegate()
        Pushwoosh.sharedInstance().notificationCenterDelegateProxy?.add(customDelegate)
        
        return true
    }

Done!

Last updated