> ## Documentation Index
> Fetch the complete documentation index at: https://moengage-doc-2315-external-css-font-urls.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 iOS Swift version 7.x.x?

> Fix push impression tracking and image rendering on iOS with Swift SDK 7.x.x. Check appgroupid configuration in your MoEngage project settings.

## Problem

Common issues with Push notifications, including Push Campaign impressions not being tracked and images not rendering even though Push notifications are successfully delivered to device with Swift version 7.x.x.

<Info>
  For Push Campaign impressions to be tracked, verify that the **Show iOS impressions** toggle on the MoEngage dashboard is turned on.

  <img src="https://mintcdn.com/moengage-doc-2315-external-css-font-urls/mB_fiYmQ7lqF7u9m/images/moengage_a3edc2.png?fit=max&auto=format&n=mB_fiYmQ7lqF7u9m&q=85&s=b82ee0000fd732f16671cc494c9fa840" alt="iOS imp.png" width="2744" height="1582" data-path="images/moengage_a3edc2.png" />
</Info>

## Solution

Perform the following steps:

1. **Check for app\_group\_id in your project’s main target for each configuration**:
   You can add the same app\_group\_id or different ones across configurations.
   <Info>
     If your configurations use different Bundle Identifiers but share the same app\_group\_id, issues may arise. Specifically, if two apps with different Bundle Identifiers but the same app\_group\_id are installed on the same device, the Notification Service Extension may fail.
     To avoid this, you can use the same app\_group\_id across multiple configurations, but be aware that you won't be able to test all apps simultaneously on a single device.
   </Info>
   <img src="https://mintcdn.com/moengage-doc-2315-external-css-font-urls/tb33LKE2EaDqvWEx/images/moengage_053674.png?fit=max&auto=format&n=tb33LKE2EaDqvWEx&q=85&s=8ce40ebc58d0850c028bda028c344b17" alt="app group.png" width="1920" height="709" data-path="images/moengage_053674.png" />
2. **Check for app\_group\_id during SDK initialization**:
   * If the SDK is initialized using info.plist, the APP\_GROUP\_ID key must be there inside the MoEngage key in your info.plist file.
   * If the SDK is initialized using sdkConfig, the APP\_GROUP\_ID must be in the sdkConfig variable inside the AppDelegate file.\
     **app\_group\_id in info.plist:**
     <img src="https://mintcdn.com/moengage-doc-2315-external-css-font-urls/Z3JKISsSAY-UpQIH/images/moengage_667e35.png?fit=max&auto=format&n=Z3JKISsSAY-UpQIH&q=85&s=53f6c1794cb9435463b73aab2c93c848" alt="app id.png" width="1920" height="888" data-path="images/moengage_667e35.png" />
     **app\_group\_id in sdkConfig variable:**
   ```swift Swift theme={null}
   var sdkConfig = MOSDKConfig.init(appID: "XXXXXXXXXXXXXXXX")
   sdkConfig.moeDataCenter = DATA\_CENTER\_0X
   sdkConfig.appGroupID = "group.com.XXXXXXXXXXXXXXXX"
   //if SDK initialized without sdkConfig in AppDelegate file
   MoEngage.setAppGroupID("group.com.moengage.MIPL567.demo")
   ```
   ```Objective-C Objective-C theme={null}
   MOSDKConfig\* sdkConfig = [[MOSDKConfig alloc] initWithAppID: @"XXXXXXXXXXXXXXXX"];
   sdkConfig.moeDataCenter = DATA\_CENTER\_0X;
   sdkConfig.appGroupID = @"group.com.XXXXXXXXXXXXXXXX";
   //if SDK initialized without sdkConfig in AppDelegate file
   [MoEngage setAppGroupID: @"group.com.XXXXXXXXXXXXXXXX"];
   ```
