UIDocumentInteractionController — 是一个 iOS 控制器,用于预览文档和在应用程序之间共享文件。它实现了 Open In 功能,允许用户在任何兼容的应用程序中打开文件、通过电子邮件发送或保存到云存储。根据 Apple Developer Documentation (2025),该控制器还支持内置的 Preview 来查看 PDF、图像和办公文档。
要点
UIDocumentInteractionController — 是一个 UIKit 类,提供用于处理文档的系统界面。与选择文件的 UIDocumentPickerViewController 不同,此控制器使用应用程序现有的文件,并向用户提供操作:预览、在另一个应用程序中打开、打印或发送。
该控制器不是 ViewController — 不通过 present 调用。相反,它通过 presentOptionsMenu 或 presentPreview 方法显示系统操作菜单。菜单显示所有注册用于处理此文件类型的应用程序。
UIDocumentInteractionController 自 iOS 2.0 起可用,是最早用于处理文档的 API 之一。尽管年代久远,它仍然适用于实现 Open In 功能和无第三方库的内置预览。
Preview — 是由 UIDocumentInteractionController 提供的内置文档查看器。它支持 PDF、图像、文本文件和办公文档(包括 .doc、.xls、.ppt)。Preview 以类似于标准 Quick Look 的过渡动画显示。
要启动 Preview,请调用 presentPreview 方法。控制器需要一个实现了 previewControllerForDocumentInteractionController 方法的委托,该方法返回一个用于显示文档的 UIViewController。通常返回 self 或导航控制器。
内置 Preview 不需要额外的框架或许可证。它可以与任何 URL 已传递给 url 属性的文件一起使用。用户可以翻页 PDF、缩放图像和从文档中复制文本。
Open In — UIDocumentInteractionController 的关键功能。它显示可以打开此文件类型的应用程序列表。用户选择目标应用程序,iOS 将文件复制到其沙箱中,并启动该应用程序以处理文档。
应用程序列表基于其他应用程序的 Info.plist 中注册的 Document Type 自动形成。如果某个应用程序注册了 PDF 支持,它将出现在 PDF 文件的 Open In 菜单中。系统还显示标准操作:打印、通过电子邮件发送、保存到文件。
Open In 复制文件 — 目标应用程序接收自己的副本,因此更改不会保存回原始应用程序。如果需要保存编辑,请使用 export 模式下的 UIDocumentPickerViewController 和 security-scoped URL。
自 iOS 6 起,UIActivityViewController 也可用,它也支持文件发送。与 UIDocumentInteractionController 不同,UIActivityViewController 显示系统操作表,支持 AirDrop、邮件、消息和自定义 UIActivity。对于简单的文件发送,建议使用 UIActivityViewController 作为更现代的 API。
通过 UIDocumentInteractionController 实现 Open In 只需要几行代码:创建实例、设置 URL 和委托、调用 presentOptionsMenu。控制器根据文件类型自动收集可用应用程序列表。
class DocumentViewController: UIViewController {
lazy var interactionController = UIDocumentInteractionController()
func shareFile(url: URL) {
interactionController.url = url
interactionController.uti = url.utiType()
interactionController.delegate = self
interactionController.presentOptionsMenu(
from: self.view.bounds,
in: self.view,
animated: true
)
}
}
要显示内置查看器而不是 Open In 菜单,请使用 presentPreview 方法。控制器将全屏显示文档,并具有翻页功能。委托必须实现 previewControllerForDocumentInteractionController 方法,该方法返回用于显示的 UIViewController。
UIDocumentInteractionControllerDelegate 管理菜单和 Preview 的显示和隐藏。委托实现可选方法:documentInteractionControllerWillPresentOpenInMenu 用于出现动画,documentInteractionControllerDidDismissOpenInMenu 用于在菜单关闭后清理资源。
Preview 的重要方法 — previewControllerForDocumentInteractionController,它必须返回一个用于显示文档的 UIViewController。如果该方法未实现或返回 nil,Preview 将不会启动。通常返回 self 或包含 self 的 UINavigationController。
该控制器还支持 documentInteractionController:didEndSendingToApplication 方法,该方法在文件成功传输到另一个应用程序后调用。这允许清理临时文件或在返回到应用程序后更新界面。
UIDocumentInteractionController 和 UIDocumentPickerViewController 解决不同的任务,尽管两者都处理文档。主要区别:UIDocumentInteractionController 将现有文件传输到另一个应用程序,而 UIDocumentPickerViewController 从外部源为当前应用程序选择文件。
| 参数 | UIDocumentInteractionController | UIDocumentPickerViewController |
|---|---|---|
| 目的 | 将文件发送到另一个应用程序 | 从另一个源选择文件 |
| 来源 | 应用程序自己的文件 | 任何存储(iCloud、文件、第三方) |
| 模式 | 将文件副本发送给接收者 | 为当前应用程序导入或导出 |
| 界面 | 系统菜单(Action Sheet) | 完整的文件浏览器 |
| 返回 | 不返回结果 | 通过委托返回所选文件的 URL |
UIDocumentInteractionController 不需要委托即可进行基本操作 — 即使没有实现方法,菜单也会显示。没有委托的 UIDocumentPickerViewController 是无用的 — 选择结果将不会被处理。API 的选择取决于场景:发送文件 → UIDocumentInteractionController,接收文件 → UIDocumentPickerViewController。
常见问题
UIDocumentInteractionController — 是一个 UIKit 控制器,用于通过 Open In 功能和内置 Preview 预览文档和在应用程序之间传输文件。
创建一个实例,将 url 属性设置为目标文件,指定委托,然后调用 presentOptionsMenu。系统将显示支持此文件类型的应用程序列表。
UIDocumentInteractionController Preview — 适用于单个文档的内置查看器,具有基本功能。Quick Look(QLPreviewController)— 一个独立的框架,支持批量查看、扩展和额外的文件格式。
委托对于基本操作是 可选的 — 没有它菜单也会显示。委托仅对 Preview(previewControllerForDocumentInteractionController 方法)和跟踪文件发送完成是必需的。
UIDocumentInteractionController 将现有文件从应用程序发送到另一个应用程序。UIDocumentPickerViewController 从外部源选择文件到当前应用程序。第一个用于发送,第二个用于接收。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。