> ## Documentation Index
> Fetch the complete documentation index at: https://moengage-unity-sdk-initialization-split.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# How to Avoid Common Push Notification Issues on iOS Devices Using Native iOS, Swift, and MoEngage-iOS-SDK (Versions 7.x.x , 8.x.x, 9.x.x)?

> Troubleshoot iOS push notification delivery, deep linking, and rich landing issues with Native iOS Swift and MoEngage SDK versions 7.x.x to 9.x.x.

## 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 Swift theme={null}
     //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 Swift theme={null}
     class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
     }
     ```
4. **Disable MoEngage Proxy**:
   * Add MoEngageAppDelegateProxyEnabled key in info.plist with the value Boolean = False/NO
     <img alt="boolean.png" src="https://mintcdn.com/moengage-unity-sdk-initialization-split/B-H8ECfEYu6COfPW/images/moengage_35b69f.png?fit=max&auto=format&n=B-H8ECfEYu6COfPW&q=85&s=150fb920bf9f7e04e95b6a90a23fc556" width="1958" height="570" data-path="images/moengage_35b69f.png" />
5. **Pass Push Notification Token Manually**:
   * Use the didRegisterForRemoteNotificationsWithDeviceToken function of AppDelegate.swift to pass the push notification token manually.
     ```swift Swift theme={null}
     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 Swift theme={null}
     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)
     }
     ```
