Flutter with Firebase Messaging. iOS device doesn't receive data only messages - ios

I'm sending data-only message from Cloud functions
I tried this solution: https://github.com/FirebaseExtended/flutterfire/issues/3395#issuecomment-683973108
Here are the option sendings from Cloud Functions:
{
android: {
priority: "high",
},
apns: {
payload: {
aps: {
contentAvailable: true,
},
},
headers: {
"apns-push-type": "background",
"apns-priority": "5",
"apns-topic": "io.flutter.plugins.firebase.messaging", // bundle identifier
},
},
}
And here the code which handle messages. (I want to create a notification from the client not from the server)
const AndroidNotificationChannel channel = AndroidNotificationChannel(
'high_importance_channel',
'High Importance Notifications',
'This channel is used for important notifications.',
importance: Importance.max,
);
class BackgroundHandler {
static const IOSNotificationDetails iosNotificationDetails =
IOSNotificationDetails(subtitle: 'notification');
static final AndroidNotificationDetails androidNotificationDetails =
AndroidNotificationDetails(channel.id, channel.name, channel.description);
}
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print('It works');
print(message);
FlutterLocalNotificationsPlugin().show(0, 'notification', 'new notification', NotificationDetails(android: BackgroundHandler.androidNotificationDetails,
iOS: BackgroundHandler.iosNotificationDetails));
NotificationManager.handleNotificationData(message.data);
});
On Android it works perfectly and it works even with notification, but nothing happens with data only messages.

Related

Data only messages not receiving on iOS device using Firebase Messaging and React Native

I am sending data only messages from a Firebase Function to a React Native app.
It works on Android, but it not works on iOS.
As specified here https://rnfirebase.io/messaging/usage#data-only-messages
my code for sending a message is the following:
var payload = {
data: {
//my app data
},
apns: {
payload: {
aps: {
contentAvailable: true,
priority: 'high',
},
},
headers: {
'apns-push-type': 'background',
'apns-priority': '5',
'apns-topic': 'com.xxxx.xxxx', //my app bundle id
},
},
tokens: tokens
};
const response = await admin.messaging().sendMulticast(payload);
The response has success=true, so the code is working.
In my iOS app I have this handler:
const setMessages = useCallback(async (remoteMessage: any) => {
console.log('A new FCM message arrived!', JSON.stringify(remoteMessage));
});
useEffect(() => {
const unsubscribe = messaging().onMessage(setMessages);
return unsubscribe;
}, []);
As I said before, it works on Android. In iOS the callback is never triggered.
I am pretty sure I setup the iOS app correctly:
- I can receive notification-only messages in iOS
- I can generate the fcm token

Reactnative IOS pushotification/PushNotificationIOS onNotification does not called directly when notification received

I used reactnative PushNotification/PushNotificationIOS modules , My issue is when notification received on foreground to my device IOS ,the function onNotification: function(notification) {} does not called directly is called by click only .
I want to fetch data notification paylaod sent via pububnub console directly without any user interaction ,this function is working fine in android but ios not all.
the console does not show anything can help me to solve this issue and thanks.
This the function and imports module:
import PushNotification from "react-native-push-notification";
import PushNotificationIOS from "#react-native-community/push-notification-ios";
onNotification: function(notification) {
if (Platform.OS=='ios')
{
console.log('notif',notification)
notification.finish(PushNotificationIOS.FetchResult.NoData);
},
onAction: function (notification) {
},
onRegistrationError: function(err) {
},
permissions: {
alert: true,
badge: true,
sound: true,
},
popInitialNotification: true,
requestPermissions: true,
senderID: FIREBASE_SENDER_ID,
})
}
and this the object pubnub to send :
{"pn_apns":{
"aps":{
"alert": {
"body": "Course disponible",
"title": "My course"
},
"sound": "beep.wav",
"data": { "reference": "ND1004332", "startstation": "" }
},
"pn_push":[
{
"push_type":"alert",
"auth_method":"token",
"targets":[
{
"environment":"development",
"topic":"com.test.fr"
}
],
"version":"v2"
}
]
}
}
import {Platform} from 'react-native';
import PushNotification from 'react-native-push-notification';
import PushNotificationIOS from "#react-native-community/push-notification-ios";
if (Platform.OS === 'ios') {
// Must be outside of any component LifeCycle (such as `componentDidMount`).
PushNotification.configure({
onNotification: function (notification) {
console.log("NOTIFICATION:", notification);
const { foreground, userInteraction, title, message } = notification;
if (foreground && (title || message) && !userInteraction) PushNotification.localNotification(notification);
notification.finish(PushNotificationIOS.FetchResult.NoData);
},
permissions: {
// alert: true,
// badge: true,
sound: true
},
});
}

how to add custom sound in iOS with flutter?

I am new to push notifications and I have this task to add a custom sound whenever the user receives a notification. I am not using flutter local notifications, just the normal firebase configurations and its working well. Can anyone help me add a custom sound for iOS. Any help would be greatly appreciated!
Here is the payload used and the firebase configurations.
options = {
"notification": {
"title": formatter.title,
"body": formatter.body,
"sound": "notification.caf",
"content_available": true,
},
"priority": "high",
"data": {
"badge": user.unopened_notification_count,
"body": formatter.body,
"title": formatter.title,
"id": notification.id,
"notifiable_type": notification.notifiable_type,
"notifiable_id": notification.notifiable_id,
"click_action": "FLUTTER_NOTIFICATION_CLICK"
}
}
also here is my firebase configuration:
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
if (Firebase.apps.isEmpty) await Firebase.initializeApp();
print('Handling a background message ${message.data['id']}');
}
handleNotifications() async {
FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(badge: false, alert: false, sound: true); //presentation options for Apple notifications when received in the foreground.
FirebaseMessaging.onMessage.listen((message) async {
print('Got a message whilst in the FOREGROUND!');
return;
}).onData((data) async {
print('Got a DATA message whilst in the FOREGROUND!');
print('data from stream: ${data.data['id']}');
});
FirebaseMessaging.onMessageOpenedApp.listen((message) async {
print('NOTIFICATION MESSAGE TAPPED');
return;
}).onData((data) async {
print('NOTIFICATION MESSAGE TAPPED');
print('data from stream: ${data.data}');
});
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
FirebaseMessaging.instance.getInitialMessage().then((value) => value != null ? _firebaseMessagingBackgroundHandler : false);
return;
}
attached image here is where I placed the sound file inside Xcode

How to use apns-collapse-id with FCM?

I know this question have been asked many times but none of the answers work for me. Some of the questions dont even have an answer.
I am try to bundle or group similar notifications on ios. I am using FCM Cloud Functions to trigger notifications.
Following are the methods i tried by
const payload = {
notification: {
title: "Your medical history is updated" + Math.random(),
tag: "MedicalHistory",
},
data: {
click_action: "FLUTTER_NOTIFICATION_CLICK",
sound: "default",
status: "done",
},
};
const patchedPayload = Object.assign({}, payload, {
apns: {
headers: {
"apns-collapse-id": "MedicalHistory",
},
},
});
const options = {
priority: "high",
collapseKey: "MedicalHistory",
};
await admin
.messaging()
.sendToDevice("MY_TOKEN", patchedPayload, options);
The above code does not work
const payload = {
notification: {
title: "Your medical history is updated" + Math.random(),
tag: "MedicalHistory",
},
data: {
click_action: "FLUTTER_NOTIFICATION_CLICK",
sound: "default",
status: "done",
},
apns: {
headers: {
"apns-collapse-id": "MedicalHistory",
},
},
};
const options = {
priority: "high",
collapseKey: "MedicalHistory",
};
await admin
.messaging()
.sendToDevice("MY_TOKEN", payload, options);
This does not work as well.
I dont understand where to put the apns-collapse-id. The cloud functions sample also does not show this. Neither i could find doc with code on this
I recommend using the latest send function from the firebase-admin lib, usage described here.
It seems to work fine and somewhat easier to apply.
An example of a message with android/ios specific headers:
// common data for both platforms
const notification = {
title: 'You liked!',
body: 'You really liked something...',
}
const fcmToken = '...'
// android specific headers
const android = {
collapseKey: '0'
}
// ios specific headers
const apns = {
headers: {
"apns-collapse-id": '0'
}
}
// final message
const message = {
token: fcmToken,
notification: notification,
android: android,
apns: apns,
}
// send message
admin.messaging().send(message).catch(err => console.error(err));

iOS background notifications using Cloud Functions

I have an issue getting data when app goes in background. I'm using Firebase Cloud functions and I think something I didn't code correctly in NodeJS. I have tried many examples and solutions like putting:
content_available: true and priority: 'high' but nothing seems to work. I have to note that:
Notifications are arriving in background and foreground but I can read data from notification in foreground but data is not fetched in background. So there is NO notifications data in background even it is displayed with sound and alert.
I think I'm doing something wrong in data payload so here is my NodeJS method:
var message = {
token: tokenID,
notification: {
title: 'ChatApplication',
body: `${myUsername} send you a message`,
},
android: {
ttl: 3600 * 1000,
notification: {
icon: 'default',
sound: 'default',
click_action: "com.yupi.chatapplication.messaging"
},
data: {
from_user: user_id,
title: 'ChatApplication',
body: `${myUsername} send you a message`
},
},
apns: {
payload: {
aps: {
alert: {
title: 'ChatApplication',
body: `${myUsername} send you a message`
},
badge: 1,
sound: 'default',
content_available: true,
mutable_content: true,
priority: 'high'
},
},
},
};
return admin.messaging().send(message)
.then((response) => {
// Response is a message ID string.
return console.log('Successfully sent message:', response);
})
.catch((error) => {
return console.log('Error sending message:', error);
});
The right field names for the Node.js SDK should be contentAvailable and mutableContent: https://firebase.google.com/docs/reference/admin/node/admin.messaging.Aps

Resources