Skip to main content

Problem

Common issues with Push notifications, including failed delivery, screen navigation, deep linking, and rich landing, are occurring on iOS devices using Native iOS, Swift, and MoEngage-iOS-SDK (Versions 7.x.x, 8.x.x, 9.x.x).

Solution

Perform the following steps:
  1. Firebase Proxy:
    • If you are not using Firebase push notifications, then disable the Firebase proxy by adding the FirebaseAppDelegateProxyEnabled key in info.plist with the value Boolean = False/NO.
    • Test the push notification. If successful, no further action is required. Otherwise, follow the steps below.
    • If you are using Firebase push notifications, skip this step and proceed with the following steps.
  2. Set UNUserNotificationCenterDelegate:
    • In AppDelegate.swift, set UNUserNotificationCenterDelegate in the didFinishLaunch method.
    • If you are initializing Firebase in didFinishLaunch, do so before initializing the MoEngage SDK.
    • Ensure UNUserNotificationCenterDelegate is set at the start of this method.
      Swift
      //7.xx
      import MoEngage
      //8.xx //9.xx
      import MoEngageSDK
      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) - Bool {
        
        UNUserNotificationCenter.current().delegate = self
        
        FIRApp.configure() //Firebase configuration - syntax could differ according to versions
        //MoEngage Initializatoin - use specific version code only
        
        //7.xx version with sdkConfig
        var sdkConfig = MOSDKConfig.init(appID: "XXXXXXXXXXXXXXXX")
        sdkConfig.moeDataCenter = DATA_CENTER_0X
        sdkConfig.appGroupID = "group.com.XXXXXXXXXXXXXXXX"
        #if DEBUG
            MoEngage.sharedInstance().initializeTest(with: sdkConfig, andLaunchOptions: launchOptions)
        #else
            MoEngage.sharedInstance().initializeLive(with: sdkConfig, andLaunchOptions: launchOptions)
        #endif
        
        //8.xx version with sdkConfig
        var sdkConfig = MOSDKConfig.init(withAppID: "XXXXXXXXXXXXXXXX")
        sdkConfig.enableLogs = true
        sdkConfig.moeDataCenter = .data_center_0X 
        sdkConfig.appGroupID = "group.com.XXXXXXXXXXXXXXXX"
        #if DEBUG
          MoEngage.sharedInstance().initializeDefaultTestInstance(with: sdkConfig, andLaunchOptions: launchOptions)
        #else
          MoEngage.sharedInstance().initializeDefaultLiveInstance(with: sdkConfig, andLaunchOptions: launchOptions)
        #endif
        //9.xx version with sdkConfig
        var sdkConfig = MoEngageSDKConfig.init(appId: "XXXXXXXXXXXXXXXX", dataCenter: .data_center_0X)
        sdkConfig.enableLogs = true
        sdkConfig.appGroupID = "group.com.XXXXXXXXXXXXXXXX"
        #if DEBUG
          MoEngage.sharedInstance.initializeDefaultTestInstance(sdkConfig)
        #else
          MoEngage.sharedInstance.initializeDefaultLiveInstance(sdkConfig)
        #endif
        
        // Rest of the implementation related to developer's app
        return true
      }
      
  3. Extend AppDelegate.swift:
    • Extend AppDelegate.swift to conform to UNUserNotificationCenterDelegate. Your AppDelegate.swift must resemble the following code snippets:
      Swift
      class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
      }
      
  4. Disable MoEngage Proxy:
    • Add MoEngageAppDelegateProxyEnabled key in info.plist with the value Boolean = False/NO boolean.png
  5. Pass Push Notification Token Manually:
    • Use the didRegisterForRemoteNotificationsWithDeviceToken function of AppDelegate.swift to pass the push notification token manually.
      Swift
      func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        //7.xx version
        MoEngage.sharedInstance().setPushToken(deviceToken)
        //8.xx version
        MOMessaging.sharedInstance.setPushToken(deviceToken)
        //9.xx version
        MoEngageSDKMessaging.sharedInstance.setPushToken(deviceToken)
      }
      
  6. Implement UNUserNotificatoinCenter Delegate Functions:
    • Ensure UNUserNotificatoinCenter Delegate functions are implemented in AppDelegate.swift.
      Swift
      func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) - Void) {
        //This is to only to display Alert and enable notification sound
        if #available(iOS 14.0, *) {
          completionHandler([.sound,.alert, .banner, .list])
        } else {
          completionHandler([.sound,.alert])
        }
      }
      func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () - Void) {
        //7.xx version
        MoEngage.sharedInstance().userNotificationCenter(center, didReceive: response)
        
        //8.xx version
        MOMessaging.sharedInstance.userNotificationCenter(center, didReceive: response)
        
        //9.xx version
        MoEngageSDKMessaging.sharedInstance.userNotificationCenter(center, didReceive: response)
      }