Вы ищете платформу 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