我已经尝试了很多东西,似乎无法重置来自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];
再次没有运气......
任何建议都将不胜感激! 谢谢, 克里斯
答案 0 :(得分:13)
您需要在处理通知后执行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)
}
答案 1 :(得分:0)
如果您没有在其上设置容器,徽章和通知操作将失败。由于您没有使用完成块,因此您没有看到错误(您使用的是默认的NSOperation完成块,这是错误的并且没有任何错误参数)。查看这些操作的标头以查看完成块语法。
更好的方法是通过addOperation方法将操作添加到容器中,这在运行它之前固有地设置容器。此外,它还在内部队列上运行,该队列具有额外的优势,可防止同时运行多个操作,从而导致冲突。