如何在iOS推送通知上进行徽章增量

时间:2016-07-20 09:55:44

标签: ios push-notification swift2 badge

我目前正在从有效载荷中获得徽章。但是我怎样才能更新这个价值。

stopf

当我发送它时,它总是在徽章编号中显示1但是当我进入应用程序并退出它时会更新。正因为如此,

{"aps":
    {"alert":"Notification Hub test notification2",
     "badge":1,
     "sound":"Default"}
}

但是当我发送新推送通知时,它再次在图标中显示1作为徽章编号。 我应该怎么做,据我所知,我发送有效载荷时应该发送更新的徽章。为此,我必须处理后端。

除此之外是否有任何建议可以处理内部应用程序?

9 个答案:

答案 0 :(得分:5)

如果您的项目具有通知扩展名,则可以在其中进行徽章设置。

首先启用应用程序组,并从UserDefaults的应用程序通知服务扩展中保存您的徽章计数。我们正在使用应用程序组,因为打开应用程序时需要清除AppDelegate中的徽章计数。 您还可以通过通知服务扩展将徽章的值设置为bestAttemptContent.badge

在通知服务扩展中:

if let userDefaults = UserDefaults(suiteName: "group.com.bundle.appname") {

    let badgeCount = userDefaults.integer(forKey: "badgeCount")
    if badgeCount > 0 {
        userDefaults.set(badgeCount + 1, forKey: "badgeCount")
        bestAttemptContent.badge = badgeCount + 1 as NSNumber
    } else {

        userDefaults.set(1, forKey: "badgeCount")
        bestAttemptContent.badge = 1
    }
}

在AppDelegate中,您可以清除徽章...,并在userdefaults上将徽章的值设置为零

if let userDefaults = UserDefaults(suiteName: "group.com.bundle.appname") {
    userDefaults.set(0, forKey:"badgecount")
}
UIApplication.shared.applicationIconBadgeNumber = 0

答案 1 :(得分:4)

我的方式是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});
    ...
    })

答案 2 :(得分:3)

我会帮助你:

我的计划是使用KVO来倾听[UIApplication sharedApplication].applicationIconBadgeNumber

- (void)setupBadgeOperation {
    [[UIApplication sharedApplication] addObserver:self forKeyPath:@"applicationIconBadgeNumber" options:NSKeyValueObservingOptionNew context:nil];
}

一旦价值发生变化,我会使用[[NSNotificationCenter defaultCenter] postNotificationName:STATUS_BADGENUMBER_CHANGED object:nil]通知用户界面需要修改徽章更改的位置。

- (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

一个。应用程序是前景
湾app是背景
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];
}

这就是全部,对我来说效果很好。

答案 3 :(得分:1)

将您的徽章计入NSUserDefault以获得最大可用性。即使您重新启动设备,您也可以从NSUserDefault获得徽章计数。

当你获得另一个有效载荷时,你可以继续增加NSUserDefault中的徽章数量。

答案 4 :(得分:0)

当我们使用推送通知时。 我们必须更新其徽章数量。否则每个时间徽章都是一样的。 例如如果您收到通知,其计数为1并且您已阅读它仍会显示徽章1.因此,您必须清除徽章。 通过使用这样的代码,

  func applicationDidBecomeActive(application: UIApplication) {
        application.applicationIconBadgeNumber = 0
    }

答案 5 :(得分:0)

首先,请将它留给您的服务器人员,以便向您发送更新的徽章计数器。你的工作只是展示它,而不是为了保持它。

您需要在applicationDidReceiveRemoteNotifications委托方法中执行更新操作,如下所示:

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
    }

这是假设您的服务器向您发送更新的推送徽章计数器。在中,我会做类似的事情向服务器传达推送计数器现在必须设置为零:

var currentInstallation = PFInstallation.currentInstallation()
      if currentInstallation.badge != 0 {
        currentInstallation.badge = 0
        currentInstallation.save
       }

如果我不这样做,服务器会认为Push还没有被读过,并且会在下一次推送时增加徽章计数器,依此类推。

答案 6 :(得分:0)

服务器必须在@"badge"密钥中增加很多计数。当您打开应用程序时,您需要向服务器发送请求 - 重置推送计数器(徽章)。在applicationDidBecomeActive方法。

{"aps":
    {"alert":"Notification Hub test notification2",
     "badge":20,
     "sound":"Default"}
}

答案 7 :(得分:0)

要处理徽章,最好的解决方案是使用通知扩展名,您可以创建一个。通知扩展程序,还可以使用KVO更新应用中的徽章。 和应用程序组,用于保存徽章数量并在应用程序中进行管理。 收到通知时,您可以阅读有多少通知,并在其中添加通知标志并更新其通知

guard let content =(request.content.mutableCopy()as?UNMutableNotificationContent)否则{ contentHandler(request.content) 返回 }

    if let badge = bestAttemptContent?.badge as? Int {
        let newBadge = badge + NotificationManangerBridge.shared.getTotalBadge()
        content.badge = NSNumber(value: newBadge)
        NotificationManangerBridge.shared.updateTotalBadge(badgeCount: newBadge)

    } else {
        content.badge = 0
    }
    guard let notification = bestAttemptContent?.copy() as? UNNotificationContent else { return }
    contentHandler(notification)

答案 8 :(得分:-2)

你正朝着正确的方向前进。您必须更新有效负载中的徽章编号,这是推送通知的标准方式。