CloudKit fetchRecordChangesOperation 给出“AppDefaultZone 不支持同步语义”
Posted
技术标签:
【中文标题】CloudKit fetchRecordChangesOperation 给出“AppDefaultZone 不支持同步语义”【英文标题】:CloudKit fetchRecordChangesOperation gives a "AppDefaultZone does not support sync semantics" 【发布时间】:2014-09-11 00:08:03 【问题描述】:我正在使用 CKFetchRecordChangesOperation 和 CKFetchRecordsChangeToken 来获取更改,它告诉我“AppDefaultZone 不支持同步语义”。
这是有问题的代码:
- (void)downloadServerChangesWithCompletionBlock:(void (^)(NSError *error))completionBlock
// Prepare to fetch remote changes
CKDatabase *database = [CKContainer defaultContainer].privateCloudDatabase;
CKRecordZoneID *zoneID = [[CKRecordZoneID alloc] initWithZoneName:CKRecordZoneDefaultName ownerName:CKOwnerDefaultName];
// Initialize fetch record changes operation
CKFetchRecordChangesOperation *fetchRecordChangesOperation = [[CKFetchRecordChangesOperation alloc] initWithRecordZoneID:zoneID previousServerChangeToken:[self changeToken]];
fetchRecordChangesOperation.recordChangedBlock = ^(CKRecord *record)
[self performRecordChange:record];
;
fetchRecordChangesOperation.recordWithIDWasDeletedBlock = ^(CKRecordID *recordID)
[self performRecordDeletion:recordID];
;
fetchRecordChangesOperation.fetchRecordChangesCompletionBlock = ^(CKServerChangeToken *serverChangeToken, NSData *clientChangeTokenData, NSError *error)
if (error)
completionBlock(error);
else
[self setChangeToken:serverChangeToken];
completionBlock(nil);
;
// Perform the operation
[database addOperation:fetchRecordChangesOperation];
这是打印出来的错误
[PBCloudKitSyncManager] Error Downloading Data:
<CKError 0x157a2500: "Server Rejected Request" (15/2027);
server message = "AppDefaultZone does not support sync semantics";
uuid = [redacted];
container ID = "[redacted]">
【问题讨论】:
【参考方案1】:我通过切换到自定义区域解决了这个问题。我在初始化 CloudKit 时创建了区域,当我去初始化 zoneID 时,我使用这个:
CKRecordZoneID *zoneID = [[CKRecordZoneID alloc] initWithZoneName:@"Custom Zone Name" ownerName:userRecordName];
其中 userRecordName 是我在 Cloudkit 初始化中调用此方法时为用户获取的 CKRecord 的记录名称:
[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error)
if (recordID)
// Save the user record id
[self saveUserRecordName:recordID.recordName];
/...
];
【讨论】:
CKRecordZoneID 的文档说明:To specify the current user, use the CKOwnerDefaultName constant. If you specify nil or an empty string for this parameter, this method throws an exception.
是不是说CKFetchRecordChangesOperation
只能私下在公共数据库中工作?
@János 我在处理私有数据库时遇到的问题。所以在我看来,CKFetchRecordChangesOperation 在公共数据库或私有数据库的默认区域中不起作用。因此,要使用该操作,您必须创建一个自定义区域并观察该自定义区域中的变化。
@Jonathan,根据您的评论“CKFetchRecordChangesOperation 将无法在公共数据库的默认区域中工作”。可以在公共数据库中创建自定义区域吗?
"您不能在公共数据库中创建自定义区域。" developer.apple.com/library/prerelease/ios/documentation/…以上是关于CloudKit fetchRecordChangesOperation 给出“AppDefaultZone 不支持同步语义”的主要内容,如果未能解决你的问题,请参考以下文章
cloudKit:公共数据库中的 CKFetchRecordChangesOperation