我遇到推送通知应用程序徽章编号值更新的问题。
我在做:
-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
UIApplicationState state = [application applicationState];
if (state == UIApplicationStateActive) {
// do stuff when app is active
}else{
// do stuff when app is in background
[UIApplication sharedApplication].applicationIconBadgeNumber =
[UIApplication sharedApplication].applicationIconBadgeNumber+1;
/* to increment icon badge number */
}
}
但是,该图标始终将徽章编号显示为“1”,并且当有更多通知/一个接一个通知时,它不会递增。
任何建议都值得赞赏......
答案 0 :(得分:32)
当您收到类似于以下内容的JSON通知有效负载时,操作系统会设置徽章编号:
{
"aps" : {
"alert" : "New notification!",
"badge" : 2
}
}
如您所见,服务器负责在badge
密钥中设置正确的数字。您的服务器需要跟踪或计算每个用户的待处理通知数,并在向Apple发送通知之前生成badge
号码。
客户的责任是在用户看到通知时清除通知徽章或减少通知徽章。这样做的代码是
application.applicationIconBadgeNumber = application.applicationIconBadgeNumber - 1; // Decrement counter
或
application.applicationIconBadgeNumber = 0; // Reset counter assuming the user is able to see all notifications at once.
答案 1 :(得分:6)
您可以改为创建静态变量,并将其分配给applicationIconBadgeNumber:
static int i=1;
[UIApplication sharedApplication].applicationIconBadgeNumber = i++;
答案 2 :(得分:4)
我遇到了同样的问题并通过创建int来解决它。 class.h中的变量
像这样:自定义class.H
@property int badge;
自定义class.M
-(id)init{
_badge=0;
self = [super init];
if (self) {
}
return self;}
-(void)reminderCreator:(NSDate*)onTime withText:(NSString*)text{
_badge += 1;
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = onTime;
localNotification.alertBody = text;
localNotification.soundName=UILocalNotificationDefaultSoundName;
localNotification.applicationIconBadgeNumber=_badge;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; }
所以如果你在某个地方(可能在你的viewController上)初始化这个自定义类,然后多次调用reminderCreator方法来设置几个localNotifications,它会为每个通知分配递增的数字。
+1,如果这有帮助:)
答案 3 :(得分:3)
只有当您的应用在前台运行时才会调用-(void)application:didReceiveRemoteNotification:
。
如果您希望在应用未运行时增加徽章,则应在push notification payload中设置徽章编号。
您应该在那里跟踪徽章编号服务器端,因为推送通知有效负载的badge
属性将用作徽章编号。 不会为您增加徽章编号。
由于系统会处理传入的推送通知,因此系统不会通知您的应用已收到推送通知。只有当您的应用程序在前台运行时才会调用-(void)application:didReceiveRemoteNotification:
。当它不在前台时,没有办法让你的app apps来推送通知。
答案 4 :(得分:0)
是的,尽管它的值增加到2,但似乎总是返回badgeNumber 1。
使用此类代码时:
// update badge count
let currentBadgeCount = UIApplication.shared.applicationIconBadgeNumber
let badge = (aps["badge"] as? Int) ?? 1
UIApplication.shared.applicationIconBadgeNumber = currentBadgeCount + badge
所以我认为唯一的解决方案是将其存储在UserDefaults中,然后更新UserDafaults的值,然后将其设置然后更新徽章计数?
这应该有效:
static var notificationsCount: Int {
set {
let userDefaults = UserDefaults(suiteName: SharedAppData.appGroup)
userDefaults?.set(newValue, forKey: "notificationsCount")
UIApplication.shared.applicationIconBadgeNumber = newValue
}
get {
let userDefaults = UserDefaults(suiteName: SharedAppData.appGroup)
return userDefaults?.integer(forKey: "notificationsCount") ?? 0
}
}
然后
SharedAppData.notificationsCount = 0
//重置徽章计数
这会增加
// update badge count
SharedAppData.notificationsCount += 1