快速查看预览扩展iOS preparePreviewOfFile(at:completionHandler:)

时间:2017-11-06 22:43:01

标签: ios quicklook

我正在尝试为基于UIDocument的iOS应用编写简单的快速查看预览扩展。

问题在于,在我preparePreviewOfFile(at:completionHandler:)的实现中,我尝试打开基于URL的UIDocument正在失败。我使用文件URL实例化我的文档并调用open(completionHandler:),但我没有收到任何数据,而且我看到文件协调器崩溃的控制台消息。

所有这些在我的实际应用中运行良好;它只是快速查看预览扩展实施,遇到了麻烦。从Quick Look Preview Extension中打开UIDocument有什么特别之处吗? Apple没有提供任何示例代码;在WWDC 2017视频229中,他们只是掩盖了整个事情。

编辑: Curiouser和curiouser。我创建了一个简化的测试平台应用程序,它使用UIDocumentInteractionController显示快速查看预览,以及我的自定义快速查看预览扩展。在模拟器上,预览有效!在设备上,它没有。看起来,当我告诉我的文档打开时,它的load(fromContents:ofType)从未被调用过;相反,我们收到一对错误消息:

  

与名为com.apple.FileCoordination的服务的连接无效。

     

一个进程调用了-[NSFileCoordinator coordinate...]个方法之一,但是文件协调崩溃了。返回错误。

1 个答案:

答案 0 :(得分:0)

我能够通过而不是在我的UIDocument上调用open来解决这个问题。相反,我直接在后台线程上调用read,如下所示:

func preparePreviewOfFile(at url: URL, completionHandler handler: @escaping (Error?) -> Void) {
    DispatchQueue.global(qos: .background).async {
        let doc = MyDocument(fileURL: url)
        do {
            try doc.read(from: url)
            DispatchQueue.main.async {
                // update interface here!
            }
            handler(nil)
        } catch {
            handler(error)
        }
    }
}

我不知道这是否合法。你认为只是在不使用文件协调器的情况下直接读取文档就不好了。但它似乎确实有效!

我找到了另一种解决方法,使用NSFileCoordinator并手动调用load来获取UIDocument来处理数据:

    let fc = NSFileCoordinator()
    let intent = NSFileAccessIntent.readingIntent(with: url)
    fc.coordinate(with: [intent], queue: .main) { err in
        do {
            let data = try Data(contentsOf: intent.url)
            let doc = MyDocument(fileURL: url)
            try doc.load(fromContents: data, ofType: nil)
            self.lab.text = doc.string
            handler(nil)
        } catch {
            handler(error)
        }
    }

再次,这是否合法,我不知道,但我比直接调用read感觉更好,因为至少我正在通过文件协调员。