Skip to content

Troubleshooting

Ivan Krešić edited this page Apr 28, 2026 · 2 revisions

Troubleshooting

NSE Not Working / Delivery Reports Not Received

The Notification Service Extension (NSE) handles delivery reports and rich push content. If these aren't working, the issue is almost always signing or entitlements.

Symptoms:

  • Push notifications arrive but delivery reports show 0% in the Infobip portal
  • Rich media (images) not showing on notifications

Check these in order:

  1. NSE is included in the build -- open the .ipa (rename to .zip and extract) and verify InfobipNotificationServiceExtension.appex exists inside the .app bundle.

  2. App Groups match -- the main app and NSE must share the exact same App Group ID. Verify in Xcode under Signing & Capabilities for both targets. The group ID must also match the com.mobilemessaging.app_group value in your main app's Info.plist.

  3. NSE provisioning profile has App Groups -- the NSE App ID on the Apple Developer Portal must have the App Groups capability enabled. EAS managed credentials handle this automatically; manual credentials require explicit setup (see EAS Setup - Manual Credentials).

  4. aps-environment matches build type -- iosMode: 'development' for development builds, iosMode: 'production' for Ad Hoc/App Store. A mismatch causes silent push failures.

  5. Check NSE logs -- connect the device, open Console.app, filter by process InfobipNotificationServiceExtension. Look for:

    • "Could not start notification extension. ApplicationCode not found in keychain." -- the main app hasn't synced credentials to the shared keychain yet. Launch the main app at least once after install.
    • No logs at all -- the NSE is not being invoked. Check signing and entitlements.

pod install Fails

Version Conflicts

[!] CocoaPods could not find compatible versions for pod "MobileMessaging"

The nseVersion plugin prop must match the MobileMessaging version used by infobip-mobile-messaging-react-native-plugin. Check the RN plugin's podspec for the pinned version:

grep MobileMessaging node_modules/infobip-mobile-messaging-react-native-plugin/*.podspec

Set nseVersion to match:

["infobip-mobile-messaging-expo-plugin", { "nseVersion": "15.0.0" }]

Deployment Target Mismatch

[!] The platform of the target `InfobipNotificationServiceExtension` (iOS 13.0) is not compatible

The Infobip SDK requires iOS 15.0+. Ensure iosDeploymentTarget is '15.0' or higher (this is the default).

use_frameworks! Issue (Expo SDK 55)

Expo SDK 55 projects using use_frameworks! may encounter pod install failures. This is a known compatibility issue between use_frameworks! and certain native module configurations.

Workaround: If you're using expo-build-properties to set useFrameworks:

[
  "expo-build-properties",
  {
    "ios": {
      "useFrameworks": "static"
    }
  }
]

Ensure the Infobip plugin is listed after expo-build-properties in your plugins array.


Manifest Merger Errors on Android

tools:replace Conflict

Manifest merger failed: Attribute application@allowBackup value=(true)
is also present at [com.infobip:...] value=(false)

The Infobip Android SDK sets android:allowBackup="false" and android:enableOnBackInvokedCallback="true", which conflict with Expo defaults. The plugin automatically adds tools:replace attributes to resolve this. If you still see this error:

  1. Run npx expo prebuild --clean to regenerate from scratch
  2. Verify the plugin is in your app.json plugins array
  3. Check that no other plugin is removing the tools:replace attribute

Other Manifest Conflicts

The Infobip SDK auto-merges permissions, services, and receivers via the Android manifest merger. If another SDK declares conflicting attributes, you may need to add additional tools:replace entries. See the Android manifest merger documentation.


Expo Go Incompatibility

Expo Go does not support config plugins. The Infobip plugin modifies native code at prebuild time -- Expo Go uses a pre-built binary that cannot include these changes.

To develop with Infobip push notifications, use a development build:

npx expo install expo-dev-client
eas build --profile development --platform ios
# or
npx expo run:ios

If you see errors like MobileMessaging module not found or push registration fails silently, confirm you're running a development build and not Expo Go.


Multiple Push SDK Conflicts

expo-notifications Coexistence

expo-notifications and the Infobip SDK can coexist for local notifications, but for remote push notifications you should use only one provider.

If both are installed:

  • iOS: Both SDKs register for push tokens. The aps-environment entitlement is shared (last plugin in the plugins array wins). Place Infobip after expo-notifications in the plugins array.
  • Android: Both register a Firebase messaging service. Android routes com.google.firebase.MESSAGING_EVENT to only one service. The Infobip SDK's MobileMessagingFirebaseService may not receive events if another service claims them first.

Recommendation: If using Infobip for push, remove expo-notifications remote push setup and use Infobip's API for all remote notifications. expo-notifications can still be used for local notifications.

Other Push SDKs (OneSignal, CleverTap, etc.)

iOS NSE conflict: iOS invokes only one Notification Service Extension per notification. If another SDK creates its own NSE target, only one will be active. To support both, use a custom NSE file (iosNSEFilePath prop) that delegates to both SDKs:

override func didReceive(_ request: UNNotificationRequest,
                         withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    if MobileMessagingNotificationServiceExtension.isCorrectPayload(request.content.userInfo as? [String: Any] ?? [:]) {
        MobileMessagingNotificationServiceExtension.didReceive(request, withContentHandler: contentHandler)
    } else {
        // Delegate to the other SDK's NSE handler
        OtherSDK.didReceive(request, withContentHandler: contentHandler)
    }
}

Android: Multiple Firebase messaging services can coexist if each checks the payload and passes through unrecognized messages. The Infobip SDK already does this.


prebuild --clean After Config Changes

After changing plugin props in app.json, always run:

npx expo prebuild --clean

A regular npx expo prebuild (without --clean) may not re-apply all changes because some modifications use createFileIfNoneExists and skip files that already exist. The --clean flag deletes the ios/ and android/ directories and regenerates them from scratch.

This applies to changes like:

  • Switching iosMode between 'development' and 'production'
  • Changing iosAppGroup or iosAppGroupSuffix
  • Enabling/disabling enableNotificationExtension
  • Changing deepLinkScheme

Common Error Reference

graph TD
    E1["No provisioning profile for<br/>*.InfobipNotificationServiceExtension"]
    S1["Create NSE App ID and profile<br/>See EAS Setup"]

    E2["ApplicationCode not found<br/>in keychain"]
    S2["Launch main app once after install<br/>to sync credentials"]

    E3["google-services.json not found"]
    S3["Add googleServicesFile to app.json<br/>or googleServicesFilePath to plugin props"]

    E4["MobileMessaging module not found"]
    S4["You're in Expo Go<br/>Use a development build"]

    E5["CocoaPods version conflict"]
    S5["Match nseVersion to RN plugin's<br/>MobileMessaging version"]

    E1 --> S1
    E2 --> S2
    E3 --> S3
    E4 --> S4
    E5 --> S5
Loading

If your issue isn't covered here, check the React Native plugin wiki for SDK-level troubleshooting.