FileImporter 是 SwiftUI 中用于在 App 中导入外部文件的视图修饰器,通常用于在用户点击按钮后,弹出一个系统的「文件选择器」来导入文件。
它是 SwiftUI 的封装,底层等价于 macOS 的 NSOpenPanel 或 iOS 的 UIDocumentPickerViewController。
基本功能
1、弹出文件选择面板:用户可浏览文件系统选择文件。
2、过滤支持的文件类型:例如:只导入 .png、.json 等。
3、自动处理文件权限(沙盒):支持安全访问。
4、获取选中文件的 URL:可加载、解析文件。
基本用法
.fileImporter(
isPresented: $showImporter,
allowedContentTypes: [.json, .plainText],
allowsMultipleSelection: false
) { result in
// 处理选择结果
}
参数解析:
1、isPresented:Binding<Bool>,控制是否显示文件选择窗口。
2、allowedContentTypes:[UTType]类型,限制可选文件类型(如 .image, .pdf)。
3、allowsMultipleSelection:Bool类型,是否支持多选文件(默认 false)。
4、result:Result<[URL], Error> 或 Result<URL, Error>类型,用户选择结果或取消错误。
使用场景
1、选择文本并加载内容
import SwiftUI
import UniformTypeIdentifiers
struct FileImportView: View {
@State private var showImporter = false
@State private var importedText: String = ""
var body: some View {
VStack {
Button("导入文件") {
showImporter = true
}
Text(importedText)
.padding()
}
.fileImporter(
isPresented: $showImporter,
allowedContentTypes: [.plainText]
) { result in
do {
let selectedFile: URL = try result.get()
// 沙盒权限权限请求
guard selectedFile.startAccessingSecurityScopedResource() else {
importedText = "无法访问文件权限"
return
}
defer { selectedFile.stopAccessingSecurityScopedResource() }
let data = try Data(contentsOf: selectedFile)
if let content = String(data: data, encoding: .utf8) {
importedText = content
}
} catch {
importedText = "导入失败:\(error.localizedDescription)"
}
}
}
}

需要注意的是,在macOS沙盒安全机制下,FileImporter可能无法获取文件读取权限。
因此,在读取前需要调用startAccessingSecurityScopedResource(),显式请求安全访问权限,访问完成后,再调用stopAccessingSecurityScopedResource(),停止安全访问权限。
这部分可以查看《macOS安全书签(Security-Scoped Bookmark)》中的权限部分。
使用场景
1、导入配置文件(JSON, XML)。
2、选择图片或音频进行处理。。
3、打开第三方文档。
4、选择多个图片文件。
如果是实现文档型App(编辑+保存),推荐用DocumentGroup。
总结
FileImporter是SwiftUI的文件导入修饰符,可配合@State控制显示。
支持导入文本、图像、PDF、音频、任意自定义UTI的文件。
支持多选、错误处理、安全访问、异步操作。
适用于iOS 14+/macOS 11+平台。
相关文章
1、macOS文件选择对话框NSOpenPanel:https://fangjunyu.com/2025/06/27/macos%e6%96%87%e4%bb%b6%e9%80%89%e6%8b%a9%e5%af%b9%e8%af%9d%e6%a1%86nsopenpanel/
2、macOS安全书签(Security-Scoped Bookmark):https://fangjunyu.com/2025/06/29/macos%e5%ae%89%e5%85%a8%e4%b9%a6%e7%ad%be%ef%bc%88security-scoped-bookmark%ef%bc%89/