iOS 13 Image Capture API是否可以访问外部相机的文件系统?

jam*_*one 7 usb camera ios ios13

Apple的iOS 13功能列表页面中,它们具有以下内容:

图像捕捉API

利用Image Capture API,开发人员可以利用Camera Connection Kit将照片直接导入其应用程序。

我一直在寻找,但似乎找不到有关此更改及其在API中的位置的任何实际文档。我还记得在WWDC 19的主题演讲/工会状态中听到过一两秒钟的谈论,但是到目前为止我没有发现任何细节。

看来您可以将相机或其SD卡插入iOS设备上的USB-C / Lightning端口,并能够从第三方应用程序中访问它。我知道您可以导入系统照片库,但是已经存在了很多年。我也了解ExternalAccessoryMiFi硬件的框架,但是我没有看到任何重大变化,而且似乎没有公开所描述的功能。

我确实看到UIDocumentPicker可以显示出来,并且它允许用户选择连接的USB设备上的位置。尽管这可行,但如果用户没有选择有效的相机位置,则它不是特定于相机的,并且很容易出错。

有人知道我在哪里可以找到有关此更改的更多信息,或者如何以编程方式访问相机的文件系统?相机将具有标准的相机文件夹结构DCIM和内容,因此许多Mac应用程序将其视为相机文件系统。

Cut*_*low 6

您正在寻找ImageCaptureCore框架。这与macOS上用于从SD卡和相机导入的框架相同。现在在iOS 13.2中可用。

更新:

ImageCaptureCore API现在从iOS 13.2开始运行。

但是,请注意,自iOS / iPadOS 13.1 Beta 3(17A5837a)起,我还无法使其正常运行(报告为Apple FB6799036)。现在,它在iPadOS功能页面有星号,表示它将“ 在今年晚些时候上市”。

我可以启动ICDeviceBrowser,但连接设备时看到权限错误,但没有收到任何委托消息。因此,在开始工作之前,可能需要一些许可或权利。

不幸的是,Apple的开发人员站点上没有文档或示例代码(甚至适用于macOS)。但是该框架确实存在于iOS 13 SDK中,您可以在其中查看头文件。

我们在macOS应用程序中使用了这个框架,仅使用标头来找出问题还算不错。首先,创建一个ICDeviceBrowser(ICDeviceBrowser.h),设置其委托,然后启动浏览器:

@interface CameraManager() : NSObject <ICDeviceBrowserDelegate>
{
    ICDeviceBrowser* _deviceBrowser;
}
@end

@implementation CameraManager
- (id) init
{
    self = [super init];
    _deviceBrowser = [[ICDeviceBrowser alloc] init];
    _deviceBrowser.delegate = self;
    [_deviceBrowser start];

    return self;
}
...
@end
Run Code Online (Sandbox Code Playgroud)

连接摄像头设备后,您应该开始接收委托消息:

- (void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing;
- (void)deviceBrowser:(ICDeviceBrowser*)browser didRemoveDevice:(ICDevice*)removedDevice moreGoing:(BOOL)moreGoing;
Run Code Online (Sandbox Code Playgroud)

收到didAddDevice:消息后,您将要使用ICDevice(ICDevice.h)和ICCameraDevice(ICCameraDevice.h)API设置委托并启动会话。会话开始后,您将开始接收委托消息:

- (void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing
{
    if ((addedDevice.type & ICDeviceTypeMaskCamera) == ICDeviceTypeCamera)
    {
        ICCameraDevice* camera = (ICCameraDevice *) addedDevice;
        camera.delegate = self;
        [camera requestOpenSession];
        //  probably want to save 'camera' to a member variable
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用委托方法:

- (void)cameraDevice:(nonnull ICCameraDevice *)camera
         didAddItems:(nonnull NSArray<ICCameraItem *> *)items;
Run Code Online (Sandbox Code Playgroud)

要获取API枚举的项目列表,或等待:

- (void)deviceDidBecomeReadyWithCompleteContentCatalog:(ICDevice*)device;
Run Code Online (Sandbox Code Playgroud)

然后使用上的.contents属性ICCameraDevice获取所有内容。

从那里,您可以使用ICCameraDevice来请求缩略图,元数据以及下载特定文件。我将其留给读者练习。

正如我上面提到的,这似乎在iOS / iPadOS 13.1 Beta 3中不起作用。希望当我真的想自己开始对其进行测试时,所有这些都将开始起作用。

现在可以在iOS 13.2中使用。