iOS Push notification using Firebase - ios

I am working in a project where I need to show notifications fired by Firebase. Everything works fine with the send and receive flow. But I need to customise the notification before showing it, i.e., when the app is in background. Because the message I receive from our server it's already Base64 encoded. And therefore the notification displays a long string that my petrify the users.
Is there any delegate or something which I can use to modify the received data before presenting it when the app is in background?

Currently there is no way in iOS to do that. Please refer to this answer for more details How to change how a remote notification is presented before presentation?

You can use these following in your project to handle any data.
Works only for iOS 10.2 or greater
UNNotificationServiceExtension
UNNotificationContentExtension
Go through this link - https://medium.com/#prianka.kariat/ios-10-notifications-with-attachments-and-much-more-169a7405ddaf
As i have limited time please let me know if you need more explanation on this.
Debugging is also a tricky part in this First you go through this then try to debug by GO to DEBUG -> Attach to process by pid and paste your extension name you added.

Related

Modify Notification data before displaying to user in iOS

I have an app in which I am using an FCM notification when there is an event from server.
I want to get the notification data and update the message from one of the parameter from Notification Payload when app is in background, foreground or killed.
I have tried to use Silent Push Notification with Content Available but when my app is killed, then I am unable to receive callback in my App delegate.
I have tried lots of links from StackOverflow but could not get the perfect suggestion.
If you find duplicate, then please provide me the link but solution with different iOS (12,13,14,15) versions.
My problem is just like this Stack Link
It sounds like what you want is a Notification Service Extension. This is a separate binary (packaged with your app) that can run when a notification is received. Your extension can intercept the push-notification payload, and modify it, so that other things can be displayed.
https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension
This is also really good, too.
https://www.raywenderlich.com/8277640-push-notifications-tutorial-for-ios-rich-push-notifications

Flutter Firebase how to control notification not to show when the app is in foreground

I had a flutter app with a chat room feature. Firebase messaging is used to push remote notification. I want to hide the notification popup if the app is at foreground and it happens to be at the exact chat room where that coming notification belongs to.
This is a common behavior when you're chatting with someone. The message appends to chat room directly instead of popup.
My question is how to interfere the remote notification on receiving? I used onMessage callback on notification received event. But it always popups no matter the app is at foreground or background or termiated.
In firebase React Native version, it has an onNotification callback which does exactly what I want. But there is no equivalence for flutter. My research leads me to send Data and Notification type of message. In such a way, I need to keep app status synchronized with my backend server (Am I right?).
Any help or suggestion is welcome. Thank you.
P.S. firebase_messaging 8.0.0-dev.10
Update:
As mentioned by op, the problem was fixed when using to the latest stable version (7.0.3). Then the cause is a bug in the new dev release.
Related GitHub issue, Link
Original Answer:
Judging by the issues that you described, the problem that you are running into might be because you are on the dev channel.
Did you try to use the latest stable? (7.0.3 at the time of writing). It might be a bug in the dev channel.
If the problem persists, try sending a data message instead of the notification message. This will stop firebase from sending a notification on the device. But be aware that you will have to display a notification manually. This way you will have control over the display of the notifications based on the screen and wouldn't have to keep the state in sync with the server as you were mentioning.
But this might not work on iOS since according to the docs, onMessage() will be triggered when the app becomes in foreground.
Check the link above for more details on how the notification message and the data message gets handled on both Android and iOS.
If your onMessage does not have code to handle the notifications, then they shouldn't appear.
If You want to convert your onMessage notification, in a overlay or In App Notification then it would be better.
I was also facing the same Issue for showing the notification, and found a workaround for that, We can show the In App Notifications in our App
Instead of showing the notification code in your onMessage method, you can show a overlay, like instagram shows on the top when a notification arrives,
And to append the message to direct chat room, I used some backend help.
onMessage: (Map<String, dynamic> message) async {
showOverlayNote(message);
},
And now you can show the overlay as
showOverlayNote(message){
//your code here for showing the overlay
}
You Can get a Detail on how to use overlay for In App Notificaions from this link
This guy have explained the use of this In App Notifications better, So Please see the above link.
You're thinking about it from the wrong angle. Firebase messaging is always going to trigger your onMessage, it's up to you how you handle that internally.
I'd suggest using a state manager - Mobx, ChangeNotifier, a file, whatever - to keep track of what screen the user is on. When the user enters your chat screen, write that to your state manager (also "un-write" that upon your dispose() method if necessary).
Then, in the method that handles onMessage, check for the user's current screen. If they're on the chat screen then exit, if not, execute the overlay.

What are the requirements for FCM to work with Flutter on iOS?

I am working on getting Firebase Cloud Messaging to work with iOS via Flutter. I have followed the steps laid out here, here, and and here with no luck.
I am NOT using simulator, I am on an iPhone 8+ with iOS 11.4.1. I have installed all three APN certs in Firebase console. I have called FirebaseMessaging.requestNotificationPermissions(); and accepted the dialog. I am testing by sending messages through FCM console. I have my phone auth'd with Firebase (anonymous auth).
I do not receive messages with the app open or closed.
If anyone has any thoughts on what I might be missing, please assist. I would like to be able to make a bulletpoint list for others coming to Flutter/iOS/FCM to just follow without errors.
Alright, this is what I learned. Wish I had written this all down right when I got it working. But it should be helpful to someone.
Make sure Firebase is setup and working in your Flutter project.
Add firebase_messaging to pubspec.yaml
flutter packages get
Create/download your APNS key and upload it to Firebase console
Create/download your Provisioning Profile on Apple Dev website and double-click to install.
Use the important pieces of the snippet below
Send a message to all app users, or your messagingToken through Firebase console.
If you have a physical device running your app and you follow these steps, you should receive background notifications. You will not receive them in the foreground. If someone figures out how to get them in the foreground, let me know!
snippet
import 'package:firebase_messaging/firebase_messaging.dart';
FirebaseMessaging messaging = FirebaseMessaging();
messaging.configure(); // NECESSARY
messagingToken = await fb.messaging.getToken();
messaging.subscribeToTopic("general");
// this will launch a modal asking if you want to receive notifications
messaging.requestNotificationPermissions();
Sounds like you are missing some configuration steps in order to be able to send push notifications to your iOS App. Maybe the best that you can do is post more information about your configuration environment.
However, for the description that you give us, it can be an issue about one of the following options:
You need to configure the correct environment to send the push notification. If you install the app to the device directly from Xcode you need to use the Sandbox environment, but if your app is installed from AppStore or Testflight, you need to use Production. This is because both environment (sandbox and production) refers to different urls to send the push notification.
The deviceId related to the specific relation between your app and the current device is not stored. Remember, when you send a push notification you need to give which devices will receive that notification.
Please let me know if this responds your question or there is some that I've missing
EDIT
To handle foreground notifications you need to add the didReceiveRemoteNotification callback in order to get the title, message all the custom parameters of the JSON structure.
In this particular case, the plugin documentation says that you need three different callbacks, depending on the application status.
If the app is in FOREGROUND you need to use onMessage callback
If the app is in BACKGROUND you need to use onResume callback
If the app is TERMINATED you need to use onLaunch callback
However, this only make the parameters info available, you still needs to show them to the user in some custom way (for example WhatsApp or Facebook Messenger can show you the new chat message if you are in a different conversation as a independent bubble on top of the view, or this new message is added to the bottom of the conversation if it belongs to the current chat).

Handle Push Notification when the App is off, or without opening the App at all - iOS

I'm building a Push Notification platform with Amazon SNS, using Amazon Cognito and other Amazon AWS tools, so far working flawlessly.
But my App is multi-language, so I'm trying to send just 1 single push message with a dictionary within the payload, this dictionary will contain an array with all the languages that I'm supporting.
So I just don't want to simply handle the message, what I'm intending is to do not show the push message at all before selecting the proper language that should appear to the user... With the App killed or not.
So my Q:
Is this seems possible?
What approach do you suggest to achieve this?
Thank you all very much.
No (when the user kills the app or when backgroundfetching is turned off, no notifications will reach your app).
Look into how to localize pushnotifications on apple's developer website. You can acieve exactly what you want by letting the system do the localization.
See the applicable keys in the push payload: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/TheNotificationPayload.html
There are some limitations of APNS as follows:
didReceiveRemoteNotifications delegate execute only if the application is in either foreground or background.
If the application is terminated/suspended by either user or OS then notification will be displayed in notification centre but the respective delegate would not get called.
Set both Background fetch and Remote notifications enabled in Background modes from project setting.
Use application:didReceiveRemoteNotification:fetchCompletionHandler: delegate instead of didReceiveRemoteNotifications.
Hope this will help you.

send event from server to an ios app

I would like to know whether there is an alternative different than what I am thinking so far. I have an ios app, which gets data from my server, when the user clicks refresh button or so.
Now, I want to send data from server to the app - for example when an event started so as to update the label on that event.
I have thought of the following :
Use background fetch from my IOS app and connect to the server every an interval
Send a push notification and make the user open the app, and the app calls refresh
Is there any other way? Is it possible that server will send the data (just like a push notification) but without the notification to be visible, without firing the app, I just want to change some of its data - an approach similar to the Google Cloud Messaging for Android.
To visualise what I am saying, if you have used LiveScores app, it updates for example the minute of a live match - I want something similar.
I guess I need to follow approach 1, with background fetch (which became more effective in ios7) but just out of curiosity if there is any other solution out there.
Thanks
Under ios7+ you can do silent pushes (which aren't displayed) [see a nice tutorial — hayageek.com: iOS Silent Push notifications]
Under ios6 and below you are of of luck

Resources