【问题标题】:Cloudkit: CKNotificationInfo badge value never decreaseCloudkit:CKNotificationInfo 徽章值永远不会减少
【发布时间】:2015-01-30 10:44:12
【问题描述】:

我为 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)

你们中的任何人都知道如何从 cloudkit(在 Objective-C 中)跟踪正确的徽章数量​​p>

【问题讨论】:

标签: iphone ipad icloud cloudkit cknotification


【解决方案1】:

这会有所帮助。

CKModifyBadgeOperation *badgeResetOperation = [[CKModifyBadgeOperation alloc] initWithBadgeValue:0];
[badgeResetOperation setModifyBadgeCompletionBlock:^(NSError * operationError) {
    if (!operationError) {
        [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
    }
}];
[[CKContainer defaultContainer] addOperation:badgeResetOperation];

【讨论】:

    【解决方案2】:

    这是CloudKit won't reset my badge count to 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)
    }
    

    【讨论】:

    • 我的项目是objective-c。你可以在objective-c中发布等效的内容吗?
    • 这很好,但现在不推荐使用 CKModifyBadgeOperation。我们现在怎么办?
    • @OwenGodfrey 两年后我也在问同样的问题 ? - 你找到解决方案了吗?
    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多