CloudKit не сбрасывает счетчик 0
Я пробовал несколько вещей и не могу сбросить счетчик значков из уведомлений, приходящих из cloudKit. Кто-нибудь еще сталкивался с этой проблемой. Вот что я попробовал:
1) Установите количество значков локально на 0
application.applicationIconBadgeNumber = 0; (temporarily removes the badge count).
Неудачно...
2) Позвоните на сервер, чтобы очистить счетчик значков
CKModifyBadgeOperation *oper = [[CKModifyBadgeOperation alloc] initWithBadgeValue:0];
[oper start];
Неудачно...
3) Вытащите все уведомления об изменениях и отметьте их как прочитанные.
NSMutableArray *array = [NSMutableArray array];
CKFetchNotificationChangesOperation *operation = [[CKFetchNotificationChangesOperation alloc] initWithPreviousServerChangeToken:nil];
operation.notificationChangedBlock = ^(CKNotification *notification) {
[array addObject:notification.notificationID];
};
operation.completionBlock = ^{
CKMarkNotificationsReadOperation *op = [[CKMarkNotificationsReadOperation alloc] initWithNotificationIDsToMarkRead:array];
[op start];
};
[operation start];
И опять не повезло...
Любые предложения будут ценны! Спасибо Крис
2 ответа
Вам нужно выполнить CKModifyBadgeOperation после обработки ваших уведомлений.
Вот моя функция Swift, которую я вызываю после пометки всех уведомлений как прочитанных. Я добавляю операцию в defaultContainer вместо того, чтобы просто ее запустить - интересно, это что-то меняет.
func resetBadgeCounter() {
let badgeResetOperation = CKModifyBadgeOperation(badgeValue: 0)
badgeResetOperation.modifyBadgeCompletionBlock = { (error) -> Void in
if error != nil {
println("Error resetting badge: \(error)")
}
else {
UIApplication.sharedApplication().applicationIconBadgeNumber = 0
}
}
CKContainer.defaultContainer().addOperation(badgeResetOperation)
}
Операции со значком и уведомлением завершатся неудачно, если вы не установите контейнер для него. Поскольку вы не используете блоки завершения, вы не видите ошибки (вы используете блок завершения по умолчанию NSOperation, который является неправильным и не имеет никакого параметра ошибки). Посмотрите на заголовки для этих операций, чтобы увидеть синтаксис блока завершения.
И лучший способ - добавить операцию в контейнер с помощью метода addOperation, который по своей сути устанавливает контейнер на операцию перед ее выполнением. Кроме того, он запускается во внутренней очереди, что дает дополнительное преимущество: он предотвращает одновременное выполнение нескольких операций, что может привести к конфликтам.