Xamarin iOS中UIDocumentPickerViewController无法选中.mxl(MusicXML)文件
解决Xamarin iOS项目中.mxl文件无法在UIDocumentPicker选中的问题
我之前也碰到过类似的iOS 11上UIDocumentPicker无法选中特定格式文件的问题,结合你的代码和Info.plist配置,我发现几个关键问题需要调整:
1. 修正Info.plist中的文档类型关联
你当前的CFBundleDocumentTypes只添加了public.xml,没有包含.mxl对应的UTI(com.recordare.musicxml),这会让系统判定你的App不支持该格式,所以文档选择器会把.mxl文件置灰。另外,你在UTImportedTypeDeclarations里声明的public.data条目是错误的——public.data是系统内置UTI,不需要重复声明,而且这个条目的UTTypeIdentifier应该用自定义的MIDI类型(比如com.yourapp.midi)。
修改后的关键部分配置如下:
<key>UTImportedTypeDeclarations</key> <array> <dict> <key>UTTypeIdentifier</key> <string>com.recordare.musicxml.uncompressed</string> <key>UTTypeReferenceURL</key> <string>http://www.musicxml.org/</string> <key>UTTypeDescription</key> <string>Uncompressed MusicXML</string> <key>UTTypeTagSpecification</key> <dict> <key>public.filename-extension</key> <array> <string>xml</string> </array> <key>public.mime-type</key> <array> <string>application/vnd.recordare.musicxml+xml</string> </array> </dict> <key>UTTypeConformsTo</key> <array> <string>public.data</string> <string>public.content</string> </array> </dict> <dict> <key>UTTypeIdentifier</key> <string>com.recordare.musicxml</string> <key>UTTypeReferenceURL</key> <string>http://www.musicxml.org/</string> <key>UTTypeDescription</key> <string>Compressed MusicXML</string> <key>UTTypeTagSpecification</key> <dict> <key>public.filename-extension</key> <array> <string>mxl</string> </array> <key>public.mime-type</key> <array> <string>application/vnd.recordare.musicxml</string> </array> </dict> <key>UTTypeConformsTo</key> <array> <string>public.data</string> <string>public.content</string> <string>public.archive</string> <!-- 新增:mxl是压缩包类型,帮助系统识别 --> </array> </dict> <dict> <key>UTTypeDescription</key> <string>MIDI File</string> <key>UTTypeTagSpecification</key> <dict> <key>public.filename-extension</key> <array> <string>mid</string> </array> <key>public.mime-type</key> <array> <string>audio/midi</string> </array> </dict> <key>UTTypeConformsTo</key> <array> <string>public.data</string> <string>public.audio</string> </array> <key>UTTypeIdentifier</key> <string>com.yourapp.midi</string> <!-- 自定义UTI,替换系统内置的public.data --> </dict> </array> <key>CFBundleDocumentTypes</key> <array> <dict> <key>LSItemContentTypes</key> <array> <string>public.xml</string> <string>com.recordare.musicxml.uncompressed</string> <string>com.recordare.musicxml</string> <!-- 新增:关联.mxl对应的UTI --> </array> <key>CFBundleTypeName</key> <string>MusicSheet</string> <key>LSHandlerRank</key> <string>Alternate</string> <!-- 新增:明确App对该格式的处理优先级 --> </dict> </array>
2. 调整UIDocumentPicker的UTI列表
精简并明确UTI列表,去掉冗余的系统UTI,确保包含目标格式的明确标识:
// 精简后的允许UTI列表 var allowedUTIs = new string[] { UTType.PDF, UTType.XML, "com.recordare.musicxml", "com.recordare.musicxml.uncompressed" }; UIDocumentPickerViewController picker = new UIDocumentPickerViewController(allowedUTIs, UIDocumentPickerMode.Import);
3. iOS 11特定注意事项
iOS 11对文档选择器的UTI匹配逻辑更严格,需额外注意:
- 自定义UTI的
UTTypeTagSpecification里的扩展名和MIME类型必须完全匹配目标文件 CFBundleDocumentTypes必须包含所有要导入的UTI,否则系统会判定App不支持该格式- 对于压缩格式(如.mxl本质是zip包),添加
public.archive到UTTypeConformsTo能帮助系统更准确识别
最后,清理项目的Derived Data,重新编译运行,应该就能正常选中.mxl格式的MusicXML文件了。
内容的提问来源于stack exchange,提问作者es1




