应用程序图标徽章编号不增加:Xcode

时间:2013-04-18 06:47:57

标签: objective-c push-notification badge

我遇到推送通知应用程序徽章编号值更新的问题。

我在做:

-(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”,并且当有更多通知/一个接一个通知时,它不会递增。

任何建议都值得赞赏......

5 个答案:

答案 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