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.
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? –
Entrambi stanno colpendo lo stesso database di sviluppo. Entrambi vedono gli stessi dati. – rmaddy