Advanced Camera Functionality#

In this guide, you will learn about advanced camera functionality not explained in the “Getting Started” guides.

Before you start…

To get the most out of this guide, we recommend that you first take a look at the following guides:

The data capture context supports using different frame sources to perform recognition on. Most applications will use the built-in camera of the device, e.g. the world-facing camera of a device. The remainder of this guide will assume that you use the built-in camera.

Switching between World-Facing and User-Facing#

In your app you might want to switch between using the world-facing and user-facing camera for different use cases. As these are different cameras entirely switching between them is done by instantiating an entirely new camera and setting it as the data capture context’s new frame source.

Let’s start with the world facing camera. What we do is very similar to the camera section in the “Getting Started” guides, but here we want to specifically use the world-facing camera. Remember to use the recommended camera settings for whichever data capture mode you are using.

let cameraSettings = ...
if let worldFacingCamera = Camera(position: .worldFacing) {
  worldFacingCamera.apply(cameraSettings)

  // Set the camera as the frame source and turn it on.
  context.setFrameSource(worldFacingCamera)
  worldFacingCamera?.switch(toDesiredState: .on)
}

At this point we have a running world-facing camera that is used by the context. Whenever we want to switch to a user-facing camera, we simply turn off the world-facing camera and create a new user-facing camera that we set as the new frame source.

worldFacingCamera?.switch(toDesiredState: .off)

if let userFacingCamera = Camera(position: .userFacing) {
  userFacingCamera.apply(cameraSettings)

  // Set the camera as the frame source and turn it on.
  context.setFrameSource(userFacingCamera)
  userFacingCamera?.switch(toDesiredState: .on)
}

Using the Standby State#

The standby state is an addition in between the states SDCFrameSourceStateOff and SDCFrameSourceStateOn.

While in SDCFrameSourceStateStandby, the camera is running (note that on iOS 14 or greater a green indicator will appear in the status bar), but frames are not processed and no camera preview is shown just like during SDCFrameSourceStateOff. We recommend to use this mode when the user is likely scanning in quick succession and you want to avoid delays when starting the camera.

As the camera is running in the background during SDCFrameSourceStateStandby the battery usage will increase.

Because of this, it is important to be selective about the usage of the standby state and avoid keeping the camera in standby throughout the entire app. To minimize the additional battery usage it is better to go into standby only on certain screens where repeated scanning is expected. In rare cases where the entire app does repeated scanning, keeping the camera in standby throughout the entire app might be worth the additional battery usage.

App Flow with Standby State#

When using the standby state the typical app flow will be along the following lines:

For apps that are fully centered around scanning it might be a better option to stay in standby throughout at the cost of the slight battery usage increase:

Setting the Standby State#

Setting the standby state is very straight forward and works just like any other settable SDCFrameSourceState:

camera..switch(toDesiredState: .standby);

// Time passes until the scanner should become active
camera..switch(toDesiredState: .on);

// After scanning the camera can go to standby again
camera..switch(toDesiredState: .standby);