13

我已经搜索过了,我找不到一个例子。我也尝试过调整此代码(在其他地方推荐(CloudKit 不会将我的徽章计数重置为 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,但我什至无法猜测如何。

4

2 回答 2

1

我希望这对某人有所帮助,因为似乎没有另一种解决方案/解决方法。

  1. 为您的应用创建通知服务扩展( )。UNNotificationServiceExtension它相当简单,在修改新发送的通知中的内容中有详细描述。如果您对传入的通知进行任何类型的处理,您可能已经拥有一个。

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

  3. 要在需要时跟踪和重置徽章编号,您需要利用应用程序组(例如group.com.tzatziki)。通过这种方式,您可以在应用程序和扩展程序之间共享数据。在 Xcode 中创建应用程序组可以通过添加相关功能来完成,并在应用程序扩展编程指南:处理常见场景中进行了说明。

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

notificationContent的实例在哪里UNMutableNotificationContent,源自request.content.mutableCopy() as? UNMutableNotificationContent

  1. 现在,唯一剩下要做的就是在您的应用程序、共享UserDefaultsUIApplication.shared.applicationIconBadgeNumber.

干杯!

于 2020-09-21T20:04:30.500 回答
-1

最好只跟踪您计数的项目并自己设置应用程序徽章计数。我引用了一个包含我的项目的本地数据库,然后我返回总数并相应地设置我的应用程序徽章。

于 2018-08-31T04:40:05.503 回答