У меня возникла проблема создания подписки в общедоступной базе данных CloudKit. Код отлично работает при сохранении подписки для первого пользователя iCloud, но не пытается сохранить несколько другую подписку на тот же тип записи для второго пользователя iCloud.Как каждый пользователь iCloud может сохранить пользовательскую подписку в CloudKit?
Вот код, который сохраняет подписку (ответы в Swift отлично тоже):
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
является CKRecordID
представляющими текущим пользователем ICloud.
_ckdatbase
является ссылкой CKDatabase
на общую базу данных текущего контейнера CloudKit.
Когда этот код запускается на устройстве A с пользователем A, подписка сохраняется просто отлично.
Когда этот код затем запустить на устройстве B с пользователем В, подписка завершается с сообщением следующего в журнале:
2016-04-19 11: 38: 42: 504 MyApp [560: f03] Ошибка при попытке обновления подписки доступа пользователя: < CKError 0x147830530: «Частичная ошибка» (2/1011); «Не удалось изменить некоторые подписки»; uuid = 98E9F99A-C4F6-4488-8087-45285A7C1DB1; контейнер ID = "iCloud.com.blah.MyApp"; частичные ошибки: { access-_df09e8908eeb9b9f12ebbe935e389d51 = < CKError 0x14664b4e0: «Неизвестный элемент» (11/2003); Сервер сообщений = «не нашли нужный тип записи: _sub_trigger_sub_08b399dc1448e58993a967b704a07ee0»> }>
access
тип записи имеет user
поле, которое является ссылкой на CKRecordID, представляющий собой идентификатор пользователя ICloud.
Моя цель состоит в том, чтобы иметь подписку для каждого пользователя, которая позволяет приложению знать, когда запись, конкретная для текущего пользователя добавляется, обновляется или удаляется из этой таблицы.
Почему я не могу сохранить 2-ю подписку от второго пользователя для этого типа записи? Я даже даю каждой подписке свой уникальный идентификатор на основе идентификатора пользователя.
Оба устройства используют среду разработки CloudKit? Возможно ли, что одно устройство решило использовать производственную среду, и вы не использовали свои типы записей и т. Д. Для производства? –
Оба имеют одну и ту же базу данных разработки. Оба показывают одни и те же данные. – rmaddy