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