Flutterfire: [firebase_messaging] Add support for handling messages in background for iOS

Created on 27 Aug 2019  路  18Comments  路  Source: FirebaseExtended/flutterfire

Based on upcoming implementation for handling messages in background for Android (see #38 ), the iOS platform deserves the same functionality.

Linked issues:

crowd messaging enhancement

Most helpful comment

This seems like a pretty highly requested feature. I'm currently also struggling because of this missing feature. Do we have an estimation on when we can expect this?

Also is there anyone that has been able to get around this? So handling silent notifications when app is in background or terminated on iOS.

All 18 comments

How about using the NotificationServiceExtension (native code) with firebase_messaging?

Using Notification Service Extension is one way to do it, yes.

Flutter is excellent framework that allows to build and ship beautiful UI in bizarre speed. However does this mean it provides everything we want (from our perspective)? No. Does this mean we have drop Flutter and use SwiftUI (buggy) or storyboards? No.

We made decision to use Flutter for UI and we are handling pretty much all business logic there except when it comes to push notifications and some other minor features as well - this is what you are better of rolling your own.

Implementing Notification Service Extension and making it work with Flutter is matter of a few hours and considering how many fail to do so is somewhat amusing but not shocking considering the entry level.

We did use Notification Service Extension with Notification Content Extension for fancier notifications for some months but at the end we dropped it and moved to PushKit (w/ CallKit obviously) and rolled our own notification presenter logic which resulted us dropping both Notification Service and Content Extension.

My advice for those who need to add push notifications support for Flutter - solve it on native side, you will thank yourself later.

How about using the NotificationServiceExtension (native code) with firebase_messaging?

I did it and it is working well!

How about using the NotificationServiceExtension (native code) with firebase_messaging?

I did it and it is working well!

Mind providing a gist on how you solved it? :)

How about using the NotificationServiceExtension (native code) with firebase_messaging?

I did it and it is working well!

Mind providing a gist on how you solved it? :)

Just follow the steps bellow:

1 - Follow this tutorial to configure firebase_messaging Push notification with firebase cloud messaging(FCM)

2 - On XCode, create the NotificationServiceExtension to do the background work

3 - Use something like Postman or Curl to do a request like that:

curl --location --request POST 'https://fcm.googleapis.com/fcm/send' \
--header 'Content-Type: application/json' \
--header 'Authorization: key=' \
--data-raw '{
"to": "",
"notification": {
"title": "My title",
"body": "That's the body",
"mutable_content": true
},
"data": {
"magicValue": "It is really a magic value?"
}
}'

How about using the NotificationServiceExtension (native code) with firebase_messaging?

I did it and it is working well!

Could you explain how to do that? can You give us a snipplets o something else?
Can you give us an example of

2 - On XCode, create the NotificationServiceExtension to do the background work

How about using the NotificationServiceExtension (native code) with firebase_messaging?

I did it and it is working well!

Mind providing a gist on how you solved it? :)

Just follow the steps bellow:

1 - Follow this tutorial to configure firebase_messaging Push notification with firebase cloud messaging(FCM)

2 - On XCode, create the NotificationServiceExtension to do the background work

3 - Use something like Postman or Curl to do a request like that:

curl --location --request POST 'https://fcm.googleapis.com/fcm/send'
--header 'Content-Type: application/json'
--header 'Authorization: key='
--data-raw '{
"to": "",
"notification": {
"title": "My title",
"body": "That's the body",
"mutable_content": true
},
"data": {
"magicValue": "It is really a magic value?"
}
}'

I want to implement a background execution to save some notification information on my local DB. Notification Service Extension is the way to go? Now I'm trying to override "didReceiveRemoteNotification" on my AppDelegate class (inherited from FlutterAppDelegate) without sucess.
I did this:

` override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let notificationChannel = FlutterMethodChannel(name: "br.uff.uffmobileplus/notification_channel", binaryMessenger: controller as! FlutterBinaryMessenger)

        notificationChannel.invokeMethod("saveToDataBase", arguments: userInfo)
    completionHandler(UIBackgroundFetchResult.newData)

}`

But it's not working since the previous override (didFinishLaunchingWithOptions) is the only one that runs and the didReceiveRemoteNotification is not called when the app receives a push notification on background.

How about using the NotificationServiceExtension (native code) with firebase_messaging?

I did it and it is working well!

Mind providing a gist on how you solved it? :)

Just follow the steps bellow:
1 - Follow this tutorial to configure firebase_messaging Push notification with firebase cloud messaging(FCM)
2 - On XCode, create the NotificationServiceExtension to do the background work
3 - Use something like Postman or Curl to do a request like that:

curl --location --request POST 'https://fcm.googleapis.com/fcm/send'
--header 'Content-Type: application/json'
--header 'Authorization: key='
--data-raw '{
"to": "",
"notification": {
"title": "My title",
"body": "That's the body",
"mutable_content": true
},
"data": {
"magicValue": "It is really a magic value?"
}
}'

I want to implement a background execution to save some notification information on my local DB. Notification Service Extension is the way to go? Now I'm trying to override "didReceiveRemoteNotification" on my AppDelegate class (inherited from FlutterAppDelegate) without sucess.
I did this:

`
override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let notificationChannel = FlutterMethodChannel(name: "br.uff.uffmobileplus/notification_channel", binaryMessenger: controller as! FlutterBinaryMessenger)

        notificationChannel.invokeMethod("saveToDataBase", arguments: userInfo)
    completionHandler(UIBackgroundFetchResult.newData)

}

`

But it's not working since the previous override (didFinishLaunchingWithOptions) is the only one that runs and the didReceiveRemoteNotification is not called when the app receives a push notification on background.

You need to follow the steps I said. Use NotificationServiceExtension. If you need to communicate with your flutter app, use platform channels.

How about using the NotificationServiceExtension (native code) with firebase_messaging?

I did it and it is working well!

Mind providing a gist on how you solved it? :)

Just follow the steps bellow:
1 - Follow this tutorial to configure firebase_messaging Push notification with firebase cloud messaging(FCM)
2 - On XCode, create the NotificationServiceExtension to do the background work
3 - Use something like Postman or Curl to do a request like that:

curl --location --request POST 'https://fcm.googleapis.com/fcm/send'
--header 'Content-Type: application/json'
--header 'Authorization: key='
--data-raw '{
"to": "",
"notification": {
"title": "My title",
"body": "That's the body",
"mutable_content": true
},
"data": {
"magicValue": "It is really a magic value?"
}
}'

I want to implement a background execution to save some notification information on my local DB. Notification Service Extension is the way to go? Now I'm trying to override "didReceiveRemoteNotification" on my AppDelegate class (inherited from FlutterAppDelegate) without sucess.
I did this:
`
override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let notificationChannel = FlutterMethodChannel(name: "br.uff.uffmobileplus/notification_channel", binaryMessenger: controller as! FlutterBinaryMessenger)

        notificationChannel.invokeMethod("saveToDataBase", arguments: userInfo)
    completionHandler(UIBackgroundFetchResult.newData)

}

`
But it's not working since the previous override (didFinishLaunchingWithOptions) is the only one that runs and the didReceiveRemoteNotification is not called when the app receives a push notification on background.

You need to follow the steps I said. Use NotificationServiceExtension. If you need to communicate with your flutter app, use platform channels.

I tried but I couldn't use the channel created on AppDelegate inside the NotificationServiceExtension target, and to create a channel I need a controller that needs the window from UIAplication. At least that's what I've found.

FYI for anyone ending up here when trying to setup silent data notifications (a.k.a. content-available).

The workarounds mentioned in this thread are not required for those kinds of notifications. If all you want is for your app to be able to receive key/value data and update some remote data in the background, you will be ok following something like this SO question:
Firebase FCM silent push notifications for iOS

Correct me if I am wrong...
This is a discussion about receiving notifications that go outside of that "normal" iOS notification concept. Correct? E.g.

  • you need long-running background processing
  • you want to get notifications even though the app was killed (which stops background notifications on purpose in iOS)

FYI for anyone ending up here when trying to setup silent data notifications (a.k.a. content-available).

The workarounds mentioned in this thread are not required for those kinds of notifications. If all you want is for your app to be able to receive key/value data and update some remote data in the background, you will be ok following something like this SO question:
Firebase FCM silent push notifications for iOS

Correct me if I am wrong...
This is a discussion about receiving notifications that go outside of that "normal" iOS notification concept. Correct? E.g.

  • you need long-running background processing
  • you want to get notifications even though the app was killed (which stops background notifications on purpose in iOS)

Yes I'm trying to set up a background execution when a data notification arrives. Using the silent notification I was able to execute when app on foreground or background but not when app was killed( which is the expected behavior from what I saw) then how can I handle for all the 3 cases?

If all you want is for your app to be able to receive key/value data and update some remote data in the background, you will be ok following something like this SO question:
Firebase FCM silent push notifications for iOS

@eimermusic are you saying that the plugin currently supports receiving and processing silent pushes in the background on iOS? I have not been able to do that with the onBackgroundMessage callback.

This seems like a pretty highly requested feature. I'm currently also struggling because of this missing feature. Do we have an estimation on when we can expect this?

Also is there anyone that has been able to get around this? So handling silent notifications when app is in background or terminated on iOS.

In the meantime. I've found that work is being done to address this in this PR #2016 However I've not been able to get that one to work for me.

I have been able to get PR #2016 to work for me. Apparently it's hit and miss. Worth a shot if this issues means a dead end for the plugin for you.

This seems like a pretty highly requested feature. I'm currently also struggling because of this missing feature. Do we have an estimation on when we can expect this?

Also is there anyone that has been able to get around this? So handling silent notifications when app is in background or terminated on iOS.

Did you succeed in this? I'm also trying hard to get silent content-available only push to reach my ios app and get some execution time while the app is in the background or terminated state.

Anything I can do here? @michaelgobbers

Hello,
Im new with flutter and I was trying to setup background notifications for IOS ? for me it only works on Android. is this not supported ? if so, are there plans to make this available ?

Unhandled Exception: MissingPluginException(No implementation found for method FcmDartService#start on channel plugins.flutter.io/firebase_messaging)

Hey all, this is now supported in the current dev release, along with macOS platform support landing as well (See the migration guide doc for a full changelog and how to upgrade).

For discussions/feedback around trying out this dev release please see https://github.com/FirebaseExtended/flutterfire/discussions/4023 - would love feedback.

Was this page helpful?
0 / 5 - 0 ratings