func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {...}
在共享云工具记录的链接上单击“确定”后,不会调用。该应用程序将打开,但此功能(应该被调用)没有打开。
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构建的教程,(经过一番努力之后,让他们的代码可以工作。然后我删除了他们的代码并放入了我的代码中,现在该功能可以正常工作,所以我认为问题可能是与此有关:
答案 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中打开它而不进行任何更改来解决了该问题。我也会让苹果知道。
谢谢。不客气