Пользователи не могут открыть запись CKShare, когда они приняли запись и приложение запустилось
Работаю над реализацией функциональности CKShare CloudKit. Мне удалось добраться до части, чтобы поделиться записью (например, по электронной почте), а также могу подтвердить, что пользователь получил приглашение. Проблема в том, что когда пользователь принимает запись, приложение появляется, но ничего не происходит. Чтобы помочь, вот несколько ключевых элементов приложения, и, пожалуйста, сообщите мне, если я ошибаюсь.
1) Приложение не требует от пользователя входа в систему с использованием своего Apple ID.
2) Я тестирую приложение через прямую сборку на двух разных телефонах (с отдельными идентификаторами Apple ID), когда подключаю телефоны к компьютеру с помощью кабеля (он же еще не использовал TestFlight).
3) Я проверил в CloudkitDashboard, и я вижу, что запись, к которой был предоставлен общий доступ, а также вижу, что записанная запись была опубликована, но вместо того, чтобы видеть электронную почту пользователя, я отправил приглашение, я вижу свою электронную почту и тот факт, что запись ха-ха был "принят"
4) Я добавил ключ CKSharingSupported в файл Info.plist.
5) Код в файле AppDelegate.swift, который я использую для принятия CKShare, приведен ниже. Мне очень нравится привлекать ваше внимание к тому факту, что строка "Пользователь принял общий доступ" никогда не печатается, что заставляет меня думать, что эта часть кода никогда не запускается.
приложение func (_ приложение: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {
print("User Accepted the Share")
let acceptShareOperation: CKAcceptSharesOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata])
acceptShareOperation.qualityOfService = .userInteractive
acceptShareOperation.perShareCompletionBlock = {meta, share,
error in
print("The Record Share was Accepted")
}
acceptShareOperation.acceptSharesCompletionBlock = {
error in
/// Send your user to where they need to go in your app
let viewController: SNPDetailsViewController = self.window?.rootViewController as! SNPDetailsViewController
viewController.fetchShare(cloudKitShareMetadata)
}
CKContainer(identifier:
cloudKitShareMetadata.containerIdentifier).add(acceptShareOperation)
}
Мы будем очень признательны за любое понимание, которое поможет мне понять, где я ошибаюсь.
Спасибо за ваше время!
2 ответа
Дополнительную информацию см. В этом ответе: URL CloudKit CKShare никуда не денется.
Но убедитесь, что:
- Вы указываете резервный URL-адрес для своего контейнера CloudKit, который перенаправляет в ваше приложение.
- Внутри вашего приложения в Xcode вы настраиваете схему URL-адресов, чтобы пользовательские URL-адреса, например
yourapp://
откройте свое приложение, и параметр запроса из URL-адреса Fallball будет передан вuserDidAcceptCloudKitShareWith
.
Надеюсь, это поможет.
После нескольких недель проб и ошибок, исследований и УДАЧИ мне удалось выяснить проблему. Все руководства и онлайн-решения относятся к приведенному ниже коду в AppDelegate.swift, чтобы принять запись CKShare:
func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {
let acceptShareOperation: CKAcceptSharesOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata])
acceptShareOperation.qualityOfService = .userInteractive
acceptShareOperation.perShareCompletionBlock = {meta, share,
error in
DispatchQueue.main.async() {
print("The Record Share was Accepted")
}
}
acceptShareOperation.acceptSharesCompletionBlock = {
error in
guard (error == nil) else{
print("Error \(error?.localizedDescription ?? "")")
return
}
let viewController: SNPDetailsViewController = self.window?.rootViewController as! SNPDetailsViewController
viewController.fetchShare(cloudKitShareMetadata)
}
CKContainer(identifier:
cloudKitShareMetadata.containerIdentifier).add(acceptShareOperation)
}
В моем случае решение заключалось в том, чтобы добавить его в SceneDelegate.swift в следующей функции:
func windowScene(_ windowScene: UIWindowScene, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {
(add above code)
}
Надеюсь, это поможет другим!