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

Ios 如何使用Firebase云功能通知负载重置应用程序图标的徽章号?,ios,swift,firebase,google-cloud-functions,Ios,Swift,Firebase,Google Cloud Functions,当前行为:UserA发送另一条userB消息,当应用程序处于后台时触发通知,随着更多消息触发通知,徽章号增加。UserB打开通知,徽章值设置为0并最小化应用程序。用户A向用户B发送另一条消息,而用户B应用程序处于后台时,徽章值不会重置为1,而是从上次累积值继续 期望的行为:当userB接收到新通知时,将标记值从1递增,而不是从上次累积的通知标记值递增 进一步:我已经检查了firebase负载,看起来负载正在发送累积值,而不是在userB已经将值设置为0客户端之后重置该值 云功能如下: 常量函数

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

期望的行为:当userB接收到新通知时,将标记值从1递增,而不是从上次累积的通知标记值递增

进一步:我已经检查了firebase负载,看起来负载正在发送累积值,而不是在userB已经将值设置为0客户端之后重置该值

云功能如下:

常量函数=需要“firebase-functions”; const admin=需要“firebase-admin”; admin.initializeAppfunctions.config.firebase; var badgeCount=1; exports.sendNotification=functions.database.ref'/Notifications/Messages/{pushId}'。onWritechange,context=>{ 日志“为测试触发的推送通知事件”; console.logchange; const message=change.after.val; const senderUid=message.Sender; const receiverUid=message.SendTo; const chatMessage=message.message; const senderName=message.senderName; console.logreceiveuid; 常量承诺=[]; console.log'notifying'+receiverUid+'about'+chatMessage+'from'+senderUid; 常数有效载荷={ 通知:{ 标题:senderName, 正文:聊天信息, 徽章:badgeCount.toString, 声音:默认值 } }; badgeCount++; 返回管理员 数据库 .reffcmToken.childReceiveUID .oncevalue .ThenalToken=>{ 如果allToken.val{ const token=Object.keysallToken.val; log`token?${token}`; 返回管理员 .信息 .sendToDevicetoken,有效负载 .thenresponse=>{ 返回null; }; } 返回null; }; }; 在应用程序中,我使用UIApplication.shared.applicationIconBadgeNumber=0在打开应用程序时将其重置为0

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

但是,下次发送通知时,徽章值将再次从上一个递增值开始,例如g5而不是1。有人能解释一下这里发生了什么吗

在这里,当收到推送通知时,您不能从应用程序端更新徽章计数器

当收到推送通知时,iOS会使用推送通知有效负载的badge参数值自动更新应用程序图标上的badge计数器。所以,目前,您似乎在所有通知中为badge发送相同的值。所以,如果你发送徽章值5。每次,徽章值将更新为5

所以,您需要从firebase函数在通知负载中发送正确的徽章值


有关徽章参数的更多详细信息,请参阅本谷歌文档。

解决firebase问题的三个部分

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

二,。在客户端上实现逻辑,以根据用户操作更新数据库中的通知字段


三,。Handle更新客户端上的徽章编号

我在云函数中有一个增量变量count,用于增加有效负载中的徽章值,数字5就是一个例子。我的客户端确实在重置徽章,但cloud函数变量使计数器继续运行,并且它只是不断增加。我应该如何处理呢?通知计数由负载内的云函数在服务端处理,因此是无服务器通知。你是说我应该创建另一个数据库来处理firebase通知?你需要一种方法来跟踪多个会话中的通知。在用于跟踪有效负载去向的相同数据结构中存储通知计数。我已经解决了这个问题,希望现在更容易理解。