UIActivityViewController分享:Mail发送时扁平化UIDocument文档包问题
解决Mail发送文档包被扁平化的问题
我之前在做类似的UIDocument文档包项目时,也碰到过Mail把文档包扁平化的坑,折腾了好一阵才搞定。结合我的经验,给你几个可行的解决方向:
先确认文档包的UTI配置是否完全到位
本地能正常识别不代表Mail也能认。你的Info.plist里,要确保文档包的UTI满足这几点:UTTypeConformsTo包含com.apple.package,明确告诉系统这是一个包类型文件UTTypeTagSpecification里配置好对应的文件扩展名(比如.mydocpkg),让Mail能通过扩展名关联到你的UTICFBundleDocumentTypes中正确关联这个UTI,且LSHandlerRank设为Owner
没有扩展名的“裸文件夹”会被Mail直接当成普通文件夹展开,所以给文档包加上专属扩展名是关键。
不要直接用
fileURL分享,改用自定义UIActivityItemProvider
直接把文档包的fileURL传给UIActivityViewController时,Mail会默认解析文件夹结构并扁平化。我们可以用UIActivityItemProvider来包装文档包,让Mail把它当成单一附件处理。举个Swift示例:
class DocPackageShareProvider: UIActivityItemProvider { private let targetDoc: YourCustomUIDocument init(document: YourCustomUIDocument) { self.targetDoc = document super.init(placeholderItem: document.fileURL) } override var item: Any { guard let fileWrapper = targetDoc.fileWrapper else { return targetDoc.fileURL } // 将文档包的FileWrapper序列化为Data do { return try fileWrapper.serialize() } catch { print("序列化文档包失败: \(error)") return targetDoc.fileURL } } override func activityViewController(_ activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: UIActivity.ActivityType?) -> String { // 返回你的文档包专属UTI return "com.yourcompany.yourapp.customdocpkg" } }然后分享时用这个provider代替直接传fileURL:
let shareProvider = DocPackageShareProvider(document: yourDocument) let activityVC = UIActivityViewController(activityItems: [shareProvider], applicationActivities: nil) present(activityVC, animated: true)测试往返流程时注意细节
发送后接收端要确保能正确识别你的文档包UTI,不然可能还是会显示成文件夹。可以在接收端的测试设备上也配置好相同的UTI,或者用你的App打开附件验证是否能正常加载。另外,如果你不想自定义provider,也可以尝试先把文档包压缩成.zip再分享,但这样用户需要额外解压,体验不如直接发送原生文档包好。
内容的提问来源于stack exchange,提问作者joshd
相关产品推荐
相关产品推荐

