2

完整的错误信息是:

[main] *** 来自 FPBookmarkableStringFromDocumentURL 的错误,file:///private/var/mobile/Library/Mobile%20Documents/com~apple~CloudDocs/MY_APP/hello.txt -> Error Domain=NSCocoaErrorDomain Code=257“文件无法打开,因为您无权查看。”

当我重新启动我的应用程序并尝试重新打开以前打开的文件时(例如,当应用程序“后台”和释放内存时,从 SceneDelegate(在 iOS 13 中引入)引发此错误,因此我想重新加载场景的状态)。我按照这个 WWDC 会话https://developer.apple.com/videos/play/wwdc2019/212的步骤和从https://developer.apple.com/documentation/uikit/app_and_environment/scenes/下载的示例源代码支持_multiple_windows_on_ipad

我基本上复制了他们的 configure(window: UIWindow?, with activity: NSUserActivity) -> Bool 函数并将其转换为适合我的需要。它似乎完美无缺,但我得到了错误。

我正在使用https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/Handoff/AdoptingHandoff/AdoptingHandoff.html#/的“在基于文档的应用程序中采用切换”部分中描述的默认 NSUserActivity 技术/apple_ref/doc/uid/TP40014338-CH2-SW17

这是配置函数的主体:

if activity.activityType == "com.myName.MyApp.openedDocumentUserActivity" {

            if let documentURL = activity.userInfo?[UIDocument.userActivityURLKey] as? URL {

                if let docBrowserVC = window?.rootViewController as? DocumentBrowserViewController {
                    documentURL.startAccessingSecurityScopedResource() // tried this, it returns false
                    docBrowserVC.presentDocument(at: documentURL)
                    return true
                }
            }
        }
        return false

如果有人知道解决方法,谢谢。

4

1 回答 1

2

我必须从 URL 创建书签数据并将其保存在 NSUserActivity 中。使用 UIDocument.documentURL 是不够的,因为它是安全范围的。

用于创建书签(此代码段中没有错误检查):

let userActivity = NSUserActivity(activityType: "com.foobar")
let bookmarkData = try? documentURL.bookmarkData()
userActivity.addUserInfoEntries(from: ["URLBookmarkData": bookmarkData])
scene.userActivity = userActivity

然后阅读:

let bookmarkData = userActivity.userInfo?["URLBookmarkData"] as? Data {
let resolvedURL = try? URL(resolvingBookmarkData: bookmarkData, options: NSURL.BookmarkResolutionOptions(), relativeTo: nil, bookmarkDataIsStale: &bookmarkDataIsStale)
于 2020-04-18T16:33:39.053 回答