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

问题描述 投票:2回答:7

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

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

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

func applicationDidBecomeActive(application: UIApplication) {
        UIApplication.sharedApplication().applicationIconBadgeNumber = UIApplication.sharedApplication().applicationIconBadgeNumber + 1
    }

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

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

ios push-notification swift2 badge
7个回答
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});
    ...
    })

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]通知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];
}

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


1
投票

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

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


0
投票

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

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

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
    }

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

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

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


0
投票

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

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

-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.