CKModifyBadgeOperation устарела в iOS 11. Кто-нибудь знает альтернативный подход?
Я искал, и я не могу найти пример. Я также попытался адаптировать этот код (рекомендуется в другом месте ( 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, но я даже не могу догадаться, как.
3 ответа
Вероятно, лучше всего отслеживать элементы, которые вы считаете, и устанавливать счетчик значков приложения самостоятельно. Я ссылаюсь на локальную базу данных, в которой есть мои элементы, и возвращаю итоги и соответственно устанавливаю значок приложения.
Надеюсь, это поможет кому-то, поскольку другого решения / обходного пути, похоже, нет.
Создайте расширение службы уведомлений (
UNNotificationServiceExtension
) для вашего приложения. Это довольно просто и подробно описано в разделе "Изменение содержимого в недавно доставленных уведомлениях". Возможно, он у вас уже есть, если вы выполняете какую-либо обработку входящих уведомлений.Внутри расширения вы обычно делаете всю обработку уведомления в
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)
. Вrequest
идет сcontent
уведомления, в котором указан номер значка. Затем вы можете изменить это и перейти кcontentHandler
для отображения. (Если вы не знаете, как это сделать, проверьте ссылку выше; в ней есть подробные инструкции и код.)Чтобы отслеживать и при необходимости сбрасывать номер значка, вам необходимо воспользоваться группой приложений (например,
group.com.tzatziki
). Таким образом вы можете обмениваться данными между приложением и расширением. Создание группы приложений в Xcode может быть выполнено путем добавления соответствующей возможности, что объясняется в Руководстве по программированию расширений приложений: Обработка общих сценариев.Используйте механизм хранения (в группе приложений) для отслеживания количества значков, например
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
.
Ура!
Здесь сообщалось: https://levelup.gitconnected.com/how-to-reset-badge-value-of-cloudkit-remote-notification-on-ios-ipados-15-46726a435599 , что Apple знает, что им необходимо поддерживать CKModifyBadgeOperation, пока они не придумают замену API. Другого решения этой проблемы нет, потому что CloudKit сбрасывает номер значка всякий раз, когда отправляет новое уведомление.