Обработка дистанционного спуска
Получайте события дистанционного спуска через DeviceDelegate, выполняйте нужное действие камерой приложения и передавайте результат устройству.
Предварительные условия
- Устройство подключено и поддерживает
DeviceRemoteShutterAPI. - В приложении задан
NSCameraUsageDescriptionи запрошен доступ к камере. - Приложение управляет
AVCaptureSessionи самостоятельно реализует съёмку.
Реализация с помощью AI
Разработка с AI
Реализуйте этот сценарий с AI
Используйте официальный навык «Реализация удалённого затвора AIBuds» и адаптируйте сценарий к приложению.
Прочитайте и выполните инструкции https://docs-aibuds.github.io/ru/skills/implement-aibuds-remote-shutter. Используйте этот навык, чтобы реализовать «Реализация удалённого затвора AIBuds» в данном iOS-проекте и проверить результат.Справочник API
Протокол
- Swift
- Objective-C
/// The protocol for device remote shutter API.
protocol DeviceRemoteShutterAPI: DeviceAPI {
/// Syncs the app’s real-time remote-shutter response state to the device after the device triggers remote shutter.
/// - Parameters:
/// - state: The real-time remote-shutter response state to sync to the device.
/// - completion: A closure that is called when the operation completes.
/// - success: `true` if the operation was successful; otherwise `false`.
/// - error: An `NSError` object that describes the error that occurred, or `nil` if the operation was successful.
func syncRemoteShutterStateToDevice(
_ state: RemoteShutterState,
completion: AIBudsCompletionHandler?
)
}/// The protocol for device remote shutter API.
@protocol AIBudsDeviceRemoteShutterAPI <AIBudsDeviceAPI>
/// Syncs the app’s real-time remote-shutter response state to the device after the device triggers
/// remote shutter.
/// - Parameters:
/// - state: The real-time remote-shutter response state to sync to the device.
/// - completion: A closure that is called when the operation completes.
/// - success: `true` if the operation was successful; otherwise `false`.
/// - error: An `NSError` object that describes the error that occurred, or `nil` if the
/// operation was successful.
- (void)syncRemoteShutterStateToDevice:(enum AIBudsRemoteShutterState)state
completion:(AIBudsCompletionHandler _Nullable)completion;
@endСм. syncRemoteShutterStateToDevice в справочнике API.
Обратный вызов делегата
- Swift
- Objective-C
/// Callback when remote shutter event received
/// - Parameters:
/// - device: the device
/// - event: the remote shutter event
optional func device(
_ device: DeviceConvertible,
didReceiveRemoteShutterEvent event: RemoteShutterEvent
)/// Callback when remote shutter event received
/// - Parameters:
/// - device: the device
/// - event: the remote shutter event
- (void)device:(id<AIBudsDeviceConvertible> _Nonnull)device
didReceiveRemoteShutterEvent:(enum AIBudsRemoteShutterEvent)event;Примеры использования
В примере детали работы камеры вынесены в локальные методы, чтобы поток событий SDK оставался понятным.
- Swift
- Objective-C
func device(
_ device: DeviceConvertible,
didReceiveRemoteShutterEvent event: RemoteShutterEvent
) {
guard let remoteShutter = device as? DeviceRemoteShutterAPI else { return }
switch event {
case .enter:
prepareAppCamera { ready in
let state: RemoteShutterState =
ready
? .enteredPhotoMode
: .exitedOrUnableToEnter
remoteShutter.syncRemoteShutterStateToDevice(state, completion: nil)
}
case .capture:
captureAppPhoto { success in
remoteShutter.syncRemoteShutterStateToDevice(
success ? .photoSuccess : .photoFailed,
completion: nil
)
}
case .exit:
stopAppCamera()
remoteShutter.syncRemoteShutterStateToDevice(
.exitedOrUnableToEnter,
completion: nil
)
case .unknown:
break
}
}- (void)device:(id<AIBudsDeviceConvertible>)device
didReceiveRemoteShutterEvent:(AIBudsRemoteShutterEvent)event {
id<AIBudsDeviceRemoteShutterAPI> remoteShutter = (id<AIBudsDeviceRemoteShutterAPI>)device;
if (![remoteShutter conformsToProtocol:@protocol(AIBudsDeviceRemoteShutterAPI)])
return;
switch (event) {
case AIBudsRemoteShutterEventEnter:
[self prepareAppCameraWithCompletion:^(BOOL ready) {
AIBudsRemoteShutterState state = ready ? AIBudsRemoteShutterStateEnteredPhotoMode
: AIBudsRemoteShutterStateExitedOrUnableToEnter;
[remoteShutter syncRemoteShutterStateToDevice:state completion:nil];
}];
break;
case AIBudsRemoteShutterEventCapture:
[self captureAppPhotoWithCompletion:^(BOOL success) {
AIBudsRemoteShutterState state = success ? AIBudsRemoteShutterStatePhotoSuccess
: AIBudsRemoteShutterStatePhotoFailed;
[remoteShutter syncRemoteShutterStateToDevice:state completion:nil];
}];
break;
case AIBudsRemoteShutterEventExit:
[self stopAppCamera];
[remoteShutter syncRemoteShutterStateToDevice:AIBudsRemoteShutterStateExitedOrUnableToEnter
completion:nil];
break;
default:
break;
}
}Обработка ошибок
Передавайте .photoFailed, если съёмка не удалась из-за отсутствия разрешения, недоступного хранилища или ошибки камеры. Передавайте .exitedOrUnableToEnter, если приложение не смогло войти в режим фото или вышло из него.