2014-09-11 8 views
10

Sto utilizzando un CKFetchRecordChangesOperation con un CKFetchRecordsChangeToken per eseguire le modifiche e mi sta dicendo che "AppDefaultZone non supporta la semantica di sincronizzazione".CloudKit fetchRecordChangesOperation fornisce "AppDefaultZone non supporta la semantica di sincronizzazione"

ecco il codice incriminato:

- (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]; 
} 

E qui è l'errore che sta stampando fuori

[PBCloudKitSyncManager] Error Downloading Data: 
<CKError 0x157a2500: "Server Rejected Request" (15/2027); 
server message = "AppDefaultZone does not support sync semantics"; 
uuid = [redacted]; 
container ID = "[redacted]"> 

risposta

2

ho risolto il problema passando a una zona personalizzato. Creo la zona quando ho inizializzo CloudKit e quando vado a inizializzare lo zoneID io uso questo:

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

dove userRecordName è il nome del record per il CKRecord ottengo per l'utente quando chiamo questo metodo nel inizializzazione Cloudkit :

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

      /... 

     } 
}]; 
+2

La documentazione per gli stati CKRecordZoneID: 'Per specificare l'utente corrente, utilizzare la costante CKOwnerDefaultName. Se si specifica nil o una stringa vuota per questo parametro, questo metodo genera un'eccezione. – Klaas

+0

Significa che 'CKFetchRecordChangesOperation' non funzionerà nel database pubblico solo in privato? –

+0

@ János il problema che stavo avendo effettivamente affrontato con il database privato. Quindi mi sembra un CKFetchRecordChangesOperation non funzionerà nella zona predefinita del database pubblico o del database privato. Quindi per usare l'operazione devi creare una zona personalizzata e guardare le modifiche in quella zona personalizzata. – Jonathan