我在公共 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
是一个CKRecordID
代表当前 iCloud 用户。
_ckdatbase
是CKDatabase
对当前 CloudKit 容器的公共数据库的引用。
当此代码在用户 A 的设备 A 上运行时,订阅保存得很好。
当此代码在用户 B 的设备 B 上运行时,订阅失败,日志中显示以下消息:
2016-04-19 11:38:42:504 MyApp [560:f03] 尝试更新用户的访问订阅时出错:<CKError 0x147830530:“部分失败”(2/1011);“修改部分订阅失败”;uuid = 98E9F99A-C4F6-4488-8087-45285A7C1DB1;容器 ID = "iCloud.com.blah.MyApp"; 部分错误:{ access-_df09e8908eeb9b9f12ebbe935e389d51 = <CKError 0x14664b4e0: "Unknown Item" (11/2003); 服务器消息 = "没有找到所需的记录类型:_sub_trigger_sub_08b399dc1448e58993a967b704a07ee0"> }>
access
记录类型有一个user
字段是对代表 iCloud 用户 ID 的 CKRecordID 的引用。
我的目标是为每个用户订阅,让应用程序知道何时从该表中添加、更新或删除特定于当前用户的记录。
为什么我不能保存来自第二个用户的第二个订阅,用于此记录类型?我什至根据用户 ID 为每个订阅提供自己的唯一 ID。