Quick Look Preview Extension iOS preparePreviewOfFile(at:com



我正试图为我的基于UIDocument的iOS应用程序编写一个简单的快速预览扩展。

问题是,在preparePreviewOfFile(at:completionHandler:)的实现中,我试图根据收到的URL打开UIDocument的尝试失败了。我用文件URL实例化我的文档并调用open(completionHandler:),但我没有得到任何数据,并且我看到一条控制台消息,文件协调器已经崩溃。

所有这些在我的实际应用程序中运行良好;只是Quick Look Preview Extension实现出现了问题。从快速浏览预览扩展插件中打开UIDocument有什么特别的事情吗?苹果没有提供任何示例代码;在WWDC 2017视频229中,他们只是掩盖了整个事情。

编辑:好奇者和好奇者。我创建了一个简化的测试床应用程序,该应用程序使用UIDocumentInteractionController显示快速浏览预览,以及我的自定义快速浏览预览扩展。在模拟器上,预览工作!在设备上,它没有。看起来,当我告诉我的文档打开时,它的load(fromContents:ofType)甚至从未被调用;相反,我们得到了一对错误消息,如下所示:

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

进程调用了其中一个-[NSFileCoordinator coordinate...]方法,但filecoordinationd崩溃。返回错误。

我能够通过而不是在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要好,因为至少我正在通过文件协调器。

最新更新