見出し画像

ロック画面からのカメラ起動における制約とデータ永続化の方法 - Locked Camera Capture Extension その2

WWDC24のセッション "Build a great Lock Screen camera capture experience" を見たメモ

ロックを解除する必要すらなく、アクションボタン、コントロールセンター、ロック画面からカメラ(サードパーティーアプリの撮影機能)を起動できる、という熱い新機能についてのセッション。

前回記事ではLocked Camera Capture Extensionとそのライフサイクルについて書いた:

本記事では、Locked Camera Capture Extension, LockedCameraCaptureフレームワーク利用時の注意点や、データ保存方法についてまとめる。

⚠️ 本記事の画像、引用部分は基本的に同セッションからの引用です。


ロックされたデバイスで実行する場合の注意点

プライバシー保護の観点から、LockedCameraCaptureフレームワークを用いてロック画面からキャプチャー体験を実行する場合、いくつかの制限がある。

デバイスがロックされているとき、連絡先、Eメール、写真、ビデオ、その他多くのものがロック画面の後ろに安全に保管されているため、デバイスのロックを解除しないとそれらにアクセスできないので安心です。

一覧:

起動後カメラのビューファインダーを表示する


拡張機能はアプリケーションと同じキャプチャ体験を提供する必要があり、起動後できるだけ早くカメラのビューファインダーを提供することが期待されます。

あなたの拡張機能が起動時にカメラビューファインダーを表示しない場合、あなたの拡張機能はシステムによって終了されます。

`AVCaptureEventInteraction` を使う

携帯電話のハードウェアボタンで写真やビデオをキャプチャすることは、可能な限り素早くポイント&シュートを体験してもらうのに最適な方法だと考えています。

ですからエクステンションは AVCaptureEventInteraction を使用して、システムのハードウェアボタンからのイベントを処理する必要があります。デバイスがロックされている間、あなたのエクスペリエンスにアクセスすることができます、

各種リソースへのアクセス制限

  • キャプチャエクステンションはネットワークリソースの使用を制限される

  • アプリケーションや他の拡張機能用の共有グループコンテナからの読み取りや書き込みができなくなり、アプリケーション用の共有環境設定にアクセスできなくなる

安心してください、拡張機能とアプリケーションの間で重要な状態を共有することはできます。その方法についてはもう少し後で説明します。

Extension container内のデータは消去される

Extensionのコンテナ内のデータは消去されるため、拡張機能の次回起動時に、拡張機能の前回起動時のコンテナ内容にアクセスすることはできません。
主にデバイスがロックされているときに実行する動作に焦点を当てましたが、拡張機能はデバイスのロック状態に関係なくロック画面から実行されます。ロックされている場合もロックされていない場合も、動作や制限は変わりません。

キャプチャーしたデータを永続化する方法

エクステンションからキャプチャした写真や動画のアセットを保存するには、PhotoKitを使用することが推奨されている。

  • PhotoKitを使用すると、デバイスがロックされている場合でも、キャプチャした写真やビデオを誰かのフォトライブラリに追加できる

  • PhotoKitは、デバイスがロックされているときにフォトライブラリ内のプライベートな写真やビデオを保護するように設計されている

    • ロックされたデバイスでフォトライブラリを読み込む場合、現在のキャプチャセッション中に書き込まれた写真とビデオのみが読み込まれる

    • デバイスのロックが解除され、拡張機能がフォトライブラリの適切なアクセス権を持っている場合は、現在のキャプチャセッション中にキャプチャされた写真だけでなく、誰かがアクセス権を与えたすべての写真やビデオを読むことができる

  • PhotoKitは、フォトライブラリへのアクセスレベルを細かく設定できる

    • 書き込み専用アクセスや限定ライブラリサポートなど、アクセスを許可する写真のセットを選択できるようになっている

  • Extensionは、親アプリから写真のアクセス許可を継承する

    • そのため、Extensionはフォトライブラリへのアクセスについて、どのレベルのパーミッションにも対応できるように準備する必要がある

    • Extensionで写真の追加パーミッションが必要な場合は、アプリケーションに移行してリクエストすることができる

      • この方法については、このビデオの後半で説明されている

PhotoKitがサポートしていないデータの保存

キャプチャ体験によっては、PhotoKitがサポートしていない他のデータを保存する必要があるかもしれない。

Locked Camera Capture Frameworkは、Extensionで撮影したキャプチャに必要なデータの保存もサポートしている。

以下そのしくみの解説:

これらのボックスは、左側がエクステンション、右側がアプリケーション用にキャプチャされた写真やビデオのファイルシステム保存を表している

起動時に、Extensionにはセッションオブジェクトを介してコンテンツパスが提供される。

この例では、人がコンテンツをキャプチャすると、Extensionは提供されたセッションコンテンツディレクトリにデータを書き込むことができる。PhotoKit を使用してキャプチャした写真やビデオを取り込み、フォトライブラリに直接追加することもできる。

Extensionのコンテナ内の他の場所に追加データを保存したくなるかもしれません。しかし、これはお勧めできない。いつでも誰かが(ユーザーが?)あなたのExtensionを削除することができる。

拡張機能が却下されると、提供されたセッションコンテンツディレクトリはアプリケーションのコンテナに移行されます、

拡張機能のコンテナは、セキュリティを確保し、デバイスの所有者のプライバシーを保護するために消去されます。拡張機能内から以前のセッションの内容にアクセスすることはできません。指定されたセッションを過ぎて保存したいデータは、指定されたセッションコンテンツディレクトリに保存してください。予期せぬ終了の場合でも、システムはこのディレクトリの内容をコピーしますので、データの復旧を試みることができます。

誰かがあなたの拡張機能を再び起動すると、拡張機能は新しいセッションオブジェクトを受け取り、新しいセッションコンテンツディレクトリにファイルを書き込みます。もう一度、拡張機能はセッションコンテンツディレクトリに書き込みます。

そして、誰かが拡張機能を解除すると、コンテンツは再び別のセッションコンテンツディレクトリとしてアプリケーションのコンテナに移動します。アプリケーションのランタイムがあれば、キャプチャされたコンテンツを取得し、アプリ内で他のキャプチャされたコンテンツと並べるように統合するなど、適切に処理することができます。アプリケーションが1つのセッション・ディレクトリのコンテンツを扱い終わったら、そのディレクトリを無効にするために呼び出すことができます。

そのディレクトリがファイルシステムから消去しても安全であることをシステムに知らせます。

繰り返しになりますが、誰かがいつでもあなたの拡張機能を解除することができ、そうなった場合、セッションコンテンツディレクトリのコンテンツだけがあなたのアプリケーションのコンテナにコピーされます。

ここから先は

0字
日々のキャッチアップに応じて、記事を追加していきます。記事が充実していくに従って価格変更していくので、早めの購入(買い切りです)がお得です。

WWDC 2024やiOS 18, visionOS 2についてセッションやサンプルを見つつ勉強したことを記事にしていくマガジンです。 …

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/