Подписки с CKShare

Я новичок в подписках и Cloudkit, и я пытаюсь настроить подписки для отправки push-уведомления всякий раз, когда записи CKShare создаются, редактируются, удаляются, а также когда участник покидает общий ресурс как для частной, так и для общей базы данных.

В моем приложении у меня есть два типа записей в Cloudkit. Первый - Deck, второй - Card. Deck имеет one-to-many отношения с Card. Каждый Card содержит от CKReference до своего Deck. Я заметил, что на панели управления Cloudkit есть третий тип записи с именем cloudkit.share. Исходя из своего исследования, я полагаю, что здесь мне понадобится четыре подписки. По одному для Deck и Card в частной базе данных с использованием CKQuerySubscription и по одному для Deck и Card в общей базе данных, когда пользователь принимает общий ресурс, используя CKDatabaseSubscription. Нужно ли мне также создавать еще одну подписку для каждой базы данных для типа записи cloudkit.share, всего шесть подписок?

Спасибо


person ACerts    schedule 30.01.2018    source источник
comment
Создайте CKDatabaseSubscription для частной и общей базы данных. Таким образом, любые изменения, внесенные в вашу частную или общую базу данных, будут отправляться в виде уведомлений. Это включает добавление / удаление / обновление записей / акций. По этому поводу есть несколько видеороликов WWDC, посмотрите их.   -  person user1046037    schedule 10.04.2018
comment
Ваш комментарий действительно помогает понять, что делать с записями cloudkit.share, которые возвращаются при получении измененных записей. Почему я получу один обратно, когда получу измененные записи.   -  person Patrick Miron    schedule 31.08.2018


Ответы (1)


После настройки одного CKDatabaseSubscription как в общей, так и в частной базах данных любые изменения вызовут запуск метода AppDelegate:

-(void)application:(NSApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary<NSString *,id> *)userInfo

Общая база данных немного сложнее, поскольку вы не можете запрашивать зону по умолчанию. Вам нужно будет настроить начальное CKFetchDatabaseChangesOperation с помощью setRecordZoneWithIDChangedBlock:^(CKRecordZoneID * _Nonnull zoneID), чтобы получить общую запись zoneID. При этом вы можете запрашивать все общие записи так же, как и частную базу данных.

Не забудьте удалить подписки из CloudKitDashboard во время тестирования, поскольку подписки останутся и будут активированы, даже если они будут удалены из вашего кода.

person nanzen-ji    schedule 27.02.2019