CloudKit CKSubscription 通知基础

Posted

技术标签:

【中文标题】CloudKit CKSubscription 通知基础【英文标题】:CloudKit CKSubscription Notification Basics 【发布时间】:2014-11-12 14:50:28 【问题描述】:

我今天一直在摆弄CKSubscription。我对此有一些疑问。

我这样设置我的订阅:

-(void)addSubscriptions

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"];

    CKSubscription *newRecordSub = [[CKSubscription alloc] initWithRecordType:_recordTypeName predicate:predicate options:CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate | CKSubscriptionOptionsFiresOnRecordDeletion];

    CKNotificationInfo *noteInfo = [CKNotificationInfo new];
    noteInfo.alertBody = @"Update!";
    noteInfo.shouldBadge = YES;
    noteInfo.soundName = UILocalNotificationDefaultSoundName;
    newRecordSub.notificationInfo = noteInfo;

    CKContainer *container = [CKContainer defaultContainer];
    CKDatabase *privateDatabase = [container privateCloudDatabase];

    [privateDatabase saveSubscription:newRecordSub completionHandler:^(CKSubscription *subscription, NSError *error) 

    ];

问题 1:

在创建我的订阅时,我肯定只需要将它保存到我的容器一次吗?由于这被称为应用程序运行超时,我收到一个错误,简单地说是重复订阅,所以应用程序按预期工作,但我应该以不同的方式处理这个问题而不是每次都运行吗?

接下来我设置通过我的AppID 接收通知并在我的AppDelegate 中注册。

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [application registerUserNotificationSettings:settings];
    [application registerForRemoteNotifications];

最后,我处理这些通知如下:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

    CKNotification *note = [CKNotification notificationFromRemoteNotificationDictionary:userInfo];

    if (note.notificationType == CKNotificationTypeQuery)
    
        CKQueryNotification *queryNote = (CKQueryNotification *)note;
        CKRecordID *recordID = [queryNote recordID];
        [[NSNotificationCenter defaultCenter] postNotificationName:kCloudKitNewRecordFlightLog object:recordID];
    

问题 2:

为什么此时我不会收到任何通知?我的所有代码都会运行,并且在添加/删除、更新新记录时更新我的​​应用程序。但是,不会显示声音、徽章或横幅来通知用户。

问题 3:

在收到云工具包通知时让本地通知向相关视图发送消息以更新记录是一种明智的做法吗?

【问题讨论】:

你应该为每个问题创建一个堆栈溢出问题。 以后会做的,对不起!不过还是谢谢你的回答。 【参考方案1】:
    是的,您只需设置一次。您可以查询订阅(使用 fetchAllSubscriptionsWithCompletionHandler)来查看是否应该创建它。或者直接忽略错误。 这可以工作,或者您可以设置一个代理机制。

【讨论】:

谢谢埃德温。你说订阅只是公共数据库很有趣。如图所示,我有这个订阅在我的私人数据库上工作,唯一的问题是它不显示通知,尽管仍在后台工作。 这很奇怪。对于订阅,您应该仅在更改由订阅者以外的其他人进行时才会收到通知。在私有数据库中,您将是唯一可以访问数据的人。所以你是说你确实在你的应用程序中收到了通知事件?我不得不承认我从未尝试过订阅私人数据库。我以为它行不通。 它在基本级别上工作,它不会提供任何横幅、徽章、声音等。例如,使用我问题中的代码,我可以在我的 iPhone 和 iPad 上进行更改将在didReceiveRemoteNotification 中收到该通知。我不知道他们通常只会公开。 @EdwinVermeer 为什么你说订阅只适用于公共数据库?订阅可用于通知用户的其他设备其中一台设备在私有数据库中进行了更改。

以上是关于CloudKit CKSubscription 通知基础的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit CKSubscription 通知基础

cloudKit:CKSubscription 错误“此请求需要经过身份验证的帐户””

CKReference 的 CloudKit 订阅通知未按预期工作

如何使用 CKSubscription 检查 CKAsset 更改?

CloudKit Zone CKSubscriptionOptions

如何更新 CloudKit 订阅