🔐

【iOS 18】ロック画面から起動したカメラで撮影した写真を表示する

2024/07/08に公開

前回の記事では、ロック画面の状態から起動したカメラで撮影した写真を、フォトライブラリに保存する方法について解説しました。
https://zenn.dev/naoya_maeda/articles/251490c8101edd

前回の記事に引き続き「Build a great Lock Screen camera capture experience」セッションで公開されている内容を解説します。
https://developer.apple.com/jp/videos/play/wwdc2024/10204/
本記事では、ロック画面の状態から起動したカメラで撮影した写真を、ホストアプリ側で表示する方法について解説します。

前回の記事とあわせてお読みいただくことで、実際にアプリで動作確認を行いながら、「Build a great Lock Screen camera capture experience」セッションで解説されている内容を段階的に把握していただくことができます。

まず、Locked Camera Capture Extension側で使用できるAPIを解説します。

LockedCameraCaptureSession


LockedCameraCaptureSession は、Locked Camera Capture Extensionのセッションを管理するクラスです。ホストアプリを起動したり、撮影データ保存用のパスを提供します。

sessionContentURL

sessionContentURL は、Locked Camera Capture Extensionとホストアプリ間で共有したいデータを保存するディレクトリパスを提供するAPIです。カメラで撮影したデータを、sessionContentURL で取得したディレクトリパスに保存することで、ホストアプリ側からLocked Camera Capture Extensionで撮影したデータにアクセスすることができます。

invalidateSessionContent()

invalidateSessionContent() は、sessionContentURL で取得したディレクトリパスに保存したデータを削除するAPIです。invalidateSessionContent() で保存したデータを削除した後も、引き続き撮影データをsessionContentURLで取得したディレクトリパスに保存することができます。

openApplication(for:)


openApplication(for:) は、Locked Camera Capture Extensionからホストアプリを起動することができるAPIです。撮影が完了した後にホストアプリへ遷移する時に使用します。openApplication(for:) 実行後に状況によってはパスコードの解除が求められ、パスコード解除後にホストアプリを起動することができます。
openApplication(for:) の引数には、NSUserActivity オブジェクトを指定します。イニシャライザのactivityType 引数にNSUserActivityTypeLockedCameraCapture を指定することで、ホストアプリ側でLocked Camera Capture Extensionから起動されたことを判定することができます。

次に、ホストアプリ側で使用できるAPIを解説します。

LockedCameraCaptureManager


LockedCameraCaptureManager は、Locked Camera Capture Extensionで撮影したデータを操作するためのAPIです。shared でアプリ全体からLockedCameraCaptureManager インスタンスにアクセスすることができます。

sessionContentURLs

sessionContentURLs は、Locked Camera Capture Extensionで撮影したデータを保存しているディレクトリパス群を提供するAPIです。sessionContentURLs で取得したディレクトリパス群から撮影データを取得することができます。

sessionContentUpdates

sessionContentUpdates は、Locked Camera Capture Extensionで撮影したデータを非同期的に処理するためのAPIです。例えば、Locked Camera Capture Extensionで撮影したデータの保存が完了する前にホストアプリを起動した時、撮影したデータが保存されているディレクトリパスを、非同期的にホストアプリ側で取得することができます。

invalidateSessionContent(at:)

invalidateSessionContent(at:) は、引数に指定したディレクトリパスを削除するためのAPIです。Locked Camera Capture Extensionで撮影したデータが不要になった時、引数に指定したディレクトリパスが削除可能であることをシステムに通知します。

前回の記事で作成したXcodeプロジェクトを使用して動作確認を行いたい時は、以下の手順に従ってソースコードを修正することですぐに動作確認を行うことができます。

前回の記事で作成したXcodeプロジェクトを使用して動作確認を行う方法
  1. VideoCapture.swift
    PhotoKitで行なっていた写真の保存処理を、sessionContentURL で取得したパスへの保存に修正します。撮影した写真をホストアプリ側で識別するため、保存する写真のファイル名をユニークにする必要があります。サンプルソースは撮影回数をInt 型のcounter 変数で管理し、撮影回数を保存する写真のファイル名に使用することで、ユニークなファイル名を実現しています。
  1. LockedCaptureView.swift
    Locked Camera Capture Extensionから、ホストアプリを起動するためのボタンを追加します。
  1. ContentView.swift
    Locked Camera Capture Extensionで撮影した写真データを、ホストアプリ側で取得できるようにします。

実行結果

Locked Camera Capture Extensionで撮影した写真を、LockedCameraCaptureSessionsessionContentURL に保存した後、openApplication(for:) でホストアプリを起動しています。ホストアプリを起動した後は、LockedCameraCaptureManager.shared.sessionContentURLs で撮影したデータが保存されているディレクトリパスを取得し、Data オブジェクトからUIImageオブジェクトを生成しています。

三つの記事に分けて、「Build a great Lock Screen camera capture experience」セッションで公開されている内容を解説しました。今回はLocked Camera Capture Extensionで撮影した写真をホストアプリ側で表示しましたが、ビデオやLive Photosといった写真以外のデータを撮影することもできます。本シリーズの記事をお読みいただいた後に、Appleが公開している「Build a great Lock Screen camera capture experience」セッションを見て、さらにLocked Camera Capture Extensionに対する理解を深めてみてください。

参考資料

・Build a great Lock Screen camera capture experience
https://developer.apple.com/jp/videos/play/wwdc2024/10204/

Discussion