Пользователи не могут открыть запись 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 никуда не денется.

Но убедитесь, что:

  1. Вы указываете резервный URL-адрес для своего контейнера CloudKit, который перенаправляет в ваше приложение.
  2. Внутри вашего приложения в 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)
}

Надеюсь, это поможет другим!

Другие вопросы по тегам