CKModifyBadgeOperation 在 iOS 中已弃用 11.有人知道替代方法吗?

CKModifyBadgeOperation is deprecated in iOS 11. Anyone know an alternative approach?

我已经搜索过了,找不到例子。我也试过改编这段代码(在别处推荐(CloudKit won't reset my badge count to 0):

func resetBadgeCounter() {
    let badgeResetOperation = CKModifyBadgeOperation(badgeValue: 0)
    badgeResetOperation.modifyBadgeCompletionBlock = { (error) -> Void in
        if error != nil {
            print("Error resetting badge: \(String(describing: error))")
        }
        else {
            UIApplication.shared.applicationIconBadgeNumber = 0
        }
    }
    CKContainer.default().add(badgeResetOperation)
}

这目前有效,但不再受支持,可能很快就会消失。

我想也许我应该使用 CKModfyRecordsOperation 或其他一些 CKDatabaseOperation,但我什至猜不到如何使用。

最好只跟踪您正在计数的项目并自行设置应用徽章计数。我引用了一个包含我的项目的本地数据库,我 return 总数并相应地设置了我的应用徽章。

我希望这对某人有所帮助,因为似乎没有另一个 solution/workaround。

  1. 为您的应用创建一个通知服务扩展 (UNNotificationServiceExtension)。它相当简单,在 Modifying Content in Newly Delivered Notifications 中有详细描述。如果您对传入通知进行任何类型的处理,您可能已经有一个。

  2. 在扩展中,您通常会在 override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) 中完成通知的所有处理。 request 带有通知的 content,其中包括 徽章编号 。然后您可以修改它并传递给要显示的 contentHandler。 (如果您不确定如何操作,请查看上面的 link;它有详细的说明和代码。

  3. 要跟踪并在需要时重置徽章编号,您需要利用应用组(例如 group.com.tzatziki)。这样您就可以在应用程序和扩展程序之间共享数据。在 Xcode 中创建应用程序组可以通过添加相关的 功能 来完成,并在 App Extension Programming Guide: Handling Common Scenarios.

    中进行了解释
  4. 使用存储机制(在应用程序组内)来跟踪徽章计数,例如UserDefaults,并在扩展中使用它来更新徽章计数。在前面提到的 override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) 中,你可以这样写:

    let badgeNumber = UserDefaults(suiteName: "group.com.tzatziki")?.value(forKey: "badgeNumber") as? NSNumber ?? NSNumber(integerLiteral: 0)
    let badgeNumberInt = badgeNumber.intValue + 1
    notificationContent.badge = NSNumber(value: badgeNumberInt)
    UserDefaults(suiteName: "group.io.prata")?.setValue(notificationContent.badge, forKey: "badgeNumber")
    

其中 notificationContentUNMutableNotificationContent 的实例,源自 request.content.mutableCopy() as? UNMutableNotificationContent

  1. 现在,唯一剩下要做的就是在您的应用、共享 UserDefaultsUIApplication.shared.applicationIconBadgeNumber.
  2. 中重置徽章计数

干杯!