Cloudkit: значение значка CKNotificationInfo никогда не уменьшается

Я установил уведомления о подписке для cloudkit. Вот мой код:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"];
    CKSubscription *subscription = [[CKSubscription alloc]
                                    initWithRecordType:recordType
                                    predicate:predicate
                                    options:CKSubscriptionOptionsFiresOnRecordCreation];
    CKNotificationInfo *notificationInfo = [CKNotificationInfo new];
    notificationInfo.alertLocalizationKey =@"New record in cloudKit";
    notificationInfo.shouldBadge = YES;
    notificationInfo.soundName = UILocalNotificationDefaultSoundName;
    notificationInfo.shouldSendContentAvailable = YES;
    subscription.notificationInfo = notificationInfo;
    CKContainer *container = [CKContainer defaultContainer];
    CKDatabase *publicDatabase = [container publicCloudDatabase];
    [publicDatabase saveSubscription:subscription
                   completionHandler:^(CKSubscription *subscription, NSError *error) {
                       if (!error)
                       {
                           NSLog(@"no error");
                       }
                       else
                       {
                           NSLog(@"error%@", error);
                       }

                       }];

и работает просто отлично. Проблема заключается в значках, они выглядят так, как будто cloudKit не сбрасывает номер значка и продолжает увеличиваться, даже когда я устанавливаю количество значков на ноль.

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    application.applicationIconBadgeNumber = 0;
}

Когда приложение получило новое уведомление, оно изменяется с 0 на 5 (а каждое новое уведомление увеличивается на 1, в следующий раз будет 6)

Любой из вас знает, как следить за правильным количеством значков из облачного набора (в Objective-C)

2 ответа

Это дубликат CloudKit не сбрасывает счетчик 0

Ответ был следующим: вам нужно выполнить операцию 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)
}

Это поможет.

CKModifyBadgeOperation *badgeResetOperation = [[CKModifyBadgeOperation alloc] initWithBadgeValue:0];
[badgeResetOperation setModifyBadgeCompletionBlock:^(NSError * operationError) {
    if (!operationError) {
        [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
    }
}];
[[CKContainer defaultContainer] addOperation:badgeResetOperation];
Другие вопросы по тегам