iOS 13 Image Capture API для доступа к файловой системе внешней камеры?

На странице списка функций Apple iOS 13 есть следующая реклама:

API захвата изображений

API Image Capture позволяет разработчикам использовать Camera Connection Kit для импорта фотографий непосредственно в свои приложения.

Я искал, но не могу найти никакой фактической документации об этом изменении и о том, где оно существует в API. Я также помню, как слышал пару секунд разговора об этом в программном докладе/состоянии профсоюза на WWDC 19, но опять же, никаких подробностей ни на одной из сессий, которые я пока не нашел.

Похоже, вы сможете подключить камеру или ее SD-карту к порту USB-C/Lightning на устройстве iOS и получить к ним доступ из стороннего приложения. Я знаю, что вы можете импортировать в системную библиотеку фотографий, но это существует уже много лет. Я также знаю о ExternalAccessory фреймворке для оборудования MiFi, но я не вижу каких-либо существенных изменений в нем, и, похоже, он не раскрывает описанную функциональность.

Я вижу, что UIDocumentPicker может отображаться, и это позволяет пользователю выбрать место, которое может быть на подключенном USB-устройстве. Хотя это может сработать, это не зависит от камеры и может привести к ошибкам, если пользователь не выберет допустимое местоположение камеры.

Кто-нибудь знает, где я могу найти больше информации об этом изменении или как вы можете программно получить доступ к файловой системе камеры? Камера будет иметь стандартную структуру папок камеры DCIM и прочее, поэтому многие приложения для Mac распознают ее как файловую систему камеры.


person jamone    schedule 09.07.2019    source источник
comment
Да, я тоже умирал, чтобы узнать, как это сделать. Судя по их быстрой демонстрации, Lightroom просто автоматически импортировал фотографии с камеры с минимальным взаимодействием со стороны пользователя, поэтому это должно быть что-то еще, кроме UIDocumentPicker, но я также не могу найти ничего об этом.   -  person vtcajones    schedule 30.07.2019


Ответы (1)


Вы ищете платформу ImageCaptureCore. Это та же структура, которая существует в macOS для импорта с SD-карт и камер. Теперь он доступен в iOS 13.2.

Обновление:

API ImageCaptureCore теперь работает с 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

Затем вы должны начать получать сообщения делегата, когда камера подключена:

- (void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing;
- (void)deviceBrowser:(ICDeviceBrowser*)browser didRemoveDevice:(ICDevice*)removedDevice moreGoing:(BOOL)moreGoing;

Когда вы получите сообщение didAddDevice:, вы захотите использовать API ICDevice (ICDevice.h) и ICCameraDevice (ICCameraDevice.h) для установки делегата и запуска сеанса. После начала сеанса вы начнете получать сообщения делегата:

- (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
    }
}

Вы можете использовать метод делегата:

- (void)cameraDevice:(nonnull ICCameraDevice *)camera
         didAddItems:(nonnull NSArray<ICCameraItem *> *)items;

Чтобы получить список элементов по мере их перечисления API или дождитесь:

- (void)deviceDidBecomeReadyWithCompleteContentCatalog:(ICDevice*)device;

А затем используйте свойство .contents для ICCameraDevice, чтобы получить все содержимое.

Оттуда вы можете использовать ICCameraDevice для запроса эскизов, метаданных и загрузки определенных файлов. Я оставлю это в качестве упражнения читателю.

Как я упоминал выше, похоже, это не работает в iOS/iPadOS 13.1 Beta 3. Надеюсь, все это скоро начнет работать, так как я действительно хотел бы начать тестирование самостоятельно.

Теперь это работает в iOS 13.2.

person Cutterpillow    schedule 31.07.2019
comment
Да, вы даже не можете найти заголовки на сайте Apple, не говоря уже о какой-либо документации. Даже для macOS это никогда не было хорошо задокументировано. - person Cutterpillow; 01.08.2019
comment
Теперь, когда iOS 13 вот-вот выйдет, все еще работает? - person vtcajones; 10.09.2019
comment
@vtcajones нет, я только что протестировал последние бета-версии, выпущенные сегодня (13.1 beta 3), и они все еще не работают. Кроме того, на странице функций iPadOS теперь есть звездочка в разделе Захват изображения. API, что указывает на то, что он появится позже в этом году. Я думаю, это означает, что он появится через некоторое время после 13.1. - person Cutterpillow; 11.09.2019
comment
@Cutterpillow, это разочаровывает. Спасибо за регистрацию! - person vtcajones; 12.09.2019
comment
@vtcajones, просто пинг, чтобы отметить, что теперь это работает в iOS 13.2. Ваше здоровье. - person Cutterpillow; 08.11.2019
comment
@Cutterpillow, я думаю, что следил за вашей темой в Твиттере, где вы также упомянули об этом. Спасибо! Я изучаю возможность выполнения ручных команд PTP, потому что, когда я пытаюсь использовать requestOpenSession на Canon 70D, он блокирует камеру, поэтому я не могу делать фотографии, и я пытаюсь делать живую съемку по мере поступления фотографий. - person vtcajones; 13.11.2019