Swift - 在应用程序后台时更新本地通知图标徽章数量

5
我正在尝试找出如何在本地通知被传递时动态更新图标徽章数字。在安排通知时注册徽章号码不是一个选项,因为如果在传递任何通知之前注册两个或更多通知,则会导致徽章号码不准确。
UIApplication.shared.applicationIconBadgeNumber // this will be zero 

在通知被送达之前,将始终为零。

我可以使用UNUsernotification代理与func一起使用

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { } 

但是如果应用程序没有激活,这个函数只会被调用一次。 那么如果应用程序没有激活怎么办?

我已经阅读了一些文章,几乎每个人都说没有办法做到这样的事情!但是这真的可能吗?

苹果是如何管理提醒和日历的通知的?它们是本地通知并更新图标徽章吗?还是我犯了一个错误?我相信当本地通知被发送时,必须有一种方式来更新图标徽章。

有什么想法吗?无法相信苹果没有提供一种实现这一点的方法!谢谢!


1
这个问题与您的另一个标题非常相似的问题:UNUserNotification检查徽章数字图标的更改有何不同? - Dávid Pásztor
可能是Swift - UNUsernotification checking changes in BadgeNumberIcon的重复问题。 - Dávid Pásztor
@DávidPásztor 这是一个通用的问题...我想知道这样的事情是否可能...我开了一个新的线程,因为我真的很好奇要理解...如果真的不存在这样的可能性...那么区别在于我试图独立于我的应用问题获取人们的观点。 - Marco
@DávidPásztor 如果您查看您链接的问题,那里提供的解决方案是针对应用程序不在后台运行的情况... - Marco
2个回答

3
为了能够增加重复和计划通知的标记,您应该在配置通知之前增加UIApplication.shared.applicationIconBadgeNumber。
UIApplication.shared.applicationIconBadgeNumber += 1

然后只需简单地执行以下步骤:
let notificationContent = UNMutableNotificationContent()
                notificationContent.title = "Test"
                notificationContent.subtitle = "Test"
                notificationContent.body = "Test"
                notificationContent.sound = UNNotificationSound.default
                notificationContent.badge = UIApplication.shared.applicationIconBadgeNumber as NSNumber

为了每次用户打开应用程序时重置计数器,只需在AppDelegate.swift中将UIApplication.shared.applicationIconBadgeNumber的值设置为0,如下所示:
func applicationWillResignActive(_ application: UIApplication) {

    UIApplication.shared.applicationIconBadgeNumber = 0
}

0

UNMutableNotificationContent有一个叫做badge的属性。在触发通知之前设置此属性即可! Badge数字属性是NSNumber类型,因此递增1有点棘手。

let content = UNMutableNotificationContent()
content.title = NSString.localizedUserNotificationString(forKey:
        "Your Last Time Alarm!", arguments: nil)
content.body = self.userInfo["descripcion"]!
content.sound = UNNotificationSound.default  
content.badge = NSNumber(value: UIApplication.shared.applicationIconBadgeNumber + 1)

接下来设置触发器并添加请求:

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false) 
  let request = UNNotificationRequest(identifier: idNotificacion, content: content, trigger: trigger) 
  let center = UNUserNotificationCenter.current()
  center.add(request) { (error : Error?) in
    if let theError = error {
      print(theError)
    } else {
       ...
    }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接