userDidAcceptCloudKitShareWith不被调用

时间:2019-07-19 00:10:41

标签: ios swift cloudkit

func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {...}
在共享云工具记录的链接上单击“确定”后,不会调用

。该应用程序将打开,但此功能(应该被调用)没有打开。

  • 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)
    }

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

更新:恢复到IOS11.3不能正常工作。

更新:我下载了某人使用cloudkit构建的教程,(经过一番努力之后,让他们的代码可以工作。然后我删除了他们的代码并放入了我的代码中,现在该功能可以正常工作,所以我认为问题可能是与此有关:

  • XCODE 11 beta,或
  • 添加了新的coredata + cloudkit同步功能apple。

3 个答案:

答案 0 :(得分:2)

如果您使用新的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>

答案 1 :(得分:1)

要完成这项工作,您必须使用 SceneDelegate。

让 Scenedelegate 工作有 3 个步骤。

1 - 添加 Appdelegate

class AppDelegate: NSObject, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        print("abc")
        return true
    }
}

不要忘记使用委托适配器

    struct ExampleApp: App {
        @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    var body: some Scene {
              MainView()
          }
    }

2 - 配置 info.plist 以处理基于场景委托的场景

将这些添加到您的 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>
            </dict>
        </array>
    </dict>
</dict>

3 - 添加场景委托。

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

        class SceneDelegate: UIResponder, UIWindowSceneDelegate {
            var window: UIWindow?
        
            func windowScene(_ windowScene: UIWindowScene, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {
                print("abcd")
            }
    }

    }

答案 2 :(得分:0)

经过2天的反复试验,我终于开始使用它了。

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

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

谢谢。不客气