android - W/FLTFireMsgService(8777):Flutter-FCM 无法在 Dart 中处理后台消息
问题描述
我已将 firebase 消息传递更新到最新版本并实施了新的修改,但使用 firebase_messaging: ^8.0.0 及更高版本如果应用程序在后台运行,当我推送通知图标时,我无法导航到相应的屏幕。
这是代码
class PushNotificationService
{
final FirebaseMessaging messaging = FirebaseMessaging.instance;
Future initialize(context) async{
FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage message) => (Map<String, dynamic> message) async{
retrieveRideRequestInfo(getRideRequestId(message), context);
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) => (Map<String, dynamic> message) async {
retrieveRideRequestInfo(getRideRequestId(message), context);
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) => (Map<String, dynamic> message) async{
retrieveRideRequestInfo(getRideRequestId(message), context);
});
}
Future<String> getToken() async{
String token = await messaging.getToken();
//String token = await firebaseMessaging.getToken();
print("This is token :: ");
print(token);
driversRef.child(currentfirebaseUser.uid).child("token").set(token);
messaging .subscribeToTopic("alldrivers");
messaging .subscribeToTopic("allusers");
}
String getRideRequestId(Map<String, dynamic> message){
String rideRequestId = "";
if(Platform.isAndroid)
{
rideRequestId = message['data']['ride_request_id'];
}
else{
rideRequestId = message['ride_request_id'];
}
return rideRequestId;
}
void retrieveRideRequestInfo(String rideRequestId, BuildContext context){
newRequestsRef.child(rideRequestId).once().then((DataSnapshot dataSnapshot)
{
if (dataSnapshot.value != null) {
double pickUpLocationLat = double.parse(
dataSnapshot.value['pickup']['latitude'].toString());
double pickUpLocationLng = double.parse(
dataSnapshot.value['pickup']['longitude'].toString());
String pickUpAddress = dataSnapshot.value['pickup_address'].toString();
}
});
}
}
运行日志:
D/FLTFireMsgReceiver(8777):收到消息的广播
W/FLTFireMsgService(8777):由于没有注册 onBackgroundMessage 处理程序,因此无法在 Dart 中处理后台消息。
W/FirebaseMessaging(8777):无法记录事件:缺少分析库 W/FirebaseMessaging(8777):应用程序尚未创建 AndroidManifest.xml 中设置的通知通道。将使用默认值。E/NotificationManager(8777): notifyAsUser: tag=FCM-Notification:111236427, id=0, user=UserHandle{0}
解决方案
在您的应用程序处于后台时处理消息有点不同。可以通过 onBackgroundMessage 处理程序处理消息。收到后,将生成一个隔离(仅限 Android,iOS/macOS 不需要单独的隔离),即使您的应用程序未运行,您也可以处理消息。
关于后台消息处理程序,有几点需要牢记:
它不能是匿名函数。它必须是顶级函数(例如,不是需要初始化的类方法)。
例子:
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}");
}
void main() {
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(MyApp());
}
更多信息请访问官方 flutterfire 文档:
推荐阅读
- python-3.x - 在 MySQL 8 中,我可以创建一个索引来加速 LIKE 搜索吗?
- javascript - 如何在使用 WebAssembly 进行大量计算时保持反应式 UI?
- terraform - Terraform Azure VM SSH 密钥
- tcp - 如何理解我在 PIC18 上收到的 TCP 选项字段?
- visual-studio-code - VS Code 使用远程 SSH - 如何打开“本地”终端?
- python - 在鼠标单击时从叶图返回纬度、经度值到 python 脚本(流式 Web 应用程序)
- docker - Docker 构建立即挂起(使用 minikube 和 ubuntu,目录中的文件不多)
- python - 在 Anaconda 上安装 Pygame 的问题
- postgis - 无法在 ubuntu 上将 postgresql 11 的 postgis 2.5 升级到 3.0.1
- javascript - 展平多个 SVG 图层并保存/导出?