启动时触发FCM,在Android上运行良好以下是用于处理FCM的代码。iOS通知是在后台应用程序和打开单击应用程序时触发的。
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print(message);
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
new FlutterLocalNotificationsPlugin();
// initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
var initializationSettingsAndroid =
new AndroidInitializationSettings('launcher_icon');
var initializationSettingsIOS = new IOSInitializationSettings(
onDidReceiveLocalNotification: onDidReceiveLocalNotification);
var initializationSettings = new InitializationSettings(
initializationSettingsAndroid, initializationSettingsIOS);
flutterLocalNotificationsPlugin.initialize(initializationSettings,
onSelectNotification: onSelectNotification);
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
'123', 'convoy notification', 'convoy notification',
importance: Importance.Max,
priority: Priority.High,
ticker: 'ticker');
var iOSPlatformChannelSpecifics = IOSNotificationDetails();
var platformChannelSpecifics = NotificationDetails(
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.show(
0,
message['notification']['title'],
message['notification']['body'],
platformChannelSpecifics,
payload: message['data']['payload']);
},
onBackgroundMessage: myBackgroundMessageHandler,
onLaunch: (Map<String, dynamic> message) async {
var string = message["data"]["payload"];
var payload = jsonDecode(string);
print(payload);
if (payload != null) {
var type = payload["refresh"];
if (type == "OFFERS") {
Future.delayed(Duration(seconds: 3), () {
_navigateToOffers(payload["id"]);
});
} else if (type == "REQUESTS") {
Future.delayed(Duration(seconds: 3), () {
_navigateToRequests(payload["id"]);
});
}
}
//_navigateToItemDetail(message);
},
onResume: (Map<String, dynamic> message) async {
var string = message["data"]["payload"];
var payload = jsonDecode(string);
print(payload);
if (payload != null) {
var type = payload["refresh"];
if (type == "OFFERS") {
_navigateToOffers(payload["id"]);
} else if (type == "REQUESTS") {
_navigateToRequests(payload["id"]);
}
}
// _navigateToItemDetail(message);
},
);
_firebaseMessaging.requestNotificationPermissions(
const IosNotificationSettings(sound: true, badge: true, alert: true));
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这段代码是用Flutter编写的,用于处理Firebase Cloud Messaging (FCM) 推送通知的接收和处理逻辑,分别针对Android和iOS平台。从你的描述来看,Android设备上一切正常,但iOS设备在应用后台或关闭状态下接收通知后,只有当用户点击通知时,onResume
或 onLaunch
回调才会被触发。
对于iOS平台,确保通知能够正确显示并触发预期行为,你需要检查以下几个关键点:
确保App Group设置正确:对于iOS,远程通知(特别是后台/杀死状态下的)需要正确的App Group配置,以便Flutter与原生iOS部分之间能共享数据。请确认在Xcode中为你的项目和扩展(如Notification Service Extension)设置了相同的App Group,并且在Firebase Messaging的配置中使用了正确的标识符。
Background Modes启用:在Xcode的项目设置里,确保已经勾选了"Background Modes"中的"Remote notifications"选项。这允许应用在后台接收远程通知。
静默推送处理:如果你希望在应用后台时也能处理某些逻辑而不仅仅是展示通知,可能需要发送静默推送(content-available: 1)。但是,请注意,静默推送不会自动唤醒应用,它们只能在应用处于活跃或后台时触发didReceiveRemoteNotification
回调。对于完全关闭状态的应用,用户必须首先点击通知才能启动应用。
iOS Notification Service Extension:虽然你的代码片段没有直接涉及,但如果涉及到自定义通知内容(比如下载图片等),确保你正确实现了iOS Notification Service Extension,并且它能够正确地处理接收到的通知数据。
权限请求:你的代码中已经包含了请求iOS通知权限的部分,这是正确的。请确保在实际设备上测试时,用户已授予了通知权限。
Payload结构:确保你的服务器端发送的通知payload符合要求,特别是对于iOS,可能需要包含适当的apns字段来确保消息按预期工作。
如果以上都已确认无误,但问题依旧,可能需要更深入地查看日志、使用调试工具(如Xcode的调试器)或者查阅FlutterFire文档关于iOS特定的配置和已知问题,以进一步诊断问题所在。