18

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

我正在这样做:

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

任何建议都是可观的...

4

5 回答 5

33

当您收到类似于以下内容的 JSON 通知负载时,操作系统会设置徽章编号:

{
    "aps" : {
        "alert" : "New notification!",
        "badge" : 2
    }
}

如您所见,负责在badge密钥中设置正确数字的是服务器。您的服务器需要跟踪或计算每个用户的待处理通知数量,并badge在将通知发送给 Apple 之前生成该数量。

客户端的职责是在用户看到通知时清除通知标记或减少通知标记。这样做的代码是

application.applicationIconBadgeNumber = application.applicationIconBadgeNumber - 1; // Decrement counter

或者

application.applicationIconBadgeNumber = 0; // Reset counter assuming the user is able to see all notifications at once.
于 2013-04-18T07:46:10.683 回答
6

您可以改为创建一个静态变量,并将其分配给 applicationIconBadgeNumber:

static int i=1;
[UIApplication sharedApplication].applicationIconBadgeNumber = i++;
于 2014-04-10T02:33:33.913 回答
4

我有同样的问题并通过创建 int 解决了它。class.h 中的变量

像这样 :

自定义类.H

@property int badge;

自定义类.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 如果这有帮助:)

于 2013-04-27T16:16:49.010 回答
3

只有当-(void)application:didReceiveRemoteNotification:您的应用在前台运行时才会调用。

如果您希望在您的应用程序未运行时增加徽章,您应该在推送通知有效负载中设置徽章编号。您应该在那里跟踪徽章编号服务器端,因为badge推送通知有效负载的属性将用作徽章编号。它不会为您增加徽章编号。

由于系统会处理传入的推送通知,因此您的应用不会收到收到的推送通知的通知。只有当您的应用程序在前台运行时才会 -(void)application:didReceiveRemoteNotification:被调用。当它不在前台时,无法让您的应用程序响应推送通知。

于 2013-04-18T07:35:46.120 回答
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
于 2019-11-12T13:04:14.150 回答