使用SwiftUI FileImporter时iCloud内mybackup后缀文件灰化无法选择
根因是临时创建的自定义UTType未被系统全局注册,iCloud文件枚举时无法识别该后缀对应的文件类型,按以下步骤配置即可解决:
步骤1:全局注册自定义文件类型UTI
仅在代码中临时初始化UTType仅当前运行时生效,必须在项目配置中全局注册,让系统可以识别对应的文件后缀:
- 打开项目的 Signing & Capabilities 标签,找到
Document Types配置项,新增一条记录:Name字段填写自定义备份文件的展示名,比如应用备份文件Types字段填写自定义UTI标识符,使用反向域名格式,比如com.你的域名.你的应用名.backupExtensions字段填写你的自定义后缀mybackup
- 新增
Exported Type Identifiers配置项(如果该格式是你的应用独有就用导出类型,是兼容其他应用的格式就用Imported Type Identifiers):Description字段填写文件类型描述,比如自定义应用备份文件Identifier字段填写和上面一致的UTI标识符:com.你的域名.你的应用名.backupConforms To字段填写父类UTI,普通二进制文件填public.data,压缩包类可填public.archiveExtensions字段填写mybackup
步骤2:开启iCloud文档访问能力
访问iCloud Drive中的文件必须开启对应的应用权限:
- 在Signing & Capabilities标签点击右上角+Capability,添加
iCloud能力 - 勾选
iCloud Documents选项 - 配置对应iCloud容器,容器ID需要和你开发者账号后台创建的ID保持一致
步骤3:修改代码中的UTType引用
注册完成后直接引用你注册的UTI,不要临时生成:
import UniformTypeIdentifiers // 全局扩展UTType添加你的自定义类型 extension UTType { static let myBackup = UTType("com.你的域名.你的应用名.backup")! } // 调用fileImporter时直接使用该常量 .fileImporter(isPresented: $showFilePicker, allowedContentTypes: [.myBackup], onCompletion: { (res) in do { let fileUrl = try res.get() if fileUrl.startAccessingSecurityScopedResource() { onRestoreBackup(file: fileUrl) fileUrl.stopAccessingSecurityScopedResource() } } catch { // 错误处理逻辑 } })
验证注意事项
- 配置完成后先卸载设备上已安装的旧应用再重新安装,确保系统读取到最新的UTI注册信息
- 检查iCloud Drive中的文件后缀是否为
mybackup,排除拼写错误、文件被标记为隐藏的情况
内容的提问来源于stack exchange,提问作者Mackan
相关产品推荐
相关产品推荐

