userDidAcceptCloudKitShareWith 未被调用

Eam*_*onn 7 ios swift cloudkit

func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {...}
Run Code Online (Sandbox Code Playgroud)

在指向共享 cloudkit 记录的链接上单击“确定”后不会被调用。应用程序会打开,但这个函数(应该被调用)不会。

  • CKSharingSupported:YES 列在我的 info.plist 中
  • 我已将记录放入名为“sharedZone”的区域
  • SharedZone 显示在我的区域列表中,在我的私人数据库中。
  • 共享记录显示我被“邀请”
  • 尝试删除应用程序和云数据并重新安装,没有变化
func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {
        print("you accepted something")



        let acceptShareOperation: CKAcceptSharesOperation = CKAcceptSharesOperation(shareMetadatas:[cloudKitShareMetadata])

        //acceptShareOperation.qualityOfService = .userInteractive

        acceptShareOperation.perShareCompletionBlock = {meta, share,
            error in
            print("share was accepted")
        }

        acceptShareOperation.acceptSharesCompletionBlock = {
            error in
            /// Send your user to where they need to go in your app
            print("share accepted completion block!")
        }

        CKContainer(identifier: cloudKitShareMetadata.containerIdentifier).add(acceptShareOperation)
    }
Run Code Online (Sandbox Code Playgroud)

预期结果:至少看到“你接受了某些东西”这一行打印在控制台上。

更新:恢复到 IOS11.3 不起作用。

更新:我下载了一个有人使用 cloudkit 构建的教程,并且(经过一番折腾,让他们的代码开始工作。然后我删除了他们的代码并将我的代码放入其中,现在该功能正常工作,所以我认为这个问题可能有一些问题做任何一个:

  • XCODE 11 测试版,或
  • 苹果添加了新的 coredata + cloudkit 同步功能。

Nik*_*nko 16

如果您使用新的 Xcode 11 项目,则有SceneDelegate.swift. 您需要在那里实施:

internal func windowScene(_ windowScene: UIWindowScene, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) { }

如果你想在userDidAcceptCloudKitShareWith里面被调用,AppDelegate.swift你必须从Info.plist文件中删除下一行:

<key>UIApplicationSceneManifest</key>
<dict>
    <key>UIApplicationSupportsMultipleScenes</key>
    <false/>
    <key>UISceneConfigurations</key>
    <dict>
        <key>UIWindowSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>Default Configuration</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
                <key>UISceneStoryboardFile</key>
                <string>Main</string>
            </dict>
        </array>
    </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)

更新

如果您尝试使用 Scene Manifest 在冷启动时接受共享,CKShare.Metadata则将传递给func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)in connectionOptions


Eam*_*onn 1

经过两天的反复试验,我终于成功了。

该问题似乎与苹果新的 Core Data + Cloudkit 同步功能有关。他们似乎掩盖了我需要调用的 appdelegate 函数。

我通过在 Xcode 10 中重建应用程序,然后在 XCode 11 中打开它而不进行任何更改来解决了该问题。我也会通知苹果。

谢谢我。不客气。