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];

И снова не повезло...

Любые предложения будут ценны! Спасибо, Крис


person Chris Gokey    schedule 04.08.2014    source источник
comment
У меня такая же проблема, но к сожалению нет решения. Я получаю внутреннюю ошибку сервера при запуске CKModifyBadgeOperation.   -  person yuzer    schedule 07.07.2015


Ответы (2)


Вам необходимо выполнить операцию CKModifyBadgeOperation после обработки ваших уведомлений.

Вот моя функция Swift, которую я вызываю после пометки всех уведомлений как прочитанных. Я добавляю операцию в контейнер по умолчанию, а не просто запускаю ее - интересно, это имеет какое-то значение.

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)
}
person SarahR    schedule 22.09.2014
comment
Да, но теперь CKModifyBadgeOperation устарела. Есть ли работа вокруг? Это проблема с уведомлениями CloudKit, которые сохраняют свой номер значка. Сброс его на устройстве не работает. - person Peter B. Kramer; 21.03.2019
comment
@PeterB.Kramer PeterB.Kramer Вы нашли какое-либо решение/замену для этого устаревшего API? - person m.gansrigler; 18.03.2021
comment
Нет. Я все еще использую его как устаревший API. - person Peter B. Kramer; 19.03.2021

Операции со значком и уведомлением завершатся сбоем, если вы не установите для него контейнер. Поскольку вы не используете блоки завершения, вы не видите ошибку (вы используете блок завершения NSOperation по умолчанию, который является неправильным и не имеет никакого параметра ошибки). Посмотрите на заголовки этих операций, чтобы увидеть синтаксис блока завершения.

И лучший способ — добавить операцию в контейнер с помощью метода addOperation, который по своей сути устанавливает контейнер для операции перед ее запуском. Кроме того, затем он запускается во внутренней очереди, что имеет дополнительное преимущество: предотвращает одновременное выполнение нескольких операций, что может привести к конфликтам.

person malhal    schedule 10.02.2016