Flutter Firebase Messaging Not working on IOS when app running in background or closed

Viewed 36412

I have configured firebase Cloud Messaging with flutter Notification are working in foreground. but not working when running in background or app is killed.

Following steps are done.

Also tried to remove following line as suggested on Flutter Firebase Cloud Messaging - Notification when app in background but it is still not working.

if (@available(iOS 10.0, *)) { [UNUserNotificationCenter currentNotificationCenter].delegate = (id) self; }

Flutter Doctor

[✓] Flutter (Channel beta, v1.12.13+hotfix.6, on Mac OS X 10.14.5 18F132, locale en-IN)

[✗] Android toolchain - develop for Android devices

    ✗ Unable to locate Android SDK.

      Install Android Studio from: https://developer.android.com/studio/index.html

      On first launch it will assist you in installing the Android SDK components.

      (or visit https://flutter.dev/setup/#android-setup for detailed instructions).

      If the Android SDK has been installed to a custom location, set ANDROID_HOME to that location.

      You may also want to add it to your PATH environment variable.



[✓] Xcode - develop for iOS and macOS (Xcode 11.3)

[✓] Chrome - develop for the web

[!] Android Studio (not installed)

[✓] Connected device (3 available)

One thing I noticed that , when app is installed first time it is not asking me to check if the I allow the app to send push notification.

My code is having following lines on page after login page.

_firebaseMessaging.requestNotificationPermissions(
        const IosNotificationSettings(sound: true, badge: true, alert: true));
    _firebaseMessaging.onIosSettingsRegistered
        .listen((IosNotificationSettings settings) {
      print("Settings registered: $settings");
    });

Also cross checked that all following setting are ticked.

enter image description here

8 Answers

After a long time searching for a fix, this solved the problem for me:

  1. In your info.plist:

     FirebaseAppDelegateProxyEnabled: false
    
  2. Add this to your AppDelegate:

    override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    
       Messaging.messaging().apnsToken = deviceToken
       super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
     }
    

My Solution is as follows and it works.

publspec.yaml

firebase_messaging: ^6.0.9

Remove following line from ios/runner/AppDelegate.m or ios/runner/AppDelegate.swift if used.

if (@available(iOS 10.0, *)) {
  [UNUserNotificationCenter currentNotificationCenter].delegate = (id<UNUserNotificationCenterDelegate>) self;
 }

in Dart code use provisional false, Should get pop up to confirm on notification.

myFirebaseMessagingService.requestNotificationPermissions(
        const IosNotificationSettings(
            sound: true, badge: true, alert: true, provisional: false));

In Xcode Following Push notification along with background Fetch and remote notification.

enter image description here

There is nothing to change or add in AppDelegate and Info.plist, just provide the correct notification payload and it will trigger:

sample valid payload

{
  "to" : "my_fcm_token",
  "notification" : {
 "body" : "sample body",
 "OrganizationId":"2",
 "content_available" : true,
 "mutable_content": true,
 "priority" : "high",
 "subtitle":"sample sub-title",
 "Title":"hello"
 },
  "data" : {
    "msgBody" : "Body of your Notification",
    "msgTitle": "Title of your Notification",
    "msgId": "000001",
    "data" : "This is sample payloadData"
  }
}

I managed to get my app working and listening to onBackgroundMessage on Android (I just removed the notification object from my payload, leaving only the data object).

    final data = {
  "registration_ids": userToken,
  "click_action": "FLUTTER_NOTIFICATION_CLICK",
  "priority": "high",
  "collapse_key": "type_a",
  "data": {
    "click_action": "FLUTTER_NOTIFICATION_CLICK",
    "other_data": "any message",
    "title": 'NewTextTitle',
    "body": 'NewTextBody',
    "priority": "high",
    "click_action": "FLUTTER_NOTIFICATION_CLICK",
  },
};

In my case Team ID from apple developer account in Firebase Project settings for iOS app was incorrect

In my case, I solved it as below.

Complete the tutorial guide and try the following:

  • Edit : iOS/Flutter/AppFrameworkInfo.plist

    • <key>CFBundleIdentifier</key> <string>{bundleIdentifier}.flutter</string>
    • {bundleIdentifier} is: Enter the Bundle name set at https://developer.apple.com.
  • Example

    • Developer.apple: com.example.app
    • xcode BundleIdentifier : com.example.app
    • iOS/Flutter/AppFrameworkInfo.plist : com.example.app.flutter
  • Test environment :

    • Firebase_core: ^0.4.5
    • Firebase_messaging: ^6.0.16
  • (Additional) When sending from your server or page

    • Please set the "notification" item.
Related