7

我已经尝试了很多事情,但似乎无法从来自 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];

再次没有运气......

任何建议将不胜感激!谢谢,克里斯

4

2 回答 2

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)
}
于 2014-09-22T06:33:14.940 回答
0

如果您未在其上设置容器,则徽章和通知操作将失败。由于您没有使用完成块,因此您没有看到错误(您使用的是默认的 NSOperation 完成块,这是错误的并且没有任何错误参数)。查看这些操作的标头以查看完成块语法。

更好的方法是通过 addOperation 方法将操作添加到容器中,这在运行之前先将容器设置在操作上。然后它在一个内部队列上运行,它具有额外的优势,它可以防止同时运行多个可能导致冲突的操作。

于 2016-02-10T22:46:53.140 回答