未知UTType是导出/导入时,Swift包中应使用哪个初始化器?
动态创建适配宿主应用的UTType方案
核心思路:读取宿主应用的Info.plist声明
通过检查当前运行的宿主应用Info.plist中对com.example.custom-document的声明类型(导出/导入),动态创建对应的UTType实例,无需调用者手动传递参数。
具体实现
1. 封装UTType检测逻辑
在Swift包中添加一个UTType的扩展方法,自动判断并返回正确的UTType:
import UniformTypeIdentifiers import Foundation extension UTType { static var customDocument: UTType { let targetIdentifier = "com.example.custom-document" guard let infoPlist = Bundle.main.infoDictionary else { // 兜底:默认使用导入类型,确保导出功能正常 return UTType(importedAs: targetIdentifier) } // 检查是否为导出类型 if let exportedTypes = infoPlist["UTExportedTypeDeclarations"] as? [[String: Any]], exportedTypes.contains(where: { $0["UTTypeIdentifier"] as? String == targetIdentifier }) { return UTType(exportedAs: targetIdentifier) } // 否则使用导入类型 return UTType(importedAs: targetIdentifier) } }
2. 在共享视图中直接调用
在.fileExporter中直接使用这个预定义的UTType属性,无需上层视图传递参数:
// 共享视图内的导出代码示例 .fileExporter( isPresented: $showExportSheet, document: currentDocument, contentType: .customDocument, defaultFilename: "New Document.custom" ) { exportResult in switch exportResult { case .success(let url): print("导出成功:\(url)") case .failure(let error): print("导出失败:\(error.localizedDescription)") } }
关键说明
- 利用
Bundle.main获取宿主应用的配置,精准匹配App A(导出方)和App B(导入方)的不同声明。 - 兜底逻辑确保即使Info.plist读取失败,导出功能依然能正常运行,不会因类型创建失败崩溃。
- 完全避免了在复杂视图层级中传递UTType参数,保持了共享视图的职责单一性。
内容的提问来源于stack exchange,提问作者Sweeper
相关产品推荐
相关产品推荐