3. **Check for a Notification Service Extension Target**:
   * **Enable Push Notifications**: In the extension target's Signing & Capabilities section, make sure to enable Push Notifications and add the AppGroupId.
     <img src="https://mintcdn.com/moengage-doc-2315-external-css-font-urls/ek1Vn7ZU0if8mZjx/images/moengage_23f29a.png?fit=max&auto=format&n=ek1Vn7ZU0if8mZjx&q=85&s=9f86d4120166a985bdab3235dc40f77b" alt="enable.png" width="1920" height="706" data-path="images/moengage_23f29a.png" />
   * **Align the Minimum Deployment iOS Version**: Ensure that the minimum deployment iOS version of the Notification Service Extension matches the iOS version of the main app.
     <img src="https://mintcdn.com/moengage-doc-2315-external-css-font-urls/WxS3YZfik7eJr1oJ/images/moengage_cb3695.png?fit=max&auto=format&n=WxS3YZfik7eJr1oJ&q=85&s=a810e85ec75776413868c9e5f3993195" alt="support.png" width="1920" height="563" data-path="images/moengage_cb3695.png" />
4. Integrate the MORichNotification Framework into the Notification Service Extension target.
   ```swift Swift theme={null}
   target 'MoEngageDemo' do
     use_frameworks!
     pod 'MoEngage-iOS-SDK'
   end
   target 'MoEngageNotificationService' do
     use_frameworks! #use use_frameworks only if included in main target as in above scenario
     pod 'MORichNotification'
   end
   ```
5. NotificationService.swift file looks like this:
   ```swift Swift theme={null}
   import UserNotifications
   import MORichNotification
    
   class NotificationService: UNNotificationServiceExtension {
    
       var contentHandler: ((UNNotificationContent) - Void)?
       var bestAttemptContent: UNMutableNotificationContent?
    
       override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) - Void) {	
         MORichNotification.setAppGroupID("group.com.XXXXXXXXXXXXXXXX")
         self.contentHandler = contentHandler
         bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
         MORichNotification.handle(request, withContentHandler: contentHandler)
       }
       
       override func serviceExtensionTimeWillExpire() {
           // Called just before the extension will be terminated by the system.
           // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
           if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
               contentHandler(bestAttemptContent)
           }
       }
   }
   ```
6. **Check Build Phases for the Main App Target**: In the Build Phases section of the main app target, locate the Embed App Extensions / Embed Foundation Extensions section. Ensure that the **Copy only when installing** option is unchecked.

<img src="https://mintcdn.com/moengage-doc-2315-external-css-font-urls/ihIsaOZe9_SIMB6G/images/moengage_cfdd8e.png?fit=max&auto=format&n=ihIsaOZe9_SIMB6G&q=85&s=6fd0c3e87ce53e51d9ebee45bf884bc6" alt="copy.png" width="1920" height="652" data-path="images/moengage_cfdd8e.png" />

7. **Ensure Consistent appGroupId Across Configurations**: Verify that the appGroupId is consistent across all schemes and configurations (e.g. Debug/Release/QA/UAT) in the project.
8. **Align Build Configuration**: When running or archiving the project, ensure that the Build Configuration for the Main Target and Notification Service Extension Target points to the same scheme/configuration.

<img src="https://mintcdn.com/moengage-doc-2315-external-css-font-urls/iIKndxvjyfgN1Lcw/images/moengage_ef15c5.png?fit=max&auto=format&n=iIKndxvjyfgN1Lcw&q=85&s=4d0ba3346548caf7ea71900305e4cb82" alt="run.png" width="1750" height="556" data-path="images/moengage_ef15c5.png" />

<img src="https://mintcdn.com/moengage-doc-2315-external-css-font-urls/AeBdxtJ_M_DsQv_B/images/moengage_7a3664.png?fit=max&auto=format&n=AeBdxtJ_M_DsQv_B&q=85&s=3cb7d923240a755a25a591ea3366e5aa" alt="build.png" width="1832" height="446" data-path="images/moengage_7a3664.png" />
