如何使用Firebase云功能通知有效负载重置应用程序图标的徽章编号?

时间:2019-02-26 02:50:47

标签: ios swift firebase google-cloud-functions

当前行为:UserA发送另一条userB消息,当应用程序在后台运行时,通知被触发,随着更多消息触发通知,徽章编号增加。 UserB打开通知,徽章值设置为0并最小化应用程序。用户A在后台运行用户B应用时,用户A向用户B发送了另一条消息,徽章值未重置为1,而是从最后一个累积值继续。

期望的行为:当userB收到新通知时,徽章值从1开始递增,而不是从上一个累积的通知徽章值开始递增。

进一步:我已经检查了Firebase有效负载,在UserB将值设置为0客户端之后,有效负载似乎正在发送累积值,而不是重置该值。

下面的云功能:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
    var badgeCount = 1;
exports.sendNotification = functions.database.ref('/Notifications/Messages/{pushId}').onWrite((change,context) => {
    console.log('Push notification event triggered for testing');
    console.log(change);
    const message = change.after.val();
    const senderUid = message.Sender;
    const receiverUid = message.SendTo;
    const chatMessage = message.Message;
    const senderName = message.SenderName;
    console.log(receiverUid);
    const promises = [];

    console.log('notifying ' + receiverUid + ' about ' + chatMessage + ' from ' + senderUid);

        const payload = {
            notification: {
                title: senderName,
                body: chatMessage,
                badge: badgeCount.toString(),
                sound: "default"
            }
        };

    badgeCount++;
        return admin
     .database()
     .ref("fcmToken").child(receiverUid)
     .once("value")
     .then(allToken => {
       if (allToken.val()) {
         const token = Object.keys(allToken.val());
         console.log(`token? ${token}`);
         return admin
           .messaging()
           .sendToDevice(token, payload)
           .then(response => {
             return null;
           });
       }
       return null;
     });
 });

内部项目appDelegate applicationDidBecomeActive和applicationWillEnterForeground。

UIApplication.shared.applicationIconBadgeNumber = 0

2 个答案:

答案 0 :(得分:0)

  

在应用程序中,# Checking which dates falls in the range followed by taking the mean res = [] for idx in df1.Item.unique(): temp = df2[df2.Item==idx] idx_ = temp.Date[temp.Date.apply(lambda x: x >= df1[df1.Item == idx]['Start Date'].iloc[0] and x <= df1[df1.Item == idx]['End Date'].iloc[0])].index res.append(df2.loc[idx_, 'Price'].mean()) # Assiging the result mean df1.loc[:, 'Mean Price'] = res 在打开应用程序时使用UIApplication.shared.applicationIconBadgeNumber = 0将其重置为0。

这可以重置徽章计数器。但是,

  

但是,下次发送通知时,徽章值再次从上一个递增的值开始,例如(5)而不是1。有人可以解释/帮助这里发生什么情况吗?

在这里,收到推送通知后,您无法从应用程序一侧更新徽章计数器。

当接收到带有推送通知有效内容的“徽章”参数值的推送通知时,iOS将自动更新应用程序图标上的徽章计数器。因此,当前,您似乎在所有通知中都为“徽章”发送了相同的值。因此,如果您发送“徽章”值“ 5”。每次,徽章值将更新为“ 5”。

因此,您需要在Firebase功能的通知有效负载中发送正确的徽章值。

有关“徽章”参数的更多详细信息,请参阅此Google文档。:https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

答案 1 :(得分:0)

在给定基础上解决问题的三个部分

1。)在数据库中创建一个映射到特定用户的字段,以跟踪通知计数。

2。)在客户端上实施逻辑,以根据用户操作更新db中的通知字段

3。)处理更新客户端上的徽章编号