ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
写真ピッカーの最新情報
PHPickerにより、ご利用のAppとシステムの写真ライブラリ間での簡単かつ安全な統合が実現します。SwiftUIやTransferableが、iOS、iPadOS、macOS、WatchOSにわたって統合を提供する仕組みをご覧ください。 また、AppKitやNSOpenPanelを使用して、Macの写真ピッカーをご利用のmacOS向けのAppに取り込む方法も紹介します。 写真ピッカーの詳細については、WWDC21の「App内の写真アクセスの改善」をご覧ください。
リソース
関連ビデオ
WWDC23
WWDC22
WWDC21
WWDC20
-
ダウンロード
♪ 明るい音楽 ヒップホップミュージック♪ ♪ こんにちは 私はJustinと申します Photosチームで エンジニアをしています 本日は 写真ピッカーシステムの 改善点について いくつか紹介したい と思います 写真ピッカーシステムにより ほとんどのAppから iOS上で写真や動画を 取得することができます ピッカーが処理を実行するために Appは使用する ライブラリにアクセスするための リクエストをする必要がありません 直感的なUIと使いやすいAPIを 搭載しています PHピッカー APIにあまり 馴染みがない場合は 昨年度のWWDC セッションで 詳細に説明しています のでご確認ください 本日のセッションでは ピッカーに搭載した 新しい機能の概要から 説明していきたいと思います その後 ピッカーが対応する プラットフォームや フレームワークについて 話していきます では 始めましょう ピッカーの導入により 画像や動画 Live Photosをフィルタ することができます Appによっては 他の要件が必要な場合が あることを理解しています 例えば スクリーンショットを 加工するAppでは ピッカーではスクリーンショットだけを 表示したいかもしれません 本年度追加した 新しいスクリーンショットフィルタ でそれが可能になりました スクリーンショットに付随して 画面記録やスローモション動画など 他のアセットタイプも 追加しました PHAsset.PlaybackStyle を使用して 新しいフィルタを作成することも できるようになりました シネマティックビデオ 被写界深度エフェクト写真・バースト以外の 新しいフィルタがすべて バックポートされます AppがiOS 15向けの場合 iOS 16 SDKで コンパイルしている限り そのまま使用することが できます 複合フィルタは 従来の「any」に加え 「all」と「not」も 使用することができます それらは iOS 15にも バックポート可能です いくつかのコードの 例を見ていきます 動画とLive Photosを表示するためには 「any」を使用して閲覧可能です またはスクリーンショットだけを 表示したい場合もあります スクリーンショットなしの すべての画像を表示するには 「all」と「not」を使用して 画像とスクリーンショットの フィルタを掛け合わせることができます 最後の例では iOS 16に対応している場合 .cinematicVideos フィルタを使用します 次に ハーフハイト ピッカーに関連する 改善点について説明します iOS 15では UIKitには新しい UISheetPresentationController APIが搭載されており ハーフハイトモードで ピッカーを使用することができます これはすでに複数のケースで うまく機能しています しかし カスタムUIを 実装して 選択したアセットを調整し その変更をピッカーに 反映させたいと考える方も いるかと思います iOS 16では アセット識別子を使用して アセットを外すことが できるようになります ここで示すように deselectAssetsを呼び出した後 ピッカーで2枚目の写真が 選択されなくなります moveAssetメソッドを呼び出して 順序を調整することもできます これで 新しいピッカーの機能について すべて知ることができましたので プラットフォーム対応 について話していきましょう 現在では 写真ピッカー システムは iOSおよびiPadOSApp のみに対応しています 今年は 写真ピッカーをさらに 2つのプラットフォーム macOSおよびwatchOSに 導入します iPadOS ピッカーは iPad専用の 新しいデザインに 刷新されました まずは 新しいiPad UI について見ていきましょう ピッカーにはiPadの ディスプレイの大きさを生かして サイドバーが表示される ようになりました サイドバーにより異なる コレクション間の 移動が速くなりました スプリットスクリーンモードなど 十分なスペースがない場合は 従来のコンパクトピッカー UIに 戻ります 次はmacOSの場合です macOS ピッカーはMacスタイルで サイドバーも搭載しております また iOSのピッカーと同様に 複数選択や グリッド内のスムーズな ズームに対応し 人・場所・その他多くのものを 検索できる 強力な検索機能が 搭載されています 新しいピッカー UIは NSOpenPanelでも利用可能です システムの写真ライブラリから アセットを選択できるほか 今回初めてiCloud写真に 保存されている アセットを含めて 選択できるようになりました Appは導入作業を する必要なく 無料で新しいUIを 取得できます ドラッグ&ドロップには NSOpenPanel ピッカーで対応しています これは iOS・iPadOS・macOS上で 標準のピッカーでも 対応しています Appが いくつか画像や動画を 選択するだけの場合 NSOpenPanel APIだけで 足りるかもしれません しかし 写真ライブラリで 選択されたファイルは システムによっていつでも削除される 場合があることを留意してください 長期的に利用可能な状態を 維持する必要がある場合は Appが管理する場所に コピーしておく必要があります メディア中心のmacOSAppでは 最高のユーザー体験のために 新しい写真ピッカーをデフォルトで 使用することを推奨します 一方でAppはNSOpenPanel APIを 使用して ファイルシステムから アセットを選択する 別の方法を提供する 必要性もあります ユーザーが写真ライブラリ以外の アセットを 選択したい場合などです 最後になりましたが watchOSについてです 今回初めて 新しいAPIを使って ウォッチに保存されている 画像が表示できるように なりました watchOS ピッカーもiOSや macOS ピッカーと 同様のプロセスで 実行されるため ライブラリへのアクセスを リクエストなしに使用できます iOS ピッカーに 類似したUIがあり 小さい画面に対して最適化 されています グリッドやコレクション単位で 写真を閲覧することができます ピッカーは 選択制限を 指定したり 選択順を表示するように 構成もできます iOSやmacOSとは異なり watchOS ピッカーには 画像だけが表示されます デバイスに500枚以上の 画像がある場合は 最新の500枚のみが 表示されます 「PHPickerViewControllerは UIKitベースのため macOSまたはwatchOSAppで どのように使うことができるのか」 と思われるかもしれません ご存知のように AppKitとSwiftUIで 新しいピッカー APIが 利用可能になりました まず最初にAppKit API を見ていきましょう 実際 UIKit APIと 類似しています PHPickerConfigurationの 同じタイプと そのプロパティを取得します 少しの違いがあり それはPHPickerViewControllerは AppKit AppではNSViewController のサブクラスであるということです AppKitベースのPHPickerが 導入されたことにより レガシーのメディアライブラリブラウザ から離れましょう PHPickerはより強化されています UIKitとAppKitのAppを どちらも同時に開発する場合でも メンテナンスが簡単です 最後に SwiftUI API について話します
セッションの冒頭でご覧いただいた iOS ピッカーを思い出してみてください 数行のSwiftUIのコードだけで 表現することができます さらに重要なのは ピッカーが対応している すべてのプラットフォーム OS・iPadOS・macOS・watchOSで PhotosPicker APIに アクセスできます ピッカーは プラットフォームや Appの構成 利用可能な 画面スペースに応じて 最適なレイアウトを 自動的に選択します ピッカー UIがどうあるべきか 気にする必要がないため Appの改善に 集中することができます
詳細をデモで 新しいAPIを見る前に まず最初に 選択した写真や動画を 読み込む方法について 説明します SwiftUIのバインディングを 介して受け取る選択項目は プレースホルダーオブジェクト だけが含まれます オンデマンドで実際のアセットデータ をロードする必要があります いくつかのアセットデータは 直ちにロードされることがない ことを留意してください ピッカーがiCloud写真から データをダウンロード しようとした際に デバイスがインターネットに 接続されていないなどの エラーが発生した場合 ロード操作に失敗する 場合があります 動画などの大きなファイルは ダウンロードに時間がかかる場合があるため ブロッキングローディング 識別子の代わりに アイテムごとのインラインローディング UIを表示することを推奨します 写真ピッカーは Appや拡張機能間で データを転送するための 新しいSwiftUIのプロトコルである Transferableを使用しています Transferable経由で直接 SwiftUI Imageをロードできますが 高度なユースケースの場合 ロードしたいデータのタイプを 完全に管理するために Transferableプロトコルに 準拠した 独自のモデルオブジェクトを 定義する必要があります Transferableの 詳細情報については 「Transferableの紹介」 セッションを確認できます Appが同時に多くのアイテムを 処理する必要がある場合や 動画などの大きなアセットを 処理する場合 すべてを同時にメモリに 読み込むことは 現実的でない場合があります メモリ使用量を減らすために FileTransferRepresentationを使用して 選択したアセットをファイルとして ロードすることができます アセットをファイルとして ロードする場合 Appにそのライフサイクル を管理する 責任があることに 留意してください ファイルを受信したら常に Appディレクトリにコピーし 不要になったら 削除してください では デモを行います アカウントのプロフィール ページを表示して このAppのデモの 準備を済ませています 現在 プロフィール画像は プレースホルダーアイコンになっています 編集ボタンを追加して PhotosPicker APIを使用し プロフィール画像を 変更したいと思います プロフィール画像ビューは ビューモデルで定義された 画像の状態にすでに 応答できており ピッカーの選択を 受け取った際に 画像の状態の更新だけを 行う必要があります まず最初に ビューモデル について見ていき 新しいimageSelection プロパティを追加します 選択のバインディングとして PhotosPicker APIに 送信されます プロフィール画像ビュー に戻り ピッカーを導入する オーバーレイボタンを追加します
ではここで 今追加した コードを見ていきましょう PhotosPickerビューを 追加し 先ほど定義した選択 バインディングを取得し 画像のみを表示するために 設定しました PhotosPickerのラベルは 円を背景にした 鉛筆のグリフだけです ここまでの内容をビルドして 実行してみましょう 編集ボタンをクリックして ピッカーを表示させることができます 画像をタップして ピッカーを自動的に閉じますが プロフィール画像は 更新されません どうしてでしょうか 画像の選択および 画像の状態を つなげる必要があります では始めましょう ビューモデルに戻り 設定した画像選択didsetに 応答します 画像選択がnilの場合 画像状態をemptyにします そうでなければ 画像のロードを開始します loadTransferableメソッドを まだ実装していないため コンパイルエラーが 表示されています では修正しましょう
実装は非常に単純です ハンドラーの完了に応答して リクエストがまだ 最新のものであれば 画像の状態を 更新することが必要です アクションで確認するために ビルドおよび実行をしましょう 編集ボタンをタップして 画像を選択することができます いいですね! 期待通りに 機能しています 実は このプロジェクトはmacOSで 実行するための準備もできています 先ほど追加したコードは macOSでも自動的に機能します ビルドおよび実行して 見ていきましょう コンパイルできました! ピッカーを開いて 画像を選択して Appに反映する ことができます デモはこれで以上です iOSおよびmacOSのデモを ご覧いただきましたが 同じコードでwatchOSで 同様に機能します しかし 留意していただきたいこと がいくつかあります
watchOS ピッカーは単純なフローおよび 短いインタラクションで 設計されます 画像はデバイスのサイズに 応じて調整されます 通常はペアリングされた iPhoneから同期されます Family Setupを使えば iPhoneを持っていない家族も Apple Watchの機能やメリットを 活用することができます デバイスがFamily Setup モードの場合 ピッカーで iCloud写真の 最新画像1000枚を 選択することができます ピッカーはインターネットからいくつか画像を ダウンロードする必要があります その場合は 閉じる前にピッカーに ローディングUIが表示されます
最後に一言だけ残したいと思います ほぼすべてのAppが 写真や動画にアクセスできる 最善の方法としての 写真ピッカーの開発のために 私たちは日々努力を重ねています まだカスタムピッカーを 使用している場合 ぜひこちらに切り替えてください ありがとうございます WWDCの素晴らしい機能を楽しんでください! ♪
-
-
0:01 - PHPicker Example (UIKit)
var configuration = PHPickerConfiguration() configuration.filter = .images configuration.selection = .ordered configuration.selectionLimit = 10 let picker = PHPickerViewController(configuration: configuration)
-
0:02 - PHPickerFilter
var configuration = PHPickerConfiguration() // iOS 15 // Shows videos and Live Photos configuration.filter = .any(of: [.videos, .livePhotos]) // New: iOS 15 // Shows screenshots only configuration.filter = .screenshots // New: iOS 15 // Shows images excluding screenshots configuration.filter = .all(of: [.images, .not(.screenshots)]) // New: iOS 16 // Shows cinematic videos configuration.filter = .cinematicVideos
-
0:03 - PHPicker Example (AppKit)
var configuration = PHPickerConfiguration() configuration.filter = .images configuration.selectionLimit = 10 let picker = PHPickerViewController(configuration: configuration)
-
0:04 - PhotosPicker Example (SwiftUI)
struct ContentView: View { @Binding selection: [PhotosPickerItem] var body: some View { PhotosPicker( selection: $selection, matching: .images ) { Text("Select Photos") } } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。