iOS13中UIDocumentPickerViewController仅允许选择二进制文件的问题
问题根因
- 你自定义UTI时用了
public.前缀,这是苹果官方保留的系统UTI命名空间,第三方App没有权限声明、覆写这个前缀下的类型,你写在UTExportedTypeDeclarations里的public.firmware配置会被系统直接忽略,完全不生效。 - 实现二进制文件筛选不需要自定义UTI,iOS13自带对应系统UTI可以直接用。
- 你选的
application/octet-streamMIME类型是正确的,就是通用二进制流的标准标识,不需要调整。
iOS13适配方案
根据你的筛选粒度选对应方案即可:
方案1:允许选择所有通用二进制文件
不需要在info.plist里加任何UTI配置,把你之前加的UTExportedTypeDeclarations整段删掉,直接修改调用代码:
let vc = UIDocumentPickerViewController(documentTypes: ["public.data", "com.apple.binary"], in: .import) vc.delegate = self self.present(vc, animated: true)
说明:public.data是所有原始二进制数据的基础UTI,com.apple.binary是苹果内置的通用二进制文件标识,二者组合可以覆盖绝大多数无格式二进制文件,包括.bin后缀的固件文件。
方案2:严格限定仅选择.bin后缀的固件文件
如果要做精准后缀筛选,才需要自定义UTI,注意必须用你自己App的反向域名作为UTI前缀,不能用public.开头:
- 修改info.plist的UTI配置,替换UTI标识:
<key>UTExportedTypeDeclarations</key> <array> <dict> <key>UTTypeIdentifier</key> <!-- 替换成你自己App的反向域名格式,比如com.你的开发者账号.你的App名.binfirmware --> <string>com.yourapp.binfirmware</string> <key>UTTypeDescription</key> <string>Firmware Binary</string> <key>UTTypeConformsTo</key> <array> <string>public.data</string> <string>com.apple.binary</string> </array> <key>UTTypeTagSpecification</key> <dict> <key>public.filename-extension</key> <array> <string>bin</string> </array> <key>public.mime-type</key> <string>application/octet-stream</string> </dict> </dict> </array>
- 对应修改文件选择器的调用参数,传入你自定义的UTI:
let vc = UIDocumentPickerViewController(documentTypes: ["com.yourapp.binfirmware"], in: .import) vc.delegate = self self.present(vc, animated: true)
补充说明
UTType相关的便捷API是iOS14及以上系统才提供的,iOS13下不要调用,否则会触发崩溃。- 如果配置完后仍有少量非目标文件出现在选择列表里,可以在
UIDocumentPickerDelegate的选中回调里做二次校验:拿到文件URL后检查后缀名、读取文件头信息判断是不是真的固件二进制,不符合要求就弹出提示让用户重新选择即可。
内容的提问来源于stack exchange,提问作者Yogurt
相关产品推荐
相关产品推荐

