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。
为您的应用创建一个通知服务扩展 (UNNotificationServiceExtension
)。它相当简单,在 Modifying Content in Newly Delivered Notifications 中有详细描述。如果您对传入通知进行任何类型的处理,您可能已经有一个。
在扩展中,您通常会在 override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)
中完成通知的所有处理。 request
带有通知的 content
,其中包括 徽章编号 。然后您可以修改它并传递给要显示的 contentHandler
。 (如果您不确定如何操作,请查看上面的 link;它有详细的说明和代码。)
要跟踪并在需要时重置徽章编号,您需要利用应用组(例如 group.com.tzatziki
)。这样您就可以在应用程序和扩展程序之间共享数据。在 Xcode 中创建应用程序组可以通过添加相关的 功能 来完成,并在 App Extension Programming Guide: Handling Common Scenarios.
中进行了解释
使用存储机制(在应用程序组内)来跟踪徽章计数,例如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
- 现在,唯一剩下要做的就是在您的应用、共享
UserDefaults
和 UIApplication.shared.applicationIconBadgeNumber
. 中重置徽章计数
干杯!
我已经搜索过了,找不到例子。我也试过改编这段代码(在别处推荐(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。
为您的应用创建一个通知服务扩展 (
UNNotificationServiceExtension
)。它相当简单,在 Modifying Content in Newly Delivered Notifications 中有详细描述。如果您对传入通知进行任何类型的处理,您可能已经有一个。在扩展中,您通常会在
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)
中完成通知的所有处理。request
带有通知的content
,其中包括 徽章编号 。然后您可以修改它并传递给要显示的contentHandler
。 (如果您不确定如何操作,请查看上面的 link;它有详细的说明和代码。)要跟踪并在需要时重置徽章编号,您需要利用应用组(例如
中进行了解释group.com.tzatziki
)。这样您就可以在应用程序和扩展程序之间共享数据。在 Xcode 中创建应用程序组可以通过添加相关的 功能 来完成,并在 App Extension Programming Guide: Handling Common Scenarios.使用存储机制(在应用程序组内)来跟踪徽章计数,例如
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
- 现在,唯一剩下要做的就是在您的应用、共享
UserDefaults
和UIApplication.shared.applicationIconBadgeNumber
. 中重置徽章计数
干杯!