2016-04-19 4 views
9

У меня возникла проблема создания подписки в общедоступной базе данных 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-ю подписку от второго пользователя для этого типа записи? Я даже даю каждой подписке свой уникальный идентификатор на основе идентификатора пользователя.

+0

Оба устройства используют среду разработки CloudKit? Возможно ли, что одно устройство решило использовать производственную среду, и вы не использовали свои типы записей и т. Д. Для производства? –

+0

Оба имеют одну и ту же базу данных разработки. Оба показывают одни и те же данные. – rmaddy

ответ

4

Я создал простую тестовую программу для репликации этой проблемы, и, конечно же, она отлично работала в моем тестовом приложении.

Я вернулся в свое настоящее приложение, и после некоторого рытья я решил эту проблему решить. Я сделал две вещи:

  1. В облачной панели CloudKit я удалил все существующие типы подписки.
  2. Я исправил ошибку в своем коде, где я ошибочно установил zoneID подписки на defaultRecordZone. Хотя эта проблема не была связана с проблемой, эта ошибка не позволяла уведомлениям получать устройства, если устройство не было зарегистрировано в той же учетной записи iCloud, которая использовалась для добавления/обновления/удаления записи.

В основном это была какая-то странная ошибка, которая была устранена путем сброса некоторых вещей в панели мониторинга и перезапуска приложения.