Как каждый пользователь iCloud может сохранить свою подписку в CloudKit?
У меня проблема с созданием подписок в общедоступной базе данных CloudKit. Код работает нормально при сохранении подписки для первого пользователя iCloud, но не удается сохранить слегка отличную подписку для того же типа записи для второго пользователя iCloud.
Вот код, который сохраняет подписку (ответы в 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 с пользователем B, подписка не выполняется со следующим сообщением в журнале:
2016-04-19 11: 38: 42: 504 MyApp [560: f03] Ошибка при попытке обновить подписку на доступ пользователя:
}>
access
тип записи имеет user
поле, которое является ссылкой на CKRecordID, представляющий идентификатор пользователя iCloud.
Моя цель здесь - иметь подписку для каждого пользователя, которая позволяет приложению знать, когда запись, специфичная для текущего пользователя, добавляется, обновляется или удаляется из этой таблицы.
Почему я не могу сохранить 2-ую подписку от 2-го пользователя для этого типа записи? Я даже даю каждой подписке свой уникальный идентификатор на основе идентификатора пользователя.
1 ответ
Я создал простое тестовое приложение, чтобы воспроизвести эту проблему, и, конечно, оно отлично работало в моем тестовом приложении.
Я вернулся к своему настоящему приложению, и после некоторого поиска я решил эту проблему. Я сделал две вещи:
- В инструментальной панели CloudKit я удалил все существующие типы подписок.
- Я исправил ошибку в своем коде, когда я ошибочно устанавливал подписку
zoneID
кdefaultRecordZone
, Хотя эта ошибка не была связана с опубликованной проблемой, она не позволяла уведомлениям достигать устройств, если только устройство не входило в ту же учетную запись iCloud, которая использовалась для добавления / обновления / удаления записи.
По сути, это была какая-то странная ошибка, которая была исправлена путем сброса некоторых параметров в Dashboard и перезапуска приложения.