You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.archiveUTTypeConformsTo能帮助系统更准确识别

最后,清理项目的Derived Data,重新编译运行,应该就能正常选中.mxl格式的MusicXML文件了。

内容的提问来源于stack exchange,提问作者es1

火山引擎 最新活动