每个iCloud用户如何在CloudKit中保存用户特定的订阅?

时间:2016-04-19 18:11:22

标签: ios cloudkit cksubscription

我在公共CloudKit数据库中创建订阅时遇到问题。在为第一个iCloud用户保存订阅时,代码工作正常,但是尝试为第二个iCloud用户保存针对相同记录类型的稍微不同的订阅。

以下是保存订阅的代码(Swift中的答案也很好):

CKNotificationInfo *info = [[CKNotificationInfo alloc] init];
info.shouldSendContentAvailable = YES;

CKReference *ref = [[CKReference alloc] initWithRecordID:_ckUserID action:CKReferenceActionNone];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"user == %@", ref];
NSString *subId = [NSString stringWithFormat:@"access-%@", _ckUserID.recordName];

CKSubscription *sub = [[CKSubscription alloc] initWithRecordType:@"access" predicate:pred subscriptionID:subId options:CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate | CKSubscriptionOptionsFiresOnRecordDeletion];
sub.zoneID = [CKRecordZone defaultRecordZone].zoneID;
sub.notificationInfo = info;

CKModifySubscriptionsOperation *op = [[CKModifySubscriptionsOperation alloc] initWithSubscriptionsToSave:@[ sub ] subscriptionIDsToDelete:nil];
op.modifySubscriptionsCompletionBlock = ^(NSArray<CKSubscription *> *savedSubscriptions, NSArray<NSString *> *deletedSubscriptionIDs, NSError *operationError) {
    if (operationError) {
        RMLogError(@"Error trying to update user's access subscription: %@", operationError);
    } else {
        RMLogInfo(@"User access subscription added");
    }
};
[_ckdatabase addOperation:op];

_ckUserID是代表当前iCloud用户的CKRecordID _ckdatbase是对当前CloudKit容器的公共数据库的CKDatabase引用。

在具有用户A的设备A上运行此代码时,订阅会保存得很好。

当此代码随后在带有用户B的设备B上运行时,订阅失败并在日志中显示以下消息:

  

2016-04-19 11:38:42:504 MyApp [560:f03]尝试更新用户的访问订阅时出错:&lt; CKError 0x147830530:“Partial Failure”(2/1011); “无法修改某些订阅”; uuid = 98E9F99A-C4F6-4488-8087-45285A7C1DB1; container ID =“iCloud.com.blah.MyApp”;部分错误:{       access-_df09e8908eeb9b9f12ebbe935e389d51 =&lt; CKError 0x14664b4e0:“Unknown Item”(11/2003); server message =“未找到所需的记录类型:_sub_trigger_sub_08b399dc1448e58993a967b704a07ee0”&gt;   }&GT;

access记录类型有一个user字段,它是对表示iCloud用户ID的CKRecordID的引用。

我的目标是为每个用户订阅,允许应用知道何时从此表添加,更新或删除特定于当前用户的记录。

为什么我不能从第二个用户为此记录类型保存第二个订阅?我甚至根据用户ID为每个订阅提供了自己的唯一ID。

1 个答案:

答案 0 :(得分:4)

我创建了一个简单的测试应用来复制这个问题,当然它在我的测试应用中运行得很好。

我回到我的真实应用程序,经过一些挖掘后,我解决了这个问题。我做了两件事:

  1. 在CloudKit信息中心中,我删除了所有现有的订阅类型。
  2. 我在代码中修复了一个错误,我错误地将订阅zoneID设置为defaultRecordZone。虽然与发布的问题没有真正关联,但是这个错误阻止了通知到达设备,除非设备登录到用于添加/更新/删除记录的相同iCloud帐户。
  3. 基本上这是一个奇怪的错误,通过重置仪表板中的一些内容并重新启动应用程序来修复。