如何通知另一台设备 CloudKit 记录已更新?

Posted

技术标签:

【中文标题】如何通知另一台设备 CloudKit 记录已更新?【英文标题】:How to notify another device that a CloudKit record has been updated? 【发布时间】:2014-10-21 11:56:00 【问题描述】:

CKSubscription 文档说:当记录修改导致订阅触发时,服务器会向具有该订阅的所有设备发送推送通知,但对记录进行原始更改的设备除外。

假设我有两台设备:设备 1 是 iPad,设备 2 是 iPhone,都使用 相同 iCloud 帐户登录。假设两台设备都订阅了某种记录类型的记录更新。

我的代码是这样的(我已经去掉了一些家务)

NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"fromUserRecordIDName == %@", _member.userRecordIDName];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"fromUserRecordIDName == %@", notificationPublic = [[CKNotificationInfo alloc] init];
notificationPublic.shouldBadge =YES;
notificationPublic.desiredKeys = @[@"fromMemberNameText"];
notificationPublic.shouldSendContentAvailable = YES;


if ([[NSUserDefaults standardUserDefaults] objectForKey:@"TickleRecordUpdateSubscription"] == nil) 

    [cloudManager subscribe:@"TickleRecord" public: YES options:CKSubscriptionOptionsFiresOnRecordUpdate predicate:predicate2 notification:notificationPublic completionHandler:^(CKSubscription *subscription, NSError *operationError) 

      if (operationError) 

       NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), operationError);



       else
        [[NSUserDefaults standardUserDefaults] setObject:subscription.subscriptionID forKey:@"TickleRecordUpdateSubscription"];
        [[NSUserDefaults standardUserDefaults] setObject:@"TickleRecordUpdateSubscription"forKey:subscription.subscriptionID ];

      
    ];

在我看来,当一台设备更新记录时,应该通知另一台设备。但这不是正在发生的事情 - 没有通知。在 WWDC 2014 Advanced iCloud 视频中,他们谈到了当一台设备将通知标记为已读时会收到通知,但我也没有成功。

当另一台设备登录到同一帐户更新记录时,是否有人成功通知了一台设备?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。我得到了这个订阅:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"recipient == %@", [[CKReference alloc] initWithRecordID:self.userRecordId action:CKReferenceActionNone]];
CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Message" predicate:predicate options:CKSubscriptionOptionsFiresOnRecordCreation];
subscription.notificationInfo = [CKNotificationInfo new];
subscription.notificationInfo.shouldSendContentAvailable = YES;
subscription.notificationInfo.soundName = UILocalNotificationDefaultSoundName;
subscription.notificationInfo.shouldBadge = YES;
CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
[publicDatabase saveSubscription:subscription completionHandler:^(CKSubscription *subscription, NSError *error) ...];

这样我就可以从一台设备创建记录,并在另一台设备上收到通知,登录到同一个 iCloud 帐户。

编辑:我刚刚意识到您在询问记录更新,而不是创建,但也许我的回答仍然可以提供帮助。当我遇到这个问题时,我发现一件奇怪的事情是在我为 CKNotificationInfo 的 soundName 属性设置一个值后开始接收通知。

【讨论】:

我确实让它在创建时工作,但不是在更新时,尽管我认为两个设备试图同时更新记录还有其他问题。现在正在努力 您已设置soundName,收到通知时您是否听到任何声音? ***.com/questions/32033589/… 同时设置shouldSendContentAvailablesoundName/shouldBadge 将抛出一个断言错误,因为它不受支持。 shouldSendContentAvailable 如果要发送静默推送通知,应设置为 true,即用户看不到它(没有横幅/声音)。【参考方案2】:

不,您必须使用 2 个不同的帐户。我想这是一个 CloudKit 错误而不是缺少的功能。现在,您不可能同时拥有两个具有最新数据的设备。

【讨论】:

以上是关于如何通知另一台设备 CloudKit 记录已更新?的主要内容,如果未能解决你的问题,请参考以下文章

如果另一台设备已响应警报,则删除推送通知警报

如何创建 CloudKit 订阅通知以触发记录属性更新?

CloudKit 不发送更新通知

如何更新 CloudKit 订阅

如何将推送通知从一台 iPhone 设备发送到另一台设备? [关闭]

CloudKit 通知未发送到所有设备