You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI中iOS设备USB存储连接检测问题及代码异常排查

问题解决方案

一、USB U盘检测问题(EAAccessoryManager无效)

  • 核心原因:EAAccessoryManager仅适用于苹果MFi认证的专用外部配件(如特定蓝牙设备、工业控制配件等),普通U盘不属于此类设备范畴,因此无法通过该API实现检测或识别。
  • 正确方向:iOS中访问U盘需通过文件系统框架结合用户授权的文档选择器,而非EAAccessory相关API。

二、挂载卷获取崩溃与权限配置

1. 必要的Info.plist配置

需在项目的Info.plist中添加以下配置项,确保应用具备访问外部存储的权限:

<!-- 允许应用参与系统文件共享 -->
<key>UIFileSharingEnabled</key>
<true/>
<!-- 允许直接在外部存储位置打开文档(无需复制到应用沙盒) -->
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<!-- 声明应用支持的文档类型(可根据U盘内文件类型调整) -->
<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>All Files</string>
        <key>LSHandlerRank</key>
        <string>Alternate</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.item</string>
        </array>
    </dict>
</array>

2. 修复崩溃与正确访问挂载卷

  • 崩溃原因:直接调用NSFileManager.GetMountedVolumes遍历挂载卷,会因iOS沙盒权限限制抛出异常;同时若在非UI线程调用DisplayAlert,也会导致程序崩溃。此外,iOS不允许应用直接枚举所有挂载卷,必须通过用户主动授权的路径访问。
  • 正确实现步骤:
    1. 通过文档选择器获取用户授权,访问U盘内容:
      var picker = new UIDocumentPickerViewController(new string[] { "public.item" }, UIDocumentPickerMode.Open);
      picker.DidPickDocumentAtUrls += (sender, e) => {
          foreach (var url in e.Urls) {
              // 标记URL为持久化授权,重启应用后仍可访问
              url.StartAccessingSecurityScopedResource();
              
              // 获取卷名称
              if (url.ResourceValuesForKeys(new[] { NSUrl.VolumeNameKey }, out NSError error)) {
                  var volumeName = url.ResourceValues[NSUrl.VolumeNameKey].ToString();
                  // 必须在UI线程执行弹窗操作
                  Device.BeginInvokeOnMainThread(() => {
                      Shell.Current.DisplayAlert("Alert", volumeName, "OK");
                  });
              }
              
              // 使用完毕后停止访问,释放资源
              url.StopAccessingSecurityScopedResource();
          }
      };
      // 在当前根控制器上弹出文档选择器
      UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(picker, true, null);
      
    2. 避免直接调用NSFileManager.GetMountedVolumes,该方法在iOS沙盒机制下无法获取外部存储的挂载卷信息。

三、总结

  • 放弃使用EAAccessoryManager检测U盘,该API不支持普通存储设备。
  • 通过UIDocumentPickerViewController获取用户授权,配合Info.plist的权限配置,才能安全访问U盘内容。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:53:18