从MSOffice应用程序保存新文档时,NSFileProvider importDocument提供空文件的fileURL

时间:2018-05-02 09:41:02

标签: ios swift ios11 fileprovider-extension

我试图在Word.app中创建一个新文档,并通过FileProvider扩展名保存到我的应用程序。我实施的适当方法是:

    override func importDocument(at fileURL: URL,
                                 toParentItemIdentifier parentItemIdentifier: NSFileProviderItemIdentifier,
                                 completionHandler: @escaping (NSFileProviderItem?, Error?) -> Void)
    {

        let internalUrl = NSFileProviderManager.default.documentStorageURL.appendingPathComponent(fileURL.lastPathComponent, isDirectory: false)

        guard fileURL.startAccessingSecurityScopedResource() else { fatalError() }
        try! FileManager.default.copyItem(at: fileURL, to: internalUrl) // breakpoint here
        fileURL.stopAccessingSecurityScopedResource()

        // update local db, whatever

        completionHandler(TemporaryItem(forImporting: internalUrl, into: parentItemIdentifier), nil)
    }

显然,当我通过po FileManager.default.attributesOfItem(forPath: fileURL.path)命令放置断点并检查文件属性时,NSFileSize的值为0。 命令po FileManager.default.contents(atPath: fileURL.path)返回带有0x000000000000bad0指针的0字节数据。 写入internalUrl的文件也是空的。

最奇怪的是,这种情况只发生在MS Word,Excel和PowerPoint应用程序中。从PSPDFKit,文件或照片保存的文件的相同代码完美无缺。另一方面,Word正确地将文件保存到其他文件提供程序,如Dropbox,因此问题不应该存在。

我已经尝试过使用文件协调员,但这并没有帮助。我已经验证了每个startAccessingSecurityScopedResource()都有它的stopAccessingSecurityScopedResource()。我已经在两个iOS11.3设备上进行了测试 - 同样的行为。我甚至找到了执行相同操作的其他open source应用程序。

除了期待iOS应用扩展能够运作之外我做错了什么?

1 个答案:

答案 0 :(得分:2)

因为Word应用程序将触发多次importDocument ...

在第一次importDocument调用时,它将尝试在文件提供程序扩展名上创建空文件。这就是为什么导入文件的大小为0。

如果处理得当,Word应用程序将获取保存的文件路径并更新其上的文件。 然后它将触发带有刚得到的文件路径的下一个itemChangedAtURL:api。