2014-09-11 43 views
10

我正在使用CKFetchRecordChangesOperation和CKFetchRecordsChangeToken來獲取更改,它告訴我「AppDefaultZone不支持同步語義」。CloudKit fetchRecordChangesOperation給出了「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]"> 

回答

2

錯誤我通過切換到自定義區域解決了這一問題。我創建區域時,我初始化CloudKit當我去初始化了zoneid我用這個:

CKRecordZoneID *zoneID = [[CKRecordZoneID alloc] initWithZoneName:@"Custom Zone Name" ownerName:userRecordName]; 

其中userRecordName是記錄名稱爲CKRecord我得到了用戶當我打電話的Cloudkit初始化這個方法:

[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) { 
    if (recordID) { 
     // Save the user record id 
     [self saveUserRecordName:recordID.recordName]; 

      /... 

     } 
}]; 
+2

CKRecordZoneID的文檔指出:'要指定當前用戶,請使用CKOwnerDefaultName常量。如果您爲此參數指定nil或空字符串,則此方法會引發異常。' – Klaas 2014-10-25 14:31:12

+0

這是否意味着'CKFetchRecordChangesOperation'只能在私有數據庫中工作? – 2014-12-31 13:17:05

+0

@János我實際上處理私人數據庫的問題。因此,在我看來,CKFetchRecordChangesOperation在公用數據庫或專用數據庫的默認區域中不起作用。因此,要使用該操作,您必須創建一個自定義區域並監視該自定義區域中的更改。 – Jonathan 2015-01-06 22:57:44