在 ios 中关闭应用程序时不会出现 FCM 数据消息
FCM data message not coming when app is closed in ios
我已经使用 flutter_local_notification
在我的 flutter 项目中集成了 FCM。 Android 中的一切都按预期工作。但是,ios 几乎也可以工作,除非应用程序从历史记录中关闭。当应用程序从历史消息中清除时,不会触发。我在推送通知中仅使用数据消息。请看下面:
{
"to": "/topics/global",
"priority": "high",
"content_available": true,
"data": {
"title": "Demo Title",
"message": "Demo Message",
"payload": "basic"
}
}
如您所见,json 中没有 notification
对象。此配置在 Android(前景和背景)和 ios 仅前景上运行良好。但是,如果我在这个 json 中添加 notification
对象,令人惊讶的是 it works even the app is closed
.
但是因为我需要手动处理通知,所以该选项不适合我的用例。所以我进一步研究并禁用了 Method Swizzling
<key>FirebaseAppDelegateProxyEnabled</key>
<false/>
但这也无济于事。现在我有点迷路了,找不到达到预期结果的方法。我的AppDelegate.swift
如下
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
注意:ios 应用已在 TestFlight 中发布并在真实设备上进行测试
经过长时间的研究,我找不到解决此问题的绝对方法。但是,我已经针对该问题实施了解决方法。
我有 3 种发送通知的方案,它们是
1. Sending notification to specific user
2. Sending notification to all user
3. Sending notification to a topic
当用户打开应用程序时,我会检查用户使用的是哪个平台。如果它是 Android,那么我将设备令牌存储为 android,否则 ios。同时,我还将用户注册到主题 global_android
如果平台是 Android
和 global_ios
如果平台是 ios
.
现在,当我从管理面板发送通知时,我将条件与上述 3 种情况相匹配。对于 android,我使用以下 json
配置来发送通知
{
"to": "topic || token",
"priority": "high",
"content_available": true,
"data": {
"title": "Demo Title",
"message": "Demo Message",
"payload": "basic"
}
}
对于ios
,我使用以下配置
{
"to": "/topics/global",
"priority": "high",
"content_available": true,
"notification": {
"title": "Demo Title",
"body": "Demo Message"
},
"data":{
"key1":"value",
"key2":"value"
}
}
现在,当我收到通知时,我会再次检查平台。如果它是 Android
,那么我会使用 'flutter_local_notification' 插件显示自定义通知,如果它是 ios,那么我什么都不做,因为 firebase 已经显示了通知。
这不是一个绝对的解决方案,但你猜怎么着,它对我有用。
我已经使用 flutter_local_notification
在我的 flutter 项目中集成了 FCM。 Android 中的一切都按预期工作。但是,ios 几乎也可以工作,除非应用程序从历史记录中关闭。当应用程序从历史消息中清除时,不会触发。我在推送通知中仅使用数据消息。请看下面:
{
"to": "/topics/global",
"priority": "high",
"content_available": true,
"data": {
"title": "Demo Title",
"message": "Demo Message",
"payload": "basic"
}
}
如您所见,json 中没有 notification
对象。此配置在 Android(前景和背景)和 ios 仅前景上运行良好。但是,如果我在这个 json 中添加 notification
对象,令人惊讶的是 it works even the app is closed
.
但是因为我需要手动处理通知,所以该选项不适合我的用例。所以我进一步研究并禁用了 Method Swizzling
<key>FirebaseAppDelegateProxyEnabled</key>
<false/>
但这也无济于事。现在我有点迷路了,找不到达到预期结果的方法。我的AppDelegate.swift
如下
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
注意:ios 应用已在 TestFlight 中发布并在真实设备上进行测试
经过长时间的研究,我找不到解决此问题的绝对方法。但是,我已经针对该问题实施了解决方法。
我有 3 种发送通知的方案,它们是
1. Sending notification to specific user
2. Sending notification to all user
3. Sending notification to a topic
当用户打开应用程序时,我会检查用户使用的是哪个平台。如果它是 Android,那么我将设备令牌存储为 android,否则 ios。同时,我还将用户注册到主题 global_android
如果平台是 Android
和 global_ios
如果平台是 ios
.
现在,当我从管理面板发送通知时,我将条件与上述 3 种情况相匹配。对于 android,我使用以下 json
配置来发送通知
{
"to": "topic || token",
"priority": "high",
"content_available": true,
"data": {
"title": "Demo Title",
"message": "Demo Message",
"payload": "basic"
}
}
对于ios
,我使用以下配置
{
"to": "/topics/global",
"priority": "high",
"content_available": true,
"notification": {
"title": "Demo Title",
"body": "Demo Message"
},
"data":{
"key1":"value",
"key2":"value"
}
}
现在,当我收到通知时,我会再次检查平台。如果它是 Android
,那么我会使用 'flutter_local_notification' 插件显示自定义通知,如果它是 ios,那么我什么都不做,因为 firebase 已经显示了通知。
这不是一个绝对的解决方案,但你猜怎么着,它对我有用。