我正在使用:
flutter version 2.2
firebase_messaging: ^10.0.2
我收到推送通知,然后单击它并打开应用程序。 然后我没有看到
FirebaseMessaging.onMessageOpenedApp.listen
被调用(回调正在向我发送调试电子邮件,但我没有收到任何邮件)
我的问题是
(可选)如何使用 android studio debugur 模拟上面的情况来调试 android 应用程序,因此应用程序被杀死而不打开,然后通过通知打开
这里可能出现什么问题?为什么该流没有被触发?我在 main.dart 中初始化它
PS:所有其他方法都可以正常工作,因此如果应用程序位于前台,则 onMessage.listen 效果很好。我需要处理 onMessageOpenedApp,以便我可以根据通知信息将用户重定向到正确的视图
第一个问题:
要查看应用程序中的日志,您可以使用 Android Studio 或 IntelliJ 中的“Logcat”选项卡:
第二个问题:
如果您的应用程序被终止并且您希望收到通知点击回调,您应该使用:
FirebaseMessaging.instance.getInitialMessage().then((message) {
if (message != null) {
// DO YOUR THING HERE
}
});
,因为根据Flutter团队对onMessageopenedApp函数的注释:
/// If your app is opened via a notification whilst the app is terminated,
/// see [getInitialMessage].
我遇到这个问题已经有一段时间了,只是注意到,
firebase_messaging
插件提供了 3 种解决方法。
您可以在下面找到详细信息:
onMessage
回调,这实际上是一个Stream<RemoteMessage>
,并且通知托盘中不会有任何通知。所以你可以这样处理FirebaseMessaging.onMessage.listen((message) {
// handle accordingly
});
onMessageOpenedApp
回调,这也是一个Stream<RemoteMessage>
,因此您可以像这样处理它FirebaseMessaging.onMessageOpenedApp.listen((message) {
// handle accordingly
});
Stream<RemoteMessage>
。因此,在这种情况下,firebase_messaging
为您提供了getInitialMessage
回调,这实际上是一个Future<RemoteMessage?>
。你可以这样使用它:FirebaseMessaging.instance.getInitialMessage().then((message) {
if (message != null) {
// handle accordingly
}
});
请注意,如果在
getInitializeMessage
文件中处理,每次用户打开应用程序时都会触发 main.dart
回调。所以也许 message
是 null,为了防止空指针异常,我在这里放置了 if(message != null)
条件
要在应用程序被杀死时查看日志,您是否尝试过
flutter logs
命令,只需将设备插入 USB 调试并在终端中运行 flutter logs
,所有 print
消息都会显示在此处。
关于
FirebaseMessaging.onMessageOpenedApp.listen
在应用程序启动时被调用是因为你需要定义后台消息处理程序
/// Define a top-level named handler which background/terminated messages will
/// call.
///
/// To verify things are working, check out the native platform logs.
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
// If you're going to use other Firebase services in the background, such as Firestore,
// make sure you call `initializeApp` before using other Firebase services.
await Firebase.initializeApp();
print('Handling a background message ${message.messageId}');
}
在此处查看完整的 firebase_messaging 示例 main.dart
并在您的清单中添加以下代码:
<intent-filter> <action android:name="FLUTTER_NOTIFICATION_CLICK" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
还要确保您已发送“click_action”:“FLUTTER_NOTIFICATION_CLICK”
从您的服务器端,例如:
DATA='{ "notification": { "body": "这是正文", "title": "这是标题" }, "data": { "att1": "值..", "att2 ": "值..", "click_action": "FLUTTER_NOTIFICATION_CLICK", }, "to": "" }'
一个似乎对我有用的解决方案是在处理通知之前添加一点延迟。请参阅下面的代码片段。
final deepLink = message.deepLink;
if (deepLink != null) {
// NOTE: Give some time for app to load up.
await Future.delayed(const Duration(
milliseconds: 400,
));
final notification = CustomeNotification(
deepLink: deepLink,
);
eventsAssistant.emit(
event: RemoteNotificationEvent(
notification: notification,
),
);
}