Skip to main content

Handle Remote Shutter

Receive remote-shutter events through DeviceDelegate, perform the corresponding app-camera action, and synchronize the result to the device.

Prerequisites

  • The device is connected and conforms to DeviceRemoteShutterAPI.
  • The app has an NSCameraUsageDescription entry and requests camera authorization.
  • The app owns an AVCaptureSession and photo-capture implementation.

Implement with AI Assistance

Build with AI

Implement this workflow with AI

Use the official Implement AIBuds Remote Shutter skill to adapt this workflow to your app.

Read and follow https://docs-aibuds.github.io/skills/implement-aibuds-remote-shutter. Use it to implement Implement AIBuds Remote Shutter in this iOS project and verify the result.
View official skill

API Reference

Protocol

Swift
/// 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?
    )
}

See syncRemoteShutterStateToDevice in the API Reference.

Delegate Callback

Swift
/// Callback when remote shutter event received
/// - Parameters:
///   - device: the device
///   - event: the remote shutter event
optional func device(
    _ device: DeviceConvertible,
    didReceiveRemoteShutterEvent event: RemoteShutterEvent
)

Usage Examples

The example delegates app-camera details to local methods so the SDK event flow remains clear.

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

Error Handling

Report .photoFailed when capture fails because permission is denied, storage is unavailable, or the app camera cannot capture. Report .exitedOrUnableToEnter when the app cannot enter photo mode or has left it.