Code Modifications (iOS)

To handle notifications in iOS apps, you register in the AppDelegate class using the provided template code. In Swift apps, you must add an extension to decrypt incoming Notification Builder notifications.

Registering to Receive Notifications

Mobile SDK for iOS provides the SFPushNotificationManager class to handle push registration. To use it in Objective-C, import <SalesforceSDKCore/SFPushNotificationManager>. Swift doesn’t require a special import.

The SFPushNotificationManager class is available as a runtime shared instance:

Swift
1SFPushNotificationManager.sharedInstance()
Objective-C
1[SFPushNotificationManager sharedInstance]
This class implements these registration methods:
Swift
1func registerForRemoteNotifications()
2
3func application(_ application: UIApplication, 
4    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
5
6func registerSalesforceNotifications(completionBlock: (() → Void)?, 
7    fail: (() → Void)?)
8
9func unregisterSalesforceNotifications(withCompletionBlock: UserAccount, 
10    completionBlock: (() → Void)?) // for internal use
Objective-C
1- (void)registerForRemoteNotifications;
2
3- (void)didRegisterForRemoteNotificationsWithDeviceToken:
4    (NSData*)deviceTokenData;
5
6- (BOOL)registerSalesforceNotificationsWithCompletionBlock:(nullable 
7    void (^)(void))completionBlock failBlock:(nullable void (^)(void))failBlock;
8
9- (BOOL)unregisterSalesforceNotificationsWithCompletionBlock:(SFUserAccount*)user 
10    completionBlock:(nullable void (^)(void))completionBlock; // for internal use
Mobile SDK calls unregisterSalesforceNotifications at logout.
  • Salesforce encrypts Notification Builder notifications.
  • To support full content push notifications, your iOS app must implement the decryption class extension.
  • If a Mobile SDK app that hasn’t implemented decryption receives an encrypted Salesforce notification, the customer sees only the notification title.
  • Salesforce does not encrypt Apex push notifications.

Note

Implementing a Decryption Extension (Swift)

In Mobile SDK 8.2 and later, the forceios iOSNativeSwiftTemplate app requests notification authorization through the iOS UNUserNotificationCenter object. A specialized version of iOSNativeSwiftTemplate, iOSNativeSwiftEncryptedNotificationTemplate, extends the UNNotificationServiceExtension iOS class to handle notification decryption. This extension class, NotificationService, provides boilerplate decryption code that Mobile SDK apps can use without changes. To support encrypted notifications, you must be using Mobile SDK 8.2 or later, and your app must include this extension.

To create a Swift project that supports Notification Builder encrypted notifications, you can use the iOSNativeSwiftEncryptedNotificationTemplate template with forceios. Even if you’re updating an existing Mobile SDK project, it’s easiest to start fresh with a new forceios template project. If you’d rather update a Swift project manually, skip to “Example: Add Push Registration Manually (Swift)”.
  1. Install the latest forceios version from node.js:
    1[sudo] npm install -g forceios
  2. Call the forceios createWithTemplate command:
    1forceios createWithTemplate
  3. At the first prompt, enter iOSNativeSwiftEncryptedNotificationTemplate:
    1forceios createWithTemplate
    2Enter URI of repo containing template application or a Mobile SDK template name: 
    3    iOSNativeSwiftEncryptedNotificationTemplate
  4. In the remaining prompts, enter your company and project information. If your information is accepted, forceios creates a project that is ready for encrypted notifications.
  5. If you’re updating an older Mobile SDK project, copy your app-specific resources from your old project into the new project.

Add Push Registration Manually (Swift)

This example requires an existing app built on Mobile SDK 8.2 or higher and based on the iOSSwiftNativeTemplate project.

Configure Push Notification Registration in AppDelegate

  1. In the application(_:didFinishLaunchingWithOptions:) method, uncomment the call to registerForRemotePushNotifications.
    1func application(_ application: UIApplication, didFinishLaunchingWithOptions 
    2    launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    3
    4    self.window = UIWindow(frame: UIScreen.main.bounds)
    5    self.initializeAppViewState()
    6    // If you wish to register for push notifications, uncomment the line below. 
    7    // Note that if you want to receive push notifications from Salesforce, 
    8    // you will also need to implement the 
    9    // application(application, didRegisterForRemoteNotificationsWithDeviceToken) 
    10    // method (below).
    11    //
    12    self.registerForRemotePushNotifications()
    13    ...

    The registerForRemotePushNotifications method attempts to register your app with Apple for receiving remote notifications. If registration succeeds, Apple passes a device token to the application(_:didRegisterForRemoteNotificationsWithDeviceToken:) method of your AppDelegate class.

  2. In the application(_:didRegisterForRemoteNotificationsWithDeviceToken:) method, uncomment the call to didRegisterForRemoteNotifications(withDeviceToken:).
    1func application(_ application: UIApplication, 
    2    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    3    // Uncomment the code below to register your device token with the 
    4    // push notification manager
    5    //
    6        didRegisterForRemoteNotifications(deviceToken)
    7        ...
    8    }
    9    ...
  3. To log a debugger error if registration with Apple fails, add the following code to the application(_:didFailToRegisterForRemoteNotificationsWithError:) method.
    1func application(_ application: UIApplication, 
    2    didFailToRegisterForRemoteNotificationsWithError error: Error ) {
    3                        
    4    // Respond to any push notification registration errors here.
    5    SalesforceLogger.d(type(of:AppDelegate.self),
    6        message:"Failed to get token, error: \(error)")
    7    }
    8}

Add the Decryption Extension

  1. In the Project navigator, select the target where you modified AppDelegate.
  2. In Project settings, select Signing & Capabilities.
  3. Click + Capability and search for “Push Notifications”. Double-click to add the capability.
  4. Follow the steps at “Add a Service App Extension to Your Project” in Modifying Content in Newly Delivered Notifications at developer.apple.com/documentation.
  5. If you plan to test the extension with its own settings, you can accept the prompt to activate a scheme. Otherwise, click Cancel.
  6. Clone or download the github.com/forcedotcom/SalesforceMobileSDK-Templates repo.
  7. From the iOSNativeSwiftEncryptedNotificationTemplate/NotificationServiceExtension folder, replace the code in your new extension’s Swift file with the code from NotificationServiceExtension.swift.