通过 FirebaseMessaging 后台消息显示 iOS 应用徽章

Showing an iOS app badge through FirebaseMessaging background messages

我正在用 Flutter 开发一个应用程序,运行 遇到了一些问题。我想要发生的是

  1. 通过一些事件,使用 FCM 向用户发送推送通知。我同时发送 notificationdata 消息,以便调用 onBackgroundMessage 处理程序。
  2. 每次收到消息时,处理程序都会将徽章计数加 1。

我的消息有效负载如下所示:

const payload = {
    notification: {  
        title: String(data["title"]),
        body: String(data["message"]),
    },
    data: {
        title: data["title"],
        body: data["message"],
    },
}
const payloadBackground = {
    data: {
        title: data["title"],
        body: data["message"],
    },
    content_available: true,
    priority: "high"
}

这是 运行 作为 Firebase 云函数使用 FirebaseMessaging:

admin.messaging().sendToDevice(receiverRegistrationTokens, payloadBackground).catch(err => console.error(err));
return admin.messaging().sendToDevice(receiverRegistrationTokens, payload).then( response => {
    console.log(receiver + " has registrationTokens: " + receiverRegistrationTokens);
    return null;
})

在客户端,通知是这样处理的:

Future<void> backgroundNotificationHandler(RemoteMessage message) {
  FlutterAppBadger.updateBadgeCount(1);
  debugPrint("Received notification: " + message.data.toString());
  return null;
}
AwesomeNotifications().initialize(
    // set the icon to null if you want to use the default app icon
    'resource://drawable/res_app_icon',
    [
      NotificationChannel(
        channelKey: 'basic_channel',
        channelName: 'Basic notifications',
        channelDescription: 'Notification channel for basic tests',
        defaultColor: Color(0xFF9D50DD),
        ledColor: Colors.white,
        enableLights: true,
      )
    ]);
FirebaseMessaging.onBackgroundMessage(backgroundNotificationHandler);

出于某种原因,iOS 上的徽章数量没有增加(根本没有徽章)。但是推送通知显示正确。关于如何解决这个问题的任何想法?非常感谢!

我在我的环境中尝试过,以下 Node.js Firebase 可调用函数确实会在真实 iOS 设备上触发背景消息,如果我向背景消息添加 print处理程序,我可以在调试控制台中看到输出:

// send a test message
exports.testMessage = functions.https.onCall(async (data, context) => {
    try {
        await admin.messaging().sendToDevice(
            '<TOKENS>', {
            data: {
                key1: 'value1',
            },
            notification: {
                title: 'Title1',
                body: 'Body1'
            }
        }, {
            contentAvailable: true,
            priority: "high",
        });
    } catch (e) {
        console.log(e);
    }
});