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

gajydyqb  于 2022-11-06  发布在  Swift
关注(0)|答案(9)|浏览(225)

我目前正在从有效载荷获取徽章。但我如何更新该值。

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

当我发送此消息时,徽章编号始终显示为1,但当我进入应用程序并退出时,徽章编号会得到更新。正因为如此,

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

但当我发送一个新的推送通知,它再次显示1作为徽章号码的图标。我应该怎么做,我的理解,我应该发送更新徽章时,我发送的有效载荷。为此,我必须处理后端。
除此之外,是否还有其他建议来处理内部应用程序?

7xllpg7q

7xllpg7q1#

如果您的项目具有通知扩展,则可以在其中进行标记设置。
首先,启用应用程序组并将应用程序通知服务扩展中的徽章计数保存在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中,您可以清除标记...并将标记的值设置为用户默认值的零

if let userDefaults = UserDefaults(suiteName: "group.com.bundle.appname") {
    userDefaults.set(0, forKey:"badgeCount") // "change "badgecount" to be "badgeCount"
}
UIApplication.shared.applicationIconBadgeNumber = 0
1cosmwyk

1cosmwyk2#

我将给予你我的方式:
我的计划是使用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的情况。
a.应用程序是前台
B.应用程序在后台
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;
}

在c的情况下,没有办法得到回调,所以我将手动完成。

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[NSNotificationCenter defaultCenter] postNotificationName:STATUS_BADGENUMBER_CHANGED object:nil];
}

就这样,对我来说很好。

8wtpewkr

8wtpewkr3#

这里我的方式斯威夫特:
1)启动应用程序后,您需要在Firebase Realtime数据库中将badge(一个您可以随意调用的变量)设置为零。另外,还要设置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});
    ...
    })
htzpubme

htzpubme4#

首先,让你的服务器人员给你发送更新的徽章计数器。你的工作只是展示它,而不是在你的一端维护它。
您需要在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
    }

这是假设你的服务器向你发送更新的push badge计数器。在parse.com中,我会做类似这样的事情来向服务器传达push计数器现在必须设置为零:

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

如果我不这样做,服务器将假定Push从未被读取过,并将在下一次Push时增加其端的徽章计数器,依此类推。

vd2z7a6w

vd2z7a6w5#

在NSUserDefault中保留标记计数以获得最大可用性。即使重新启动设备,也可以从NSUserDefault获取标记计数。
当您获得另一个有效负载时,您可以继续增加NSUserDefault中的徽章计数。

zlhcx6iw

zlhcx6iw6#

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

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

6ovsh4lw7#

每当我们使用推送通知时,我们必须更新其徽章计数。否则,每次徽章都将相同。例如,如果您收到一个通知,其计数为1,而您阅读它时,它仍将显示徽章1。因此,您必须清除徽章。通过使用类似于以下代码,

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

lymnna718#

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

guard let content = (request.content.mutableCopy() as? UNMutableNotificationContent) else {
        contentHandler(request.content)
        return
    }

    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)
m1m5dgzv

m1m5dgzv9#

你的方向是正确的。你必须从你的有效载荷中更新徽章号码,这是推送通知的标准方式。

相关问题