CKShare "userDidAcceptCloudKitShareWith" запускается только при первой установке того же пользователя
В Appdelegate у меня есть userDidAcceptCloudKitShareWith
но оно запускается только для первого устройства от пользователя, который принял приглашение.
Пример:
- Пользователь A приглашает пользователя B.
- Пользователь B принимает приглашение на устройстве B1 -> все в порядке, метод запускается, и я знаю, что делать.
- Проблема в том, что когда пользователь B использует свое устройство B2, метод не запускается. Как я должен знать на устройстве B2, что пользователь B уже принял приглашение?
Я попробовал это с реальными устройствами и получить только на первом устройстве, метод запущен.
Я мог бы проверить, есть ли у него общая зона с ожидаемым zoneID, однако для меня это звучит немного странно - любая помощь более чем приветствуется!
1 ответ
Вам нужно создать подписку на общую базу данных при запуске вашего приложения. Таким образом, когда пользователь принимает общий ресурс (на любом устройстве), подписка срабатывает, и все устройства этого пользователя (имеющие подписку) извлекают самые последние данные в этой базе данных. Нет необходимости принимать CKShare
на нескольких устройствах.
Вот пример того, как вы бы создали подписку на общую базу данных:
let container = CKContainer(identifier: "...")
let subscription = CKDatabaseSubscription(subscriptionID: "shared")
let sharedInfo = CKNotificationInfo()
sharedInfo.shouldSendContentAvailable = true
sharedInfo.alertBody = "" //This needs to be set or pushes sometimes don't get sent
subscription.notificationInfo = sharedInfo
let operation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: nil)
container.sharedCloudDatabase.add(operation)
Вам также нужно будет обработать изменения, извлеченные из общей базы данных, чтобы отобразить новые общие данные в вашем приложении следующим образом:
let fetchOperation = CKFetchDatabaseChangesOperation()
fetchOperation.fetchAllChanges = true
fetchOperation.recordZoneWithIDChangedBlock = { recordZoneID in
//Process custom/shared zone changes...
}
container.sharedCloudDatabase.add(fetchOperation)
Надеюсь, это поможет.