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, который по своей сути устанавливает контейнер на операцию перед ее выполнением. Кроме того, он запускается во внутренней очереди, что дает дополнительное преимущество: он предотвращает одновременное выполнение нескольких операций, что может привести к конфликтам.

Другие вопросы по тегам