1

我使用UIDocumentBrowserViewController(它的游戏)开发了一个基于文档的 iOS 应用程序。在启动应用程序时,我想UIDocument自动重新打开上次使用的应用程序。为此,我将创建或打开的 url 字符串存储UIDocument在用户默认值中,并尝试在viewDidLoad我的DocumentBrowserViewController. 这适用于本地存储上的文档,但在 iCloud(或其他一些外国)存储的文档上失败。

本地存储文档的 url 字符串如下所示:

/private/var/mobile/Containers/Data/Application/F4AF5E0B-C261-47F5-95ED-0B8A1DFEEDE6/Documents/Emsave.emp

某些云服务上的相同文档具有以下 url 字符串:

/private/var/mobile/Containers/Shared/AppGroup/83CB33FC-5A87-404F-BFB9-8F2910A2192E/File Provider Storage/485172592867551584/Emsave.emp

我的 DocumentBrowserViewController 的 viewDidLoad:

    override func viewDidLoad() {
        super.viewDidLoad()

        delegate = self

        allowsDocumentCreation = true
        allowsPickingMultipleItems = false

        // Do any additional setup after loading the view, typically from a nib.
                                                                // did we already open a game before?
        if let url = UserDefaults.standard.string(forKey: DocumentBrowserViewController.lastGameKey) {
            print("last opened game: \(url)")
            if FileManager.default.fileExists(atPath: url) {    // and is the game still existing?
                presentDocument(at: URL(fileURLWithPath: url))  // open it
            }
        }
    }

测试 FileManager.default.fileExists(atPath: url) 似乎总是返回 false 如果 url 字符串指定存储在云服务上的文档,尽管它在那里。

4

1 回答 1

2

您不应保留从 DocumentPicker 或 DocumentBrowser 获得的 url,因为该文件可能已移动,在您的应用程序关闭时已被重命名。

您应该从 url 中保存一个书签,并在下次需要时从该书签中重新创建 url。

看看这个部分:https://developer.apple.com/documentation/foundation/nsurl?language=objc中的书签和安全范围

于 2020-02-11T17:10:14.077 回答