如何在iOS推送通知上进行徽章增量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在iOS推送通知上进行徽章增量相关的知识,希望对你有一定的参考价值。
我目前正在从有效载荷中获得徽章。但是我怎样才能更新这个价值。
{"aps":
{"alert":"Notification Hub test notification2",
"badge":1,
"sound":"Default"}
}
当我发送它时,它总是在徽章编号中显示1但是当我进入应用程序并退出时它会更新。正因为如此,
func applicationDidBecomeActive(application: UIApplication) {
UIApplication.sharedApplication().applicationIconBadgeNumber = UIApplication.sharedApplication().applicationIconBadgeNumber + 1
}
但是当我发送新的推送通知时,它再次在图标中显示1作为徽章编号。我应该怎么做,据我所知,我发送有效载荷时应该发送更新的徽章。为此,我必须处理后端。
除此之外是否有任何建议可以处理内部应用程序?
我的方式是Swift:
1)启动应用程序后,您需要将徽章(您可以随意调用的变量)设置为零到Firebase实时数据库中。另外设置application.applicationIconBadgeNumber = 0.以下是我在AppDelegate中的操作方法:
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
application.applicationIconBadgeNumber = 0
// Reset badge number to zero
let userID = Auth.auth().currentUser?.uid
let dbRef = Database.database().reference()
dbRef.child("Users Info").child(userID!).updateChildValues(["badge":"0"], withCompletionBlock: { (err, ref) in
if err != nil {
print(err!)
return
}
})
}
2)转到触发函数的index.js。
...
return admin.database().ref('/Users Info/' + owner).once('value', snapshot => {
var ownerValue = snapshot.val();
var badgeNumber = parseInt(ownerValue.badge) + 1;
// Notification details.
const payload = {
notification: {
title: 'You have a new request!',
body: `A new request from ${downedBy.name}.`,
badge:`${badgeNumber}`,
sound: 'default',
}
};
...
...
// Upload the new value of badge into Firebase to keep track of the number
return admin.database().ref('/Users Info/' + owner).update({badge:badgeNumber});
...
})
我会帮助你:
我的计划是用KVO来听[UIApplication sharedApplication].applicationIconBadgeNumber
- (void)setupBadgeOperation {
[[UIApplication sharedApplication] addObserver:self forKeyPath:@"applicationIconBadgeNumber" options:NSKeyValueObservingOptionNew context:nil];
}
一旦价值发生变化,我就会使用[[NSNotificationCenter defaultCenter] postNotificationName:STATUS_BADGENUMBER_CHANGED object:nil]
通知UI需要修改徽章的更改。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *, id> *)change context:(void *)context {
if ([keyPath isEqualToString:@"applicationIconBadgeNumber"]) {
[[NSNotificationCenter defaultCenter] postNotificationName:STATUS_BADGENUMBER_CHANGED object:nil];
}
}
有三种情况接收远程通知以更改[UIApplication sharedApplication].applicationIconBadgeNumber
。
一个。应用程序是前景 湾应用程序是背景 C。应用程序未启动
在a和b的情况下,将调用此方法:
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
void(^tapBlock)(void(^completeHandler)()) = ^(void(^completeHandler)()) {
// here I remove some code not related with the question
NSNumber *badgeNumber = userInfo[@"aps"][@"badge"];
[UIApplication sharedApplication].applicationIconBadgeNumber = badgeNumber.integerValue;
}
在这种情况下,没有办法获得回调,所以我会手动完成。
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[NSNotificationCenter defaultCenter] postNotificationName:STATUS_BADGENUMBER_CHANGED object:nil];
}
这就是全部,对我来说效果很好。
将您的徽章计入NSUserDefault以获得最大可用性。即使您重新启动设备,您也可以从NSUserDefault获得徽章计数。
当您获得另一个有效负载时,您可以继续增加NSUserDefault中的徽章计数。
当我们使用推送通知时。我们必须更新其徽章数量。否则每个时间徽章都是一样的。例如如果您收到通知,其计数为1并且您已阅读它仍会显示徽章1.因此,您必须清除徽章。通过使用这样的代码,
func applicationDidBecomeActive(application: UIApplication) {
application.applicationIconBadgeNumber = 0
}
首先,留给您的服务器人员发送更新的徽章计数器。你的工作只是展示它,而不是为了保持它。
您需要在applicationDidReceiveRemoteNotifications
Delegate方法中执行更新操作,如下所示:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]){
let notification = userInfo["aps"] as? NSDictionary
let badge = (notification["badge"] as String).toInt()
UIApplication.sharedApplication().applicationIconBadgeNumber = UIApplication.sharedApplication().applicationIconBadgeNumber + badge;
}
在你的DidBecomeActive
方法:
func applicationDidBecomeActive(application: UIApplication) {
if(UIApplication.sharedApplication().applicationIconBadgeNumber!=0){
UIApplication.sharedApplication().applicationIconBadgeNumber = 0
}
这是假设您的服务器向您发送更新的推送徽章计数器。在parse.com中,我会做这样的事情向服务器传达推送计数器现在必须设置为零:
var currentInstallation = PFInstallation.currentInstallation()
if currentInstallation.badge != 0 {
currentInstallation.badge = 0
currentInstallation.save
}
如果我不这样做,Server会认为Push还没有被读过,并且会在下一次推送时增加徽章计数器,依此类推。
服务器必须在@"badge"
密钥中增加很多计数。当您打开应用程序时,您需要向服务器发送请求 - 重置推送计数器(徽章)。在applicationDidBecomeActive
方法。
{"aps":
{"alert":"Notification Hub test notification2",
"badge":20,
"sound":"Default"}
}
你正朝着正确的方向前进。您必须更新有效负载中的徽章编号,这是推送通知的标准方式。
以上是关于如何在iOS推送通知上进行徽章增量的主要内容,如果未能解决你的问题,请参考以下文章