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 批量获取?

CloudKit 的单元测试

cloudKit:公共数据库中的 CKFetchRecordChangesOperation

无法初始化 CloudKit 架构,因为协调器中没有存储配置为使用 CloudKit

Cloudkit 与组合

Swift 2 和 Cloudkit 的通知