swiftui 无原生 xml 上传组件,需桥接原生文件选择器(ios 用 uidocumentpickerviewcontroller、macos 用 nsopenpanel),读取 data 后手写 multipart/form-data 请求上传;关键在权限处理、边界格式与服务端字段名匹配。
SwiftUI 本身不提供直接上传 XML 文件的 UI 组件或网络能力,所谓“原生 XML 上传界面”,实际是组合 FileDocument + UIDocumentPickerViewController(iOS)或 OpenPanel(macOS)+ URLSession.uploadTask 的过程。关键不在“XML”本身,而在于如何选文件、读取内容、构造请求体并发送。
如何用 SwiftUI 触发系统文件选择器选中 XML 文件
iOS 和 macOS 的文件选择机制不同,不能只靠 FileImporter —— 它默认只支持文本/图片等有限类型,且无法指定 .xml 后缀白名单。必须桥接到原生视图控制器。
- iOS:用
UIViewControllerRepresentable包装UIDocumentPickerViewController,设置documentTypes为["public.xml"]或["com.apple.xml"](后者更稳妥) - macOS:用
NSViewControllerRepresentable包装NSOpenPanel,设置allowedFileTypes = ["xml"] - 务必检查
UTType是否可用:iOS 14+ 推荐用UTType.xml,但需在Info.plist中声明UTImportedTypeDeclarations,否则 picker 可能过滤掉用户手动重命名的.xml文件
选中后如何安全读取 XML 内容并验证格式
不要假设用户选的一定是良构 XML;直接调用 String(contentsOf:) 可能因编码问题崩溃。应优先用 Data 加载,再尝试解析。