2016-04-19 11 views
9

Sto riscontrando un problema nella creazione di iscrizioni in un database CloudKit pubblico. Il codice funziona correttamente quando si salva l'abbonamento per il primo utente iCloud, ma non riesce a salvare una sottoscrizione leggermente diversa rispetto allo stesso tipo di record per un secondo utente iCloud.In che modo ciascun utente iCloud può salvare un abbonamento specifico per utente in CloudKit?

Qui è il codice che salva la sottoscrizione (risposte a Swift vanno bene troppo):

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 è un CKRecordID che rappresenta l'utente iCloud corrente.
_ckdatbase è un riferimento CKDatabase al database pubblico dell'attuale contenitore CloudKit.

Quando questo codice viene eseguito sul dispositivo A con l'utente A, l'abbonamento viene salvato correttamente.

Quando questo codice viene eseguito su dispositivo B con l'utente B, l'abbonamento non riesce con il seguente messaggio nel registro:

2016-04-19 11: 38: 42: 504 MyApp [560: f03] Errore durante il tentativo di aggiornamento della sottoscrizione di accesso utente: < Errore CK 0x147830530: "Errore parziale" (2/1011); "Impossibile modificare alcuni abbonamenti"; uuid = 98E9F99A-C4F6-4488-8087-45285A7C1DB1; ID contenitore = "iCloud.com.blah.MyApp"; errori parziali: { access-_df09e8908eeb9b9f12ebbe935e389d51 = < CKError 0x14664b4e0: "Articolo sconosciuto" (11/2003); messaggio del server = "non ha trovato necessario tipo di record: _sub_trigger_sub_08b399dc1448e58993a967b704a07ee0"> }>

Il tipo di record access ha un campo user che è un riferimento a un CKRecordID che rappresenta un id utente iCloud.

Il mio obiettivo qui è quello di avere un abbonamento per ogni utente che permetta all'app di sapere ogni volta che un record specifico per l'utente corrente viene aggiunto, aggiornato o cancellato da questa tabella.

Perché non posso salvare un secondo abbonamento, da un secondo utente, per questo tipo di record? Sto anche assegnando a ciascun abbonamento il proprio ID univoco basato sull'id utente.

+0

Entrambi i dispositivi utilizzano l'ambiente di sviluppo CloudKit? È possibile che un dispositivo abbia deciso di utilizzare l'ambiente di produzione e non abbia distribuito i tipi di record, ecc. Alla produzione? –

+0

Entrambi stanno colpendo lo stesso database di sviluppo. Entrambi vedono gli stessi dati. – rmaddy

risposta

4

Ho creato una semplice app di test per replicare questo problema e, naturalmente, ha funzionato bene nella mia app di test.

Sono tornato alla mia vera app e dopo alcuni scavi ho risolto questo problema. Ho fatto due cose:

  1. Nel CloudKit Dashboard ho eliminato tutti i tipi di abbonamento esistenti.
  2. Ho corretto un errore nel mio codice in cui stavo erroneamente impostando l'abbonamento zoneID su defaultRecordZone. Sebbene non sia realmente correlato al problema pubblicato, questo bug impediva alle notifiche di raggiungere i dispositivi a meno che il dispositivo non fosse collegato allo stesso account iCloud utilizzato per aggiungere/aggiornare/eliminare il record.

Fondamentalmente si trattava di qualche errore strano che è stato risolto reimpostando alcune cose nella Dashboard e riavviando l'app.