如何在没有 DocumentPicker 的情况下读取外部大容量存储设备的文件? (iOS)

How to read files of External Mass Storage Devices Without DocumentPicker? (iOS)

只是为了提供一些上下文,我正在构建一个 iOS 应用程序(在 Xamarin 中),它需要能够获取文件 (以自动方式 无需 让用户导航到文件并 select 手动) 存储在外部存储设备(USB 记忆棒)上,并连接(配对)到 iPhone/iPad.

用户将照明电缆连接到 iOS 设备,并将他们的 USB 记忆棒插入此照明电缆。这是最终用户使用的电缆示例将 USB 记忆棒与其 iPhone/iPad 配对,然后应用程序会自动从 USB 存储设备中获取这些文件。

该应用随后执行 2 个功能:

  1. 当 USB 记忆棒与 iOS 设备配对时,它会监听通知。
  2. 当它收到这个通知后,它会继续查询U盘上的文件,并读取和处理这些文件。应用程序自动读取这些文件,用户不需要手动select这些文件

我试过使用外部附件框架,但这只适用于您注册了 MFi 程序的设备。 https://developer.apple.com/documentation/externalaccessory

通知中心似乎永远无法工作(当设备连接和断开连接时处理的通知,代理永远不会被调用),我已经尝试使用 Microsoft Helpers。

https://docs.microsoft.com/en-us/dotnet/api/externalaccessory.eaaccessorymanager.notifications.observedidconnect?view=xamarin-ios-sdk-12

我也尝试了一些第 3 方库,但没有发现任何有用的东西。

Apple 似乎没有任何 Api 可用于自动查询和读取文件,而无需使用 DocumentPickerController。我知道这是因为应用沙盒,我无法直接访问可移动存储设备。

现在回答我的问题:

  1. 有没有任何人可以推荐的第 3 方库,可以帮助完成此任务的大部分繁重工作?我更喜欢与 Xamarin 兼容的库,但是如果它是本机库(Swift 或 Objective-C 库,Cocoapods),我确定可以在 nuget 上使用绑定。
  2. 有没有人有任何片段或文档,或者可以在这里为我指明正确的方向(请随时 post Swift 或 Objective-c如果你喜欢这里的解决方案)?我应该在哪里看,哪个 Apple Framework (iOS SDK) 最适合处理这种情况。总而言之,我在 iOS 上所要求的是完全可能的,而无需越狱或绕过 App Sandbox 吗?

更新

所以我尝试了@Saamer 建议的解决方案:

这是我写的一个例子,只是为了验证回调是否被调用,应用程序可以检测是否插入了 USB。

CFNotificationCenter.Darwin.AddObserver("com.apple.mobile.lockdown.host_attached", null, (e, s) =>
        {
            MainThread.BeginInvokeOnMainThread(async () =>
            {
                var picker = await Xamarin.Essentials.FilePicker.PickAsync();
            });
    }, CFNotificationSuspensionBehavior.DeliverImmediately);

插入 USB 后,文件选择器应该立即被调用并打开,然而这并没有发生。

我很高兴现在有一个解决方案,当用户插入 USB 设备时,它会打开一个文件选择器,然后导航到根目录开始。因此,当文件选择器打开时,用户应该会看到这个。 然后他们可以 select 他们想要传输到应用程序中的文件。

  1. 我认为你需要越狱,但似乎不太可能, 的解决方案是可能的

根据 Apple Docs

You can use the Files app and other supported apps to access files stored on external devices, such as USB drives and SD cards, connected to your iPhone.

  1. 本质上,您必须制作一个“受支持的应用程序”。我下载了一个名为“Clockology”的免费应用程序,我建议下载并使用它,它允许用户在应用程序中查看数据,如下所示:

您通常使用 UIDocumentPickerViewController 和正确的 uttype 从文件应用程序或 iCloud Drive 获取文件,并且您需要激活 Key-value storageiCloud Documents来自 iCloud 权利能力。有很多关于 UIDocumentPickerViewController 用法的教程,但您特别想要从 iOS 13 开始可用的功能

This video from WWDC 是到达目的地的最佳示例。我也没有找到任何可以帮助解决这个问题的第 3 方库

————————-

编辑:如果应用程序不需要通过 TestFlight 或 App Store 分发,您可以使用 IOKit 并通过 AppCenter 分发,只要您拥有需要安装该应用程序的所有设备的 UDIDs (最多 100 个?)