【问题标题】:W/FLTFireMsgService( 8777): Flutter- FCM A background message could not be handled in DartW/FLTFireMsgService(8777):Flutter-FCM 无法在 Dart 中处理后台消息
【发布时间】:2021-11-04 19:43:17
【问题描述】:

我已将 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):无法处理后台消息 在 Dart 中,因为没有注册 onBackgroundMessage 处理程序。

W/FirebaseMessaging(8777):无法记录事件:分析库是 缺少 W/FirebaseMessaging(8777):通知通道设置在 应用程序尚未创建 AndroidManifest.xml。默认值 将会被使用。 E/NotificationManager(8777):notifyAsUser: tag=FCM-Notification:111236427, id=0, user=UserHandle{0}

【问题讨论】:

  • 当您的应用在后台(在菜单中或在其他应用中)或终止(关闭)时是否会出现错误?
  • 在使用其他应用时出现错误。

标签: android flutter dart


【解决方案1】:

在您的应用程序处于后台时处理消息有点不同。可以通过 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 文档:

https://firebase.flutter.dev/docs/messaging/usage/

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 2021-06-28
    • 2020-07-21
    • 2020-05-15
    • 2020-08-26
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多