firebase - 在 Flutter 中,我们如何使用 Firebase Messaging onBackgroundMessage 创建通知,使用 flutter_local_notifications?

标签 firebase flutter push-notification firebase-cloud-messaging dart-isolates

我们正在开发一个加密的聊天应用程序,我们使用 Firebase 消息发送数据通知。在向用户显示实际通知之前,需要在收到数据通知后完成一些客户端逻辑。例如,必须将电话号码转换为本地联系人姓名。这种转换是通过使用已经全局可用的 map 进行查找来完成的。

数据通知接收得很好,并且 onBackgroundMessage 回调也被调用。但是,似乎不可能从 onBackgroundMessage 函数访问任何类型的状态。例如,打印登录用户的电话号码返回 null。
从 onMessage 回调打印这个相同的全局变量工作得很好。

从 onMessage 运行 flutter_local_notifications 工作正常,但同样,从 onBackgroundMessage 根本不起作用,因为“找不到方法 .show() 的实现”。目前,它声称 flutterLocalNotificationsPlugin 为 null,但事实并非如此。

在我们看来,只要应用程序处于后台, onBackgroundMessage 就无法访问应用程序提供的任何内容。必须做一些事情才能使某些范围/上下文可用于后台进程。目前,这主要是整个 flutter_local_notifications 插件,以及将电话号码转换为姓名的本地联系人列表。

有没有人知道如何做到这一点?

这是一些代码:

FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
final _chatRepository = ChatRepository();

Future<dynamic> backgroundMessageHandler(Map<String, dynamic> message) async {
  if(message.containsKey('data')) {
    await _showNotification(message);
    return Future<void>.value();
  }
}

Future _showNotification(message) async {
  List<String> numbers = [];
  numbers.add(message['data']['sender']);
  var name = await _chatRepository.translatePhoneNumbersToChatName(numbers);
  var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
      'channel id', 'channel name', 'channel description',
      importance: Importance.Max, priority: Priority.High);
  var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
  var platformChannelSpecifics = new NotificationDetails(
      androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
  await flutterLocalNotificationsPlugin.show(
    0,
    name,
    message['data']['body'],
    platformChannelSpecifics,
    payload: message['data']['body'],
  );
}

class NotificationHandler {
  final FirebaseMessaging fcm = FirebaseMessaging();
  StreamSubscription iosSubscription;
  String deviceToken = "";

  Future<void> initialize() async {
    flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
    var initializationSettingsAndroid =
    new AndroidInitializationSettings('@mipmap/ic_launcher');
    var initializationSettingsIOS = new IOSInitializationSettings(onDidReceiveLocalNotification: onDidReceiveLocalNotification);
    var initializationSettings = new InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS);
    flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: onClickNotification);

    fcm.configure(
      onMessage: (Map<String, dynamic> message) async {
        if(message.containsKey('data')) {
          print(message);
          _showNotification(message);
        }
      },
      onBackgroundMessage: Platform.isIOS
          ? null
          : backgroundMessageHandler,
      onLaunch: (Map<String, dynamic> message) async {
        if(message.containsKey('data')) {
          print(message);
          _showNotification(message);
        }
      },
      onResume: (Map<String, dynamic> message) async {
        if(message.containsKey('data')) {
          print(message);
          _showNotification(message);
        }
      },
    );
    _updateDeviceToken();
  }
.
.
.
Of course, the initialize above is called early on in the application lifecycle.

最佳答案

class NotificationHandler {
  static final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); // make it a static field of the class
  // ...
}

Future _showNotification(message) async {
  // ...
  await NotificationHandler.flutterLocalNotificationsPlugin.show( // access it
    // ...
  );
}

希望这对你有用。

关于firebase - 在 Flutter 中,我们如何使用 Firebase Messaging onBackgroundMessage 创建通知,使用 flutter_local_notifications?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59611258/

相关文章:

dart - 小部件中的图像 [ flutter ]

push-notification - 在 iOS 10 上处理用户通知

android - 节目类型已经存在 Glide

ios - Firebase 下载相同的数据

javascript - ReactJS - FCM 在 safari 浏览器中不工作

flutter - 如何在 flutter 中创建已弃用的文本?

java - Flutter FCM后台调用平台特定代码

google-chrome - 网络推送通知未在 Chrome 中显示

android - 附上缺少的源android

javascript - 使用云卵石 (Pebble.js) 访问 firebase