Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[firebase_messaging] Add support for handling messages in background for iOS #47

Closed
genert opened this issue Aug 27, 2019 · 18 comments
Closed
Labels
impact: crowd Affects many people, though not necessarily a specific customer with an assigned label. (P2) plugin: messaging type: enhancement New feature or request

Comments

@genert
Copy link

genert commented Aug 27, 2019

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

Linked issues:

@tulioccalazans
Copy link

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

@genert
Copy link
Author

genert commented Mar 6, 2020

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.

@tulioccalazans
Copy link

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

I did it and it is working well!

@McLive
Copy link

McLive commented Mar 6, 2020

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? :)

@tulioccalazans
Copy link

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=<server_key>'
--data-raw '{
"to": "<your_FCM_device_token>",
"notification": {
"title": "My title",
"body": "That's the body",
"mutable_content": true
},
"data": {
"magicValue": "It is really a magic value?"
}
}'

@campioncino
Copy link

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

@ronaldmaymone
Copy link

ronaldmaymone commented Apr 30, 2020

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=<server_key>'
--data-raw '{
"to": "<your_FCM_device_token>",
"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.

@tulioccalazans
Copy link

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=<server_key>'
--data-raw '{
"to": "<your_FCM_device_token>",
"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.

@ronaldmaymone
Copy link

ronaldmaymone commented Apr 30, 2020

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=<server_key>'
--data-raw '{
"to": "<your_FCM_device_token>",
"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.

@eimermusic
Copy link

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)

@ronaldmaymone
Copy link

ronaldmaymone commented May 19, 2020

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?

@isaiahtaylorhh
Copy link

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.

@michaelgobbers
Copy link

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.

@michaelgobbers
Copy link

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.

@isaiahtaylorhh
Copy link

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.

@krishnakumarcn
Copy link

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

@cgonzalezandrades
Copy link

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)

@Salakar
Copy link
Member

Salakar commented Nov 3, 2020

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 #4023 - would love feedback.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
impact: crowd Affects many people, though not necessarily a specific customer with an assigned label. (P2) plugin: messaging type: enhancement New feature or request
Projects
None yet
Development

No branches or pull requests