ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
App内の写真アクセスの改善
PHPickerは、PhotosライブラリをAppに統合するための最もシンプルで安全な方法ですが、さらに進化しています。Appで画像を順番に選択する方法や、ピッカが表示されているときにアセットを事前に選択する方法を紹介します。また、PhotoKitを使ってさらに深いレベルでのインテグレーションが必要となるAppのために、PHCloudIdentifierを使用して写真プロジェクトのコンテンツをデバイス間で同期する方法を解説します。この方法によって、iPhone、iPad、Mac間での画像作業の移行が容易になります。 また、Limited Photos Libraryの最新アップデート情報についても解説します。選択UIを任意のタイミングで表示する、誰かの新たな選択や更新を認識するなど、最初に認証した画像セットを簡単に拡張できるようにする方法を紹介します。最後に、フォトアルバムを作成したり、既存のフォトアルバムにアクセスする方法を確認します。
リソース
関連ビデオ
WWDC22
WWDC21
WWDC20
-
ダウンロード
♪ ♪ こんにちは 写真チームのジャスティンです 今日は同僚のアダムと Appでの写真Appへの アクセスの改善について 共有します まずは写真ピッカーの アップデートを紹介し 次にアダムが 最新のクラウド 識別子APIを紹介します これを使い 異なるデバイスから 同一のアセットを 識別できます 最後にライブラリの 限定アクセスモードの 変更についてお話しします
写真ピッカーとは何でしょう UIImagePickerControllerの 後継 PHPickerがiOS14で登場し プライバシーを守りながら 複数画像の選択や 検索ができる機能を Appに提供していますが
PHPickerが初めてという方は WWDC2020の 「新しいPhotosPickerの紹介」で 詳しく説明しています
iOS15では 写真ピッカーに 4つの大きな 改良点が施されています まずは プライバシーです Appがどの情報にアクセス するのかをユーザーに 伝えることは ユーザーから 信頼を得る上で重要です しかしiOS14の下では Appがプロセス外の 写真ピッカーのみを表示して 選択した写真のみにアクセス しているにも関わらず ライブラリ全体にアクセス している印象を与えていました この違いをユーザーに 理解してもらえよう 設定 > プライバシーの 「写真」にセクションを新設し システムの写真ピッカーのみを 使用するAppのリストを表示し また これらのAppは ユーザーが選択した 写真のみアクセスできる ことを明記しました まだカスタムの写真ピッカー を使用している場合は システムの写真ピッカーに 変更することを推奨します 次は写真の選択の 順番についてです 写真を選択するとき 順番が大事な場合も ありますね iOS 15では Appで選択した 写真の順番を このように表示するよう ピッカーを設定できます
デフォルトではチェックマーク を表示しますが 複数選択をオンにし 「selection」を「ordered.」に 設定すれば 順序付き選択を 提供できます
PHPicker APIは ゼロから写真を 選択する場合 効果的ですが 選択済みの写真を 除きたい場合はどうでしょう? iOS 15ではプリセレクト用 APIが搭載されています
が その話の前に 既存のPHPickerの APIの仕組みを 確認しましょう PHPickerConfiguration オブジェクトを作り ピッカーを初期化します
ピッカーのセッション完了後 Appに選択された写真が 返されます PHPhotoLibraryオブジェクトで 設定を初期化した場合 ピッカーの結果は アイテムプロバイダと アセット識別子の両方を 含みますが Appは このアイテムプロバイダで 選択した写真を 読み込み 表示します
iOS 15ではApp側から 以前選択された 写真をピッカーに 提示することができ そこからさらに 写真を加えたり Appで事前に選択された 写真を除外することができます
そのためには新しい 設定オブジェクトを作り 図のID:1やID:2のように 以前読み込んだ アセット識別子の配列を 設定に入れます
新しい PHPickerViewControllerが 提示されると ID:1とID:2の写真が デフォルトで選択されます 写真を選択から外したり 新規追加することができます
でも ピッカーの以前の結果は 保存しておきます 後で それを使う必要があるからです
ID: 2の写真が 外されたとしましょう さらに ID: 3の写真が 加えられました
ピッカーの セッション完了後は 選択した写真が 返されますが 最初の結果は 実のアセットデータでなく アセット識別子のみ となります その理由は その写真は Appが 選択したものだからです ユーザーが選択した ものでない限り アイテムプロバイダが 空となります
以前の結果は 実際の アセットデータを含むため アイテムプロバイダが 空の結果を 前回のID:1の結果に 置き換えます ID:2は選択が 解除されたので 前回のID: 2の結果は 破棄します
こうすると 以前のように 写真の選択 処理を続けられます まとめると ピッカーの セッション完了後 外されていない プリセレクトのアセットを含む 全ての選択済みアセットが 返されます プリセレクトの アセットの場合 アイテムプロバイダは 空で返されます
ピッカーセッションが キャンセルされた場合 プリセレクトのアセットのみ 返されます アイテムプロバイダは 全て空になります
では コードを見ていきましょう プリセレクトのアセットを 設定するには photoLibraryオブジェクトで 設定を初期化し 複数選択をオンにします preselectedAssetIdentifiers APIで プリセットのアセットを 設定できます
デリゲートのコールバックで 前回のセッションの existingSelection を取得します その後 新しい結果に対しても 同じ処置を繰り返します すでに選択されている写真は 新しい結果を 古い結果に置き換えます 最後に この更新した 選択を保存します
最後に 進捗レポートについてです iCloudやストレージの最適化が オンの場合など デバイスのローカルにない サイズの大きいアセットは ダウンロードが 遅くなることがあります その場合 以前は進捗インジケータ のみの表示でした しかしこれは 理想的な ユーザー体験ではありません 嬉しいことに iOS15ではピッカーから 実際の進捗状況を 受け取ることができます
既存のAPIである NSItemProviderより 読み取り可能で 受け取った情報を基に 進捗ステータスのUIを 表示できます 写真ピッカーについては 以上です 次に 同僚のアダムが 新しいcloudIdentifier APIを 紹介します
どうも 新機能や 新搭載のAPIもあり 多くのデベロッパにとって 写真ピッカーは Appで写真を扱う上で 最適だと言えます でもAppのカテゴリによっては より広いアクセスや統合を 必要とするものもあります 写真の管理や編集 カスタムカメラ またはフォトライブラリで 独自の閲覧方法を 提供するAppなどでは
フォトライブラリに保存された 写真や動画 アルバムにアクセスし 更新するための 豊富なAPIを PhotoKitが提供します
アセットやアルバムは PhotoKitにより 固有の識別子を与えられ 後で フォトライブラリから 同一レコードを取得する ために使われます
フォトライブラリや その識別子は 使用する各デバイスに 固有のものです これは デバイスが ライブラリをiCloudに 同期している場合にも 該当します では Appの事例で 考えましょう 外出中はiPhoneで Appを利用し 家や仕事場では大きな画面の パソコンやiPadで利用 といった使い分けが ポピュラーですが ユーザーはデバイスの 切り替え時に スムーズでシームレスな 体験を求めています 写真やコメントで 出来事をつづる フォトジャーナルの Appを開発するとします 出来事を瞬時に捉える上で iPhone Appとしては最適です でもiPadやMacでも スマホで撮った写真などの コンテンツを編集して ジャーナル作成を 続けたいですね でも デバイスごとに固有の フォトライブラリと 異なる識別子で 同一アセットを 見つけられるのでしょうか? クラウド識別子のAPIを使えば デバイスに関わらず 同じアセットや アルバムを識別できます クラウド識別子を使い 各フォトライブラリ固有の ローカル識別子を検索します この新APIはiOS iPadOS MacOS tvOSと PhotoKit搭載のOSに すべて対応し
クラウドのことを心配せずに デバイス間の アセットのマッピングが 簡単にできます iCloud 写真にサインインした アカウントからが最適ですが クラウド識別子は サインアウト中や iCloudに一度も サインインしていない システムでも機能するよう 設計されています これは 識別子マッピング に基づくものですが 識別子には2種類あります 先述のローカル識別子は デバイス固有の ライブラリを対象とします PhotoKit経験のある方は localIdentifiersとして ご存知でしょう クラウド識別子は 新しいAPIで デバイスごとのローカル 識別子を検索します PHCloudIdentifierという 新設のクラスの下にあります 使い方を詳しく 確認していきましょう まず Appがソースデバイスで アセットのローカル識別子を まとめています この識別子配列に対応する クラウド識別子を割り当てます APIを使ったクラウド識別子の 入手例です フォトライブラリへの呼び出しが 各localIdentifierに対する cloudIdentifierMapping オブジェクトの辞書を返します この辞書の イテレーションにより cloudMappingオブジェクトから cloudIdentifierを入手します エラー対応は 後ほど説明します クラウド識別子があるので 利用してみましょう クラウド識別子の最大の利点は どこでも使えるという点なので 他のクラウド接続の デバイスと 共有する必要があります
あなたのAppでも 同じiCloudアカウントに 紐づけられる 全てのデバイスで使える ようにしましょう クラウド識別子を文字列 としてアーカイブし CloudKitや その他の ネットワークサービスで データを共有できます データをどうパッケージ にまとめるかは あなたのAppの ニーズによります データを二つ目のデバイスで どう使うか考えます では クラウド識別子が 参照コンテンツを含むよう Appのステータスを 再構築する方法について
二つ目のデバイスで クラウド識別子をダウンロードし 復元したら それらを元に ライブラリ固有の ローカル識別子を検索します
今度は逆方向で フォトライブラリへのコールが cloudIdentifierごとの localIdentifierMapping オブジェクトの辞書を返します
また辞書のイテレーションを行い ますが 今回は localMappingオブジェクトから localIdentifierを入手します 全てのlocalIdentifierを 入手したら ソースデバイス上の アセットを取得し表示します このAPIにより 双方向の 識別子検索が容易になりました とは言え デバイスや アカウントの設定 ネットワーク状態などの 要素に左右されるため 実際にはもっと複雑です これに対応するため APIは有効な識別子 あるいはマッピングの 失敗の原因を表示する ヘルパーオブジェクト のペアを使います
この際 2種類のエラーの 対処法を知っておく 必要があります 識別子マッピングの失敗が レコードの欠如や Appのフォトライブラリへの アクセス権限 に起因する場合 APIが返すオブジェクトは Identifier Not Found エラーを含みます
識別子が決まっていないため localIdentifierMapping オブジェクトから エラーメッセージが出ます Identifier Not Found の場合は 未解決のcloudIdentifierを 追跡し UIにプレースホルダーを加え 写真がこのデバイスで 見つからないことを示します もう一つのエラーは マッピングを 1対1で行うことが 失敗した場合です つまり 単一のクラウド識別子に 複数のアセットが 一致する場合を指します デバイス上でクラウドが 完全同期されておらず ライブラリが 画像を元に同一アセットを 探す場合です マッピングオブジェクトは この場合 Multiple Identifiers Found エラーとなり エラー情報に一致する 識別子が含まれます
Multiple Identifiers Found の場合 LocalIdentifiersErrorKey により 一致するローカル識別子が 入手可能です この例では 辞書にまとめることで ユーザーにアセットを提示し 手動で選択してもらいます
以上がクラウド識別子と 使い方の概要です ローカル識別子とクラウド識別子の マッピングは高価になりうるので ライブラリの操作は ローカル識別子を利用し 読み込みと保存のタイミングで マッピングを実行し クラウド識別子を 保存しておくことで 他のデバイスと 効率的に共有できます 次は制限ライブラリについて
制限ライブラリについて お話しする前に ライブラリのアクセス権限 について復習しましょう Appを開き PhotoKitを使って 写真へのアクセスを要求する場合 アクセスを承認する前に Appにアクセスを許可する 確認画面が表示されます 初回利用時は このような 通知が表示されます Appによるアクセスを 管理できることは ユーザーにとって 非常に大切です アクセスできる画像を 限定する ライブラリを全て アクセス可にする アクセスを全て拒否する というオプションがあり 「写真を選択」の オプションの場合 ライブラリへのアクセス は限定されます
WWDC2020の 「AppでのLimited Photos Libraryの活用」で ライブラリ制限モードや Appデザインの最適化 について詳しく説明しています ライブラリ制限アクセスは デベロッパにとって透明性が高い 設計となっています PhotoKit APIは 選択された写真だけを 含むライブラリとして 通常に動作し 大抵のワークフローを 容易にこなします 例えばAppがライブラリに 写真を加える場合 限定ライブラリに 自動的に追加されます
また カスタムアルバムを作り 選択されたアセットを 記録するフローがあります iOS14では 限定ライブラリモードは Appにカスタムアルバムの作成や アクセスの権限を与えていません
ですが iOS15の 限定ライブラリモードでは アルバムを作成・読み取り・更新 する権限を Appに付与しています
次はまた違うフローを 見ていきます ここで 先ほどの 写真ジャーナルAppの例を使います ライブラリ限定アクセスでも スムーズな経験を ユーザーに提供したいのです 新しいジャーナルを作成するたび 限定ライブラリピッカー を表示するよう インターフェイスを カスタマイズしました
こうすれば ジャーナルの作成時に より多くの写真を簡単に 選択できます 選択が更新されたら ユーザーがジャーナルに使うだろう 追加済みの写真を 把握できるといいですね iOS15での新API presentLimitedLibraryPicker を使い ユーザーが選択した写真の 識別子を得る 完了ハンドラをパスします これで どのアセットが追加され 選択が更新されたかを 把握できます
これで 限定ライブラリに 関するアップデート Appによるアルバムの作成と 編集の許可 そして新APIによる 限定ライブラリへの追加の 記録について
お話ししました 最後にアドバイスを一言 しばらくコードを更新を していない場合 Assets Libraryの 利用停止を推奨します iOS 9以来 非推奨となっており 今後のSDKでは削除する計画です 写真とのインテグレーションを 進められるよう 新しい写真ピッカーや PhotoKitを導入しましょう もう一つPhotoKitに移行する 理由があります 長らくエラー処理への対応が 遅れていましたが 変更リクエストの処理や リソースリクエスト 及び ライブラリアクセスコール時の 問題を特定し エラーコードを追加したことで これまでの問題が解決されました
iOS15で写真ピッカーや PhotoKitに加わった新機能を ご利用いただけることを 楽しみにしています ありがとうございます
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。