【iOS 18】ロック画面からカメラ機能へアクセスする
iOSにプリインストールされているカメラアプリは、ロック画面の状態であっても、コントロールをタップすることでカメラ機能へアクセスできます。iOS 18からはサードパーティ製のアプリでも、同様の機能を搭載できるようになりました。
これから、「Build a great Lock Screen camera capture experience」セッションで公開されている内容を、三つの記事に分けて解説します。
前回の記事とあわせてお読みいただくことで、実際にアプリで動作確認を行いながら、「Build a great Lock Screen camera capture experience」セッションで解説されている内容を段階的に把握していただくことができます。
本記事では、ロック画面からカメラ機能へアクセスする方法について解説します。
LockedCameraCapture
LockedCameraCaptureはiOS 18から使用可能なフレームワークです。LockedCameraCaptureフレームワークには、ロック画面からカメラ機能へアクセスするためのAPIが定義されています。
Locked Camera Capture Extensionの追加
Locked Camera Capture Extensionはロック画面からカメラ機能へアクセスする機能を作成するためのテンプレートファイルです。以下の手順に従って、Locked Camera Capture ExtensionをアプリのXcodeプロジェクトに追加します。
-
Locked Camera Capture Extensionを追加したいアプリのXcodeプロジェクトを開き、[File] > [New] > [Target]の順に選択します。
-
「Capture Extension」のテンプレート、[Next]を選択します。
-
Product Name項目にターゲット名を入力し、[Finish]を選択します。
-
手順3でProduct Name項目に入力した名称のフォルダがナビゲーター領域に表示されていれば、Locked Camera Capture Extensionの追加は完了です。
ファイル構成
Locked Camera Capture Extensionを追加すると、以下の2つのswiftファイルが自動的に追加されます。
各ファイルの概要
- LockedCapture.swift
Locked Camera Capture Extensionのエントリポイントを定義しています。 - LockedCaptureViewFinder.swift
コントロールがタップされた時に表示するカメラ画面が定義されています。Locked Camera Capture ExtensionをXcodeプロジェクトに追加すると、UIViewControllerRepresentable
プロトコルに準拠した、UIImagePickerController
のカメラ画面を表示するLockedCaptureViewFinder
が定義されています。
Info.plistファイルの編集
ホストアプリとLocked Camera Capture Extension両方のInfo.plist
に、Privacy - Camera Usage Description
を追加し、カメラを使用する理由を明記します。
CameraCaptureIntent プロトコル
コントロールをタップした時にカメラ機能へアクセスするために、CameraCaptureIntent
プロトコルに準拠したApp Intentを定義します。CameraCaptureIntent
プロトコルに準拠したApp Intentは、App Intent経由でカメラ機能へアクセスできます。
コントロールウィジェット経由でCameraCaptureIntent
プロトコルに準拠したApp Intentを実行することで、コントロールがタップされた時にカメラ機能へアクセスできるようになります。
コントロールがタップされると、CameraCaptureIntent
プロトコルに準拠したApp Intentのperform()
が実行されます。perform()
が完了すると、Locked Camera Capture Extension内の@main
属性が付与されているLockedCameraCaptureExtension
プロトコルに準拠したインスタンスが生成されます。
CameraCaptureIntent
プロトコルに準拠するためにAppContext
を定義します。AppContext
はLocked Camera Capture Extensionとホストアプリ間で、共有したい値を保存する時に使用します。例えば、ホストアプリ側で設定した値を、AppContext
経由でLocked Camera Capture Extension側で取得することができます。
また、CameraCaptureIntent
プロトコルに準拠したApp Intentのターゲットには、ホストアプリ、Locked Camera Capture Extension、(後ほど作成する)Widget Extensionの3つを指定します。
LockedCameraCaptureExtension プロトコル
LockedCameraCaptureExtension
プロトコルは、Locked Camera Capture Extensionを生成するためのプロトコルです。LockedCameraCaptureExtension
プロトコルに準拠した構造体は、LockedCameraCaptureUIScene
インスタンスを返すbody
プロパティを定義します。画面ロック状態から表示したいカメラ画面のViewを、LockedCameraCaptureUIScene
のイニシャライザの引数に指定します。この時、イニシャライザ経由でLockedCameraCaptureSession
インスタンスをViewに渡します。
LockedCameraCaptureSession
は、Locked Camera Capture Extensionとホストアプリ間で、やりとりを行うためのAPIが定義されているクラスです。LockedCameraCaptureSession
インスタンス経由で、Locked Camera Capture Extension側からホストアプリを呼び出したり、撮影したデータを格納するためのパスを取得することができます。
Widget Extensionの追加
Widget ExtensionをアプリのXcodeプロジェクトに追加し、コントロールウィジェットを作成します。コントロールウィジェットの作成方法は以下の記事でまとめていますので、必要に応じてご参照ください。
コントロールウィジェットの定義
コントロールがタップされた時に、CameraCaptureIntent
プロトコルに準拠したApp Intentを実行するコントロールウィジェットを定義します。
カメラへのアクセスリクエスト処理
ロック画面からカメラ機能へアクセスする前に、ユーザーからカメラへのアクセス許諾を得ておく必要があるため、ホストアプリ側でカメラへのアクセスをリクエストする処理を実行します。
実行結果
本記事では、ロック画面からカメラ機能へアクセスする方法について解説しました。次回の記事では、ロック画面から起動したカメラで撮影した写真を、フォトライブラリに保存する方法について解説します。
参考資料
・Build a great Lock Screen camera capture experience
Discussion