【问题标题】:startAccessingSecurityScopedResource() return always falsestartAccessingSecurityScopedResource() 总是返回 false
【发布时间】:2017-04-29 22:11:07
【问题描述】:

当我尝试从 iCloud Drive 或 Dropbox 将文件导入我的服务器时,startAccessingSecurityScopedResource() 仅返回 false 设备,但在我在模拟器中测试时返回 true(Xcode 8、Swift 2.3、最低目标 8.0)。

这是我的代码:

{
        func showCloudDriveAction(inputBar: NAChatInputBar) {
           let documentmenuPicker = UIDocumentMenuViewController(documentTypes: ["public.data"], inMode: .Import)
           documentmenuPicker.delegate = self
           presentViewController?.presentViewController(documentmenuPicker, animated: true, completion: nil)
       }

}

extension NAChatInputBarPresenter: UIDocumentPickerDelegate, UIDocumentMenuDelegate {

    public func documentMenu(documentMenu: UIDocumentMenuViewController, didPickDocumentPicker documentPicker: UIDocumentPickerViewController) {
        documentPicker.delegate = self
        self.presentViewController?.presentViewController(documentPicker, animated: true, completion: nil)
    }

    public func documentPicker(controller: UIDocumentPickerViewController, didPickDocumentAtURL url: NSURL) {
        if url.startAccessingSecurityScopedResource() {
            guard let path = url.path, data = NSData(contentsOfFile: path) else {
                return
            }
            delegate?.chatInputBarPresenter(data, atUrl: url)
            url.stopAccessingSecurityScopedResource()
        }
    }

}

【问题讨论】:

    标签: swift icloud uidocument uidocumentpickervc


    【解决方案1】:

    startAccessingSecurityScopedResource 不必返回true 它只需要与stopAccessingSecurityScopedResource() 配对即可。

    如果它返回false,您仍然可以使用NSFileCoordinator 来访问资源。

    let isSecuredURL = url.startAccessingSecurityScopedResource() == true
    let coordinator = NSFileCoordinator()
    var error: NSError? = nil
    coordinator.coordinate(readingItemAt: url, options: [], error: &error) { (url) -> Void in
        do {
            // do something
        } catch (_) {
            // something went wrong
        }
    }
    if (isSecuredURL) {
        url.stopAccessingSecurityScopedResource()
    }
    

    【讨论】:

    • 我猜if (isSecuredURL) { url.stopAccessingSecurityScopedResource() } 应该在 catch 块之后,在闭包内
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-11-05
    • 2018-11-05
    • 2019-05-06
    • 2013-04-30
    • 2015-01-20
    相关资源
    最近更新 更多