2

概括:

邮件在发送时似乎将文档包展平。

背景:

我正在使用子类 UIDocument 和 FileWrappers 来提供一个文档包,用于存储我的文档的元数据、数据和缩略图预览。我已经做了必要的 UTI 咒语,以使文档包在本地工作。

我通过 UIActivityViewController 添加了共享支持。我正在使用其 fileURL 发送文档。在使用往返测试我的文档包时,一切似乎都运行良好:导出和导入运行良好......几乎。

问题:

使用邮件附件,文档包以半展平状态到达(导入不再将其视为文档包)。在检查文档时(在我的 Mac 上的 TextWrangler 中),仍然有目录结构,我可以看到元数据、数据、缩略图,但 FileManager 看不到它。

在发送电子邮件之前,我尝试将邮件附件共享回我的应用程序(通过复制到应用程序),并且效果很好。

问题:

跨邮件服务器移动文档包时,Mail 是否有异常行为?

我希望最终支持 Open in Place 和 Files 所以我真的不想将共享文档包装在 Data blob 等中。有谁知道这里发生了什么以及如何在将我的文档保存为包的同时处理它?

更新: 我已经确认 Apple Mail 正在压缩包,但没有更改扩展名。所以收到的文件是原始文件的 zip。我如何确保 Apple Mail 将其视为一个包裹并且不会压缩?而且,如果我不能,我如何识别正在导入的文件是没有 zip 扩展名的 zip?

4

1 回答 1

1

回答:

邮件确实在压缩文档包。

根据我的研究,我们不需要更改文档包方法(即没有扁平化的特殊导出类型)。在导入时,我们测试它是否是一个目录。如果它不是一个目录,那么我们尝试从它的源 URL 解压缩它,而不是仅仅复制它。需要注意的是,解压需要通过第三方库来处理。

我希望有一个内置的 API 来处理这个问题,但这似乎是处理它的方法。

(不优雅)示例代码:

// Check if directory
if let _ = try? FileManager.default.contentsOfDirectory(atPath: url.path) {
    // It is - try copying to the documents url
    do {
        try FileManager.default.copyItem(at: url, to: destination)
    } catch {
        self.delegate?.documentFileManagerDidFail(error: NSLocalizedString("Failed to copy file: \(error)", comment: "Document failure message"))
        return
    }
} else {
    // It's not - try unzipping to the documents url
    do {
        try FileManager.default.unzipItem(at: url, to: destination)
    } catch {
        self.delegate?.documentFileManagerDidFail(error: NSLocalizedString("Failed to unzip file: \(error)", comment: "Document failure message"))
        return
    }
}
于 2018-03-14T18:57:52.163 回答