ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
ロック画面での優れたカメラキャプチャ体験の構築
LockedCameraCapture APIにより、キャプチャアプリの最も有用な情報をロック画面に直接取り込む方法について説明します。このAPIの機能を確認した後、キャプチャ拡張機能の作成を開始する方法をご紹介します。さらに、デバイスがロックされているとき、キャプチャ拡張機能がどのように動作するかについても解説します。
関連する章
- 0:00 - Introduction
- 1:39 - Great capture experiences
- 3:33 - Lifecycle of a capture extension
- 4:49 - Running on a locked device
- 10:48 - Capturing from the Lock Screen
- 18:31 - Working with captures in your app
リソース
- Creating a camera experience for the Lock Screen
- Creating controls to perform actions across the system
- Forum: Photos & Camera
- Human Interface Guidelines: Controls
関連ビデオ
WWDC24
-
ダウンロード
こんにちは iOS System Experience チームのエンジニア Adamです 今日は ロック画面での 素晴らしいカメラキャプチャ体験を 実現する方法をご紹介します iPhoneでは簡単に素晴らしい瞬間を キャプチャできるところが気に入っています ポケットからiPhoneを取り出すと ロック解除しなくても アクションボタンやコントロールセンター またはロック画面から カメラを起動できます あっという間に こんな素晴らしい写真が撮れます この写真は 今日Apple Parkで撮影したものです iOS 18の新機能によって iPhoneでもiPadでもロック画面から すぐにカメラを 利用できるようになりました このタイプのキャプチャ経験は iOS 18で導入される 新たなフレームワークによって 可能になります それがLockedCameraCapture フレームワークです LockedCameraCapture フレームワークには ロック画面から起動して 素晴らしいカメラキャプチャ体験を 実現するための 構成要素が含まれています LockedCameraCaptureの 主要要素の1つであり このキャプチャ体験を実現する要素は 新しい拡張機能タイプのLocked Camera Capture Extensionです
このセッションでは 素晴らしい カメラキャプチャ体験の要件を説明します 次に キャプチャ拡張機能の ライフサイクルを見ていきます さらに ロックされたデバイスでの 動作に関する 重要な考慮事項について説明します その後 ロック画面から素晴らしい写真や ビデオをキャプチャする方法について 詳しくご紹介します 最後に ロック画面から キャプチャしたコンテンツを アプリに取り入れる方法を 見ていきましょう
では素晴らしいカメラキャプチャ体験の 要件から始めましょう iOSのカメラアプリは iPhoneやiPadで 素晴らしいカメラキャプチャ体験を 実現します カメラにはロック画面から すばやく簡単にアクセスできます デバイスがロックされている場合でも カメラコントロールを押せば利用できます コントロールを押すとビューファインダーが 表示され 写真を撮影できます
音量を上げるボタンを押して キャプチャすることもできますし 長押しすれば ビデオの収録も開始できます
撮影した写真やビデオは イメージウェルをタップすると表示できます デバイスはロックされたままで プライバシーは保護されています カメラを表示していた時に キャプチャした写真とビデオが 表示されるだけです コンテンツについて さらに作業したい場合は デバイスのロックを解除する リクエストが表示されます 解除すると 作業を継続できます みなさんのアプリでこの操作を できるようにするには 新しいタイプのApp Extensionを 作成します Locked Camera Capture Extensionです App Extensionはアプリに埋め込まれる 独立したターゲットで カスタム機能やコンテンツを アプリの外部にまで拡張します したがって ユーザーが 他のアプリやシステムを操作するときにも 利用できるようになります この新しいタイプのApp Extensionは ロック画面から実行されます そのため すばやく簡単にアクセスできる キャプチャ体験を実現できます デバイスがロックされている場合でも アプリでいつもの使い慣れたUIを使用して 写真やビデオを撮影できます
この新しい拡張機能の ライフサイクルを見てみましょう ライフサイクルの最初のステップは 拡張機能の起動です この拡張機能はコントロールセンターの コントロールから起動できます アクションボタンに割り当てられた コントロールからでも またはロック画面のコントロールからでも 起動できます
拡張機能が起動すると ユーザーは写真やビデオのコンテンツを キャプチャできるようになります その際には アプリから 使い慣れたUIを使用できます キャプチャ拡張機能では 写真やビデオアセットを 個人のフォトライブラリに 直接追加できるほか キャプチャを表現するために必要な あらゆるデータを ファイルシステム上の 所定のディレクトリに 保存することもできます いくつかのコンテンツをキャプチャしたあと さらに追加作業をしたい場合が あるかもしれません ソーシャルネットワークでシェアしたり 画像アセットの必要なフィルタを適用して 見栄えをよくしたりする場合です その種の操作では 拡張機能から 親アプリを開くようリクエストして デバイスを使用するユーザーを 認証することができます それによって拡張機能からアプリに シームレスに移行することが 可能になり 拡張機能が中断された場所から 操作を開始できます 最後に アプリに移行するか あるいは画面を上にスワイプして ロック画面に戻ると キャプチャ拡張機能が解除されます その場合は キャプチャされたコンテンツが 親アプリからアクセスできる 位置まで移動します アプリにランタイムがある場合は 拡張機能でキャプチャされたコンテンツを 別のコンテンツに 組み込むことができます このプロセスについては このセッションの後半で詳しく説明します ここまで キャプチャ拡張機能の ライフサイクルについて説明しましたので ロックされたデバイスでの動作について 重要な考慮事項を確認しましょう 世界中の人々はいつでも 高度なプライバシーを iOSに期待しています デバイスがロックされている時は 連絡先 Eメール 写真 ビデオなどが ロック画面の裏側で 保護されていると安心できます 自分がロックを解除しないかぎり 情報にはアクセスできません Appleが開発した LockedCameraCaptureフレームワークは 意図的にセキュリティと プライバシーを重視し デバイスのコンテンツを保護することを 常に意識して開発されました この新しいタイプのApp Extensionは ロック画面から実行されるので 写真やビデオのキャプチャ中は ユーザーのデバイスが ロックされる可能性があります デバイスのプライバシーと セキュリティを守るため この新しい体験には いくつかの制限が設けられています 拡張機能ではアプリと同じキャプチャ体験を 実現する必要があります また 起動したらすぐに ファインダーが 表示されることが求められます 起動してもカメラのファインダーが 表示されない場合は 拡張機能は システムによって終了されます iPhoneのハードウェアボタンで 写真やビデオをキャプチャすることは ユーザーが対象を迅速に捉えて 撮影できる素晴らしい方法です したがって拡張機能は AVCaptureEventInteractionを 使用して iPhoneのハードウェアボタンによる イベントを処理する必要があります ユーザーが体験にアクセスできるのは デバイスがロックされている時なので キャプチャ拡張機能は ネットワークリソースの使用を制限されます アプリや他の拡張機能の 共有グループコンテナから 読み書きすることはできません アプリの共有設定にも アクセスできません
拡張機能とアプリの間の 重要な状態は共有できますので 安心してください 後で仕組みを説明します まずは キャプチャデータを 拡張機能でどのように保存するか 見てみましょう 拡張機能からキャプチャした 写真やビデオアセットの保存には PhotoKitの使用をお勧めします 拡張機能ではPhotoKitを使用して キャプチャした写真やビデオをユーザーの フォトライブラリに追加できます デバイスがロックされていても可能です PhotoKitは デバイスがロックされている時に フォトライブラリのプライベートな写真を 保護するように設計されています ロックされたデバイスの フォトライブラリを読み込む時は 現在のキャプチャセッション中に 書き込まれた写真とビデオのみ 読み込むことができます デバイスがロック解除されていて 拡張機能が フォトライブラリに対して 適切な権限を持っている場合 アクセス権を与えられている すべての写真やビデオを 読み込めるようになります 現在のキャプチャセッションで キャプチャされたものだけではありません PhotoKitは フォトライブラリを様々なレベルで サポートしています 書き込み専用アクセスや 限定的なライブラリサポートなどです ユーザーはアクセスを許可する 一連の写真を選択できます 拡張機能はアプリから 写真の権限を継承しますので フォトライブラリに対する あらゆるレベルのアクセス権を 処理できなければなりません 拡張機能が 写真に対して 追加の権限を必要とする場合は アプリに切り替えて リクエストすることができます その方法については後半で説明します PhotoKitの操作について詳しくは 以前のWWDCのビデオをご覧ください キャプチャ体験によっては PhotoKitで サポートされない他のデータの 保存が必要になる場合があります LockedCameraCapture フレームワークはさらに 拡張機能でのキャプチャに必要な あらゆるデータの保存をサポートします その仕組みを見てみましょう これらのボックスは写真の ファイルシステムストレージを表します 拡張機能でキャプチャされたビデオは左側で アプリが右側です 起動するとセッションオブジェクトを介して 拡張機能にコンテンツパスが提供されます この例では ユーザーがコンテンツを キャプチャする際に 拡張機能は提供されたセッションコンテンツ ディレクトリにデータを書き込むことができます キャプチャされた写真やビデオを PhotoKitを使用して取り込むこともできます それらはフォトライブラリに 直接追加されます
追加のデータを 拡張機能コンテナとは別の場所に 保存したい場合もあるかもしれません しかし それはお勧めできません いつでも誰かが拡張機能を 解除する可能性があります 拡張機能が解除されると 所定のセッションコンテンツディレクトリが アプリのコンテナに移行され 拡張機能のコンテナが消去されます これはセキュリティ確保と デバイス所有者の プライバシー保護のためです 拡張機能の中からは 過去のどのセッションの コンテンツにもアクセスできなくなります 所定のセッションコンテンツディレクトリの 任意のセッションを過ぎても 保存したいデータは残ったままです 予期せず終了した場合でも システムは このディレクトリのコンテンツをコピーして データの復旧を試みることができます 拡張機能をもう一度起動すると ファイルの書き込み先となる ディレクトリを含む新しい セッションオブジェクトが受信されます ここでも 拡張機能によってこのコンテンツ ディレクトリセッションに書き込みが行われ ユーザーが拡張機能を解除すると コンテンツは再び 別のコンテンツディレクトリとしての アプリのコンテナに移動します アプリにランタイムがある場合は キャプチャしたコンテンツを取得して 適切に処理できます 例えばアプリ内で キャプチャされた 他のコンテンツに組み込むことができます アプリは1つのセッションディレクトリの コンテンツの処理が完了すると 呼び出しを行って そのディレクトリを無効化し そのディレクトリをファイルシステムから 安全に削除できることを システムに通知することができます 繰り返しになりますがユーザーはいつでも 拡張機能を解除でき その際にセッションコンテンツディレクトリ内 のコンテンツのみが アプリのコンテナにコピーされます 前回起動した拡張機能の コンテナ内のコンテンツに 次回の起動でアクセスすることはできません 拡張機能コンテナ内のデータは 消去されるためです ここまで主にデバイスがロックされている時の 動作について焦点を当ててきましたが 拡張機能は デバイスのロック状態に関係なく ロック画面から実行されます ロックされていても 解除されていても 動作と制約に 変わりはありません ロックされたデバイス上で実行する際の 注意点について説明しましたので 次は ロック画面からすぐに コンテンツをキャプチャする体験の 構築について説明します 最近 同僚のJonと私は ClownTownというアプリの アップデートに取り組んでいます 道化師が自分のプロフィールを 追加できるようにして 近くの他の道化師と つながれるようにしたいのです プロフィール用に写真を撮ることが できれば 非常に便利だと思います このClownTownアプリのアップデートは キャプチャ拡張機能や その他のキャプチャ機能を実装していく中で 例として使用するつもりです 始めやすいように Xcodeには Locked Camera Capture Extensionの 便利なテンプレートが 用意されています このテンプレートにはすぐに開始するために 必要なものがすべて含まれています カメラのファインダーや シャッターボタンなどです この例では拡張機能を定義します これは LockedCameraCaptureExtensionに 準拠しています この構造体の中で 拡張機能シーンがボディ用に実装され そのシーンは カスタムビューコンテンツを返します この拡張機能のUIの重点は ユーザーにファインダーに向けさせて 写真やビデオをキャプチャさせることです 拡張機能では一貫したキャプチャ体験を ユーザーがアプリで体験するのと同じ 使い慣れたUI要素を使って 提供する必要があります 拡張機能はカメラと写真へのアクセス権限を アプリから継承します 拡張機能は あらゆるレベルのカメラと写真の権限に 対応する準備が必要です 権限がないために アプリがカメラ機能を使えない場合は システムがユーザーのデバイスの ロック解除をリクエストします 認証に成功したら 拡張機能の代わりに アプリを起動して対処します LockedCameraCaptureUISceneの イニシャライザは パラメータを1つと LockedCameraCaptureSessionの インスタンスを提供します このセッションオブジェクトが 提供するものを見てみましょう
このセッションオブジェクトには 複数の重要な目的があります キャプチャセッションは sessionContentURLを提供します これは拡張機能のコンテナの ディレクトリへのパスです これを使用してユーザーのキャプチャした 写真とビデオのすべてのデータを 保存することができます その他の保存したい関連データも同様です またはキャプチャした写真やビデオを キャプチャ拡張機能から直接PhotoKitに 保存することもできます コンテンツはデバイスがロックされていても フォトライブラリに書き込むことができます しかしデバイスがロックされている場合は 現在のキャプチャセッション中に 書き込まれた写真とビデオのみ 読み込むことができます ロック解除されたら 読み取り権限のある写真を すべて読み込むことができます 現在のキャプチャセッション外の 写真も読み込めます ディレクトリsessionContentURLに 書き込んだデータの 使用が終わった場合 たとえば PhotoKitにコンテンツを 保存した場合は invalidateSessionContentを呼び出して そのディレクトリのコンテンツを消去できます この関数を呼び出したあとは 引き続きディレクトリに書き込めますが invalidateを呼び出す前に書き込まれた コンテンツはすべて消去されます セッションにはアプリを開くことを リクエストする関数もあります この関数は ユーザーのUI操作に対応する場合にのみ 呼び出します 例えば ユーザーが共有シートで写真を 共有するためにボタンをタップした時などです コンテンツの共有には ネットワークアクセスが必要であり それはキャプチャ拡張機能では 実現できませんので openApplicationを呼び出すことになります それによってデバイスをロック解除する プロンプトが表示され ロックが解除されたらアプリが開きます この関数の使用方法については このセッションの後半で 詳しく見ていきましょう 先ほど拡張機能のライフサイクルを 説明した際にお話ししたように 拡張機能は コントロールセンターのコントロール アクションボタンのコントロールまたは ロック画面のコントロールから起動します ユーザーがキャプチャ体験を 起動できるようにするには カスタムコントロールを 作成する必要があります このコントロールは別の拡張機能の 一部になります それはWidgetKitで作成できる ウィジェット拡張機能です このコントロールで キャプチャ機能を起動するには iOS 18で導入される新しいタイプの システムインテントである CameraCaptureIntentを 実装する必要があります システムはデバイスがロック画面か ホーム画面かという条件に応じて CameraCaptureIntentを使用して キャプチャ拡張機能を起動するか アプリを起動するかを決定します このインテントでアプリまたは 拡張機能が起動されたら それを受けて 起動後すぐにユーザーを キャプチャ機能に誘導することができます このインテントで拡張機能やアプリを 起動できるようにするには CameraCaptureIntentを 3つの ターゲットすべてに含める必要があります インテントをコントロールで使用可能にする ウィジェット拡張機能 拡張機能 そしてアプリの3つです
カメラキャプチャインテントは アプリのコンテキストを定義します このコンテキストは アプリと拡張機能で共有され 互いに書き込むことができます ユーザーの環境設定を保存する時は このコンテキストを使用する必要があります 拡張機能のキャプチャ体験と アプリのキャプチャ体験との間で共有する 設定を保存する時も 同様にこのコンテキストを使用します 例えば アプリ内でユーザーが行った 課金を示すデータを保存した場合 それらはキャプチャ拡張機能でも 使用できます アプリコンテキストを更新するには updateAppContext関数を 呼び出します その際は 保存したい アプリコンテキストを渡します アプリコンテキストのサイズに 制限があることには十分注意してください コンテキストが大きすぎると 保存されなくなり キャプチャ体験に影響する可能性があります アプリコンテキストに書き込む量に 注意してください ここでは CameraCaptureIntentを このように実装しています アプリコンテキストClownTownContextに 独自の型を定義しています こちらがそのコンテキストです 道化師は常に素晴らしいポートレートを キャプチャできるとは限りません 常にメイクができているとは 限らないからです そこで誰にでも道化師のメイクを 自動で施すボタンを用意しています そのためいつでも完璧な道化師の プロフィール写真を撮れます ここでは その設定を表す 単一のboolを定義しています 道化師のメイクと鼻を 追加するかどうかを決められます インテントにperform関数を実装しました これがそうです ここではコンテキストを読み込み それを使用してインターフェイスの 状態を設定しているため キャプチャ体験には常に 最新の状態が反映され ユーザーが道化師のメイクを施して アプリを使用したかどうかが確認されます これは私のキャプチャ体験の ボタンコードのコードスニペットです ボタンを押して道化師の メーク設定をオン/オフした時の 処理方法を示しています アクションがトリガされたら 呼び出しを行ってアプリコンテキストを この設定で更新すると アプリと拡張機能の 両方から読み込めるようになります 最後にClownTownの コントロールウィジェットを紹介します これはウィジェット拡張機能に 組み込まれます このように ClownTownCaptureIntentの インスタンスを 実行するアクションとして コントロールに渡しています
まとめると ウィジェット拡張機能を アプリに追加して コントロールを定義します さらに カメラキャプチャインテントも実装して コントロールに提供し 同時にアプリと拡張機能の ターゲットに含めます コントロールを作成して キャプチャ体験を 起動する方法の詳細については 同僚のCliffのセッション 「Creating your own Controls」 を参照してください App Intentの操作について詳しくは 「Bring your app’s core features to users with AppIntents」の セッションをご覧ください キャプチャ体験に関する要件として 最後に挙げられるのは 拡張機能とアプリの両方に カメラのプライバシーの扱いの説明を 含める必要があることです これは写真やビデオをキャプチャするために カメラを使用する意図があることを システムへ示すものであり これでシステムはその説明を表示して キャプチャ体験にカメラを使う理由を 説明することができます キャプチャ体験を起動する コントロールが作成できたので アプリでキャプチャされたコンテンツを 扱う方法について見てみましょう ロック画面でキャプチャ体験を 実行中に ユーザーがキャプチャ拡張機能で利用可能な 権限を超えたアクションを 実行したいとします 例えばキャプチャした写真を SNSに投稿する場合などです これにはネットワークアクセスが必要です また アプリの共有グループコンテナからの リソースを必要とする機能を 使用したい場合もあるかもしれません この種のインタラクションに対処するために 拡張機能は LockedCameraCaptureSessionの openApplication関数を呼び出せます これについては先ほど簡単に説明しました この関数はNSUserActivityの パラメータを1つ受け取ります LockedCameraCaptureは 便利な機能として 新しいNSUserActivity型を公開します 新しいNSUserActivity型 NSUserActivityType LockedCameraCaptureです この新しいユーザーアクティビティ型は openApplication関数とあわせて使います シグナルとしてアプリに キャプチャ拡張機能から 起動したことを示します openApplication関数の呼び出しは 必要に応じてデバイスをロック解除するよう ユーザーに促します そしてNSUserActivityの継続を 処理する呼び出しを受け取る アプリを開きます これでアプリのユーザーは UIの中断した場所に シームレスに戻ることができます
ClownTownの キャプチャ拡張機能では ユーザーがプロフィール写真を更新する時に アプリが開くようにするつもりです これはネットワークを使用して サーバに送信されます ここでユーザーが 適切なボタンをタップすると LockedCameraCapture用の 新しい型を使用して NSUserActivityで アプリを開くように呼び出し userInfoにコンテキストを渡して アプリが「update profile photo」フローを 継続するように指示します ユーザーアクティビティ型と userInfoを使うことで 拡張機能からシームレスに遷移する 十分なコンテキストが与えられます アプリ内から LockedCameraCaptureManagerを 使用して キャプチャ拡張機能から キャプチャされたコンテンツを 操作することができます LockedCameraCaptureManagerは 共有インスタンスを公開し 必要に応じて アプリ全体で使用できるようにします マネージャはsessionContentURLs プロパティを公開します それによってURLの配列が提供され それぞれがキャプチャ拡張機能で キャプチャされたコンテンツの ディレクトリを指します また sessionContentUpdatesの AsyncSequenceも公開します このシーケンスは現在の セッションコンテンツディレクトリを示す URLから始まり 追加または削除されたセッション コンテンツディレクトリに続きます これは拡張機能で キャプチャされたコンテンツを 非同期に処理するために使用できます 拡張機能からアプリに移行する時に 最後にキャプチャされた セッションコンテンツディレクトリが アプリ起動後すぐに 利用できるようになることがあります この非同期シーケンスを使用して セッションコンテンツが 利用可能になるとただちに 確実に処理できるようにすることを おすすめします 最後に マネージャは 無効化関数を公開しています この関数は特定のURLの セッションコンテンツが処理されたあとで そのコンテンツが もう必要ない場合に 呼び出されるものです この関数を呼び出すと 指定されたURLから セッションコンテンツが削除されます したがって この関数は セッションコンテンツの処理が完全に 終了した場合のみ呼び出してください 特定のURLのセッションコンテンツを 無効化すると そのセッションコンテンツディレクトリの 削除によって コンテンツセッションも更新されることに 注意してください ClownTownアプリでは sessionContentUpdatesプロパティを 使用して 最初の既存のキャプチャされた コンテンツの処理 新しいセッションコンテンツの待機 そして受け取ったコンテンツの アプリでの処理を実行できます
LockedCameraCaptureは 素晴らしいカメラキャプチャ体験を 実現するために必要な要素を すべて提供し ユーザーのロック画面から 簡単にアクセスできるようにします アプリに移行して追加のアクセスが必要な 主要なワークフローを完了できます 同時にロック画面から写真やビデオを キャプチャするときに期待される プライバシーとセキュリティも保護できます
皆さんが生み出す新しいアイデアを 楽しみにしています ご視聴ありがとうございました
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。