ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
App Intentにおける機能強化の詳細
App Intentでさらに便利なウィジェットを実現しましょう。最新アップデートを確認し、アプリショートカットの体験向上に役立つ動的オプションとユーザーインタラクションの活用方法を紹介します。Apple Payとの統合や、より効率的なコードの構成、ショートカットアプリ統合の次のレベルへの発展について学びましょう。App Intentとアプリショートカットの詳細は、WWDC23の「アプリショートカットによるアプリのSpotlight」をご覧ください。
リソース
関連ビデオ
WWDC23
-
ダウンロード
♪ ♪
こんにちは Shortcutsチームのエンジニアの Roman Efimovです 今日はApp Intentの素晴らしい新機能と 向上点について話し より良いアプリ作りをお手伝いします まずはウィジェットです iOSのユーザー体験で ウィジェットはますます 重要な一部になってきました この度 App Intentとウィジェットは シームレスに連帯し インタラクティブ性と構成を通し 新しい体験を提供します 次にデベロッパ体験での 今年度の改善点について お話しします フレームワークサポートなどの品質改善点や 静的抽出(static extraction) における向上点をカバーします 最後にApp Intentの ショートカットアプリとの統合での アップデートについて紹介します 今日は話題が盛りだくさんです まずはウィジェットの改善点から 始めましょう まずはウィジェットの構成について 構成可能なウィジェットを作る時 選択可能なオプションを ウィジェットの背後に特定します このオプションはパラメータと呼ばれ Siriやショートカットの サポートを追加する際に使う 同じシステムであるIntentを使用します ウィジェットの構成インターフェイスには それに対応するIntentに含まれる パラメータの順序付きリストが表示されます Intentに足される各パラメータは ウィジェット構成インターフェイスに 行として表示されます これまでIntent Definition Fileを使い XcodeでIntentsの宣言が必要でした iOS 17ではWidget Extensionコードで App Intentを使い ウィジェットの構成スキーマを 簡単に定義できるようにしました
そのためにはまず これまでウィジェットの構成に使っていた IntentConfigurationの代わりに WidgetConfiguration型の AppIntentConfigurationを 使わねばなりません 次にWidgetConfigurationIntent プロトコルに順従する新しい型を定義します WidgetConfigurationIntentは App Intentのサブプロトコルで Widget Extensionコード内で 直接順応させられます 私はBus Scheduleアプリで 特定のバス停で次のバスの発車時刻と 行き先を示すウィジェットを作っています これでアプリを開けることなく 次のバスがいつか 素早く確認することができます App Intentを使ってウィジェットの configuration Intentを提供します ユーザーがNext Busウィジェットを 設定できるよう まず最初に WidgetConfigurationIntentプロトコルに 順応する構造体を定義し これらのパラメータを含みます 保存されたリストから 新しく検索されたBus Stop(バス停) 特定のRoute(路線) そしてそのDirections(方向)です ウィジェットの構成に必要な パラメータを定義したら 各パラメータタイプの動的オプションを 提供する必要があります これまではパラメータの 動的オプションの提供には 別のIntent Extensionの作成が必要でした App Intentにより Widget Extension内で直接クエリと 動的オプションプロバイダを実行でき プロジェクトがまとまり効率的になります 動的オプションプロバイダと クエリについては 「Dive into App Intents」をご覧ください では既存ウィジェットのSiriKitsから App Intentへの移行についてです 既存ウィジェット構成の App Intentへの移行は簡単です 実際 Xcodeでワンクリックするだけです ウィジェットの移行は最新OSと ウィジェットをApp Intentに転換前の 旧式OSの両方をサポートします 既存の構成済ウィジェットは そのまま作動します 旧式OSをサポートする必要がなくなれば SiriKit Intent定義ファイルを削除できます 移行するにはIntent定義ファイル内の SiriKit widget configuration Intentで を クリックします Xcodeは古いIntent定義と同等の App Intentコードを作成します すべてのApp Intentパラメータの名前と型が Intent定義とマッチするよう スキーマが同じであることを確認します 新しいパラメータの追加も可能です オプションのパラメータや デフォルト値の必須のものも追加できます パラメータの付足前に作成された 既存のウィジェットは そのパラメータで空値か 供給されている場合はデフォルト値を得ます これまでのiOSバージョンで新パラメータを 使用させるのであれば SiriKit Intent定義ファイルを維持し パラメータを足す必要があります ユーザーがアプリをアップデートすると ウィジェットは自動的に移行されます アプリには一度しかチャンスがないため 移行がスムーズに行くよう テストすることが重要です 移行について学ぶには 「Migrate custom Intents to App Intent」をご覧ください ではウィジェットのインタラクティブ性 についてです ウィジェットはボタンの タップやトグルに反応し 設定を調整したりメディア再生したり アプリの重要な機能へのアクセスを ホーム画面で行うことができます Next Busウィジェットで 時間のボタンをタップ可能にします このボタンをタップすれば アプリ内でアラームをセットし バスに遅れないよう 家を出る時間を知らせるには どうすればいいでしょう? SwiftUIボタンとトグルは App Intentをサポートできるようになり ウィジェットに簡単にインタラクティブ性 を足せます App Intentを実行したことがあれば 慣れているはずです まずApp Intentプロトコルに順応する 構造体を定義します 次にParameterプロパティラッパーのある 重要プロパティに注釈をつけ アクションの実行に関連情報が必要だと システムに知らせます それからアクションを実行する performメソッドを与えます 最後にウィジェットビューで SetAlarm App Intentを ボタンと関連させます SwiftUIのApp Intentとの統合は インタラクティブウィジェットだけでなく 通常のSwiftUIアプリでも使用できます App Intentにコードを統合し 冗長性を削減しアプリを通して 行動を一貫できます App Intentは構成ならびに インタラクティブアクションを提供する 役割があるので Intentコードをショートカットに 簡単に再利用できます 例えばShowNextBus ウィジェット構成Intentは ウィジェット構成でも 必要時に最新情報を提供する ショートカットアクションとしても 使用できます さらにウィジェットにインタラクティブ性を 足すために使ったApp Intentは ショートカットアクションとして バスの到着時間をアラームに 設定することができます ウィジェットのインタラクティブ性については 「Bring your widget to life」を ご覧ください では機能とウィジェット構成の デザインを向上させる 上級テクニックをいくつか見てみましょう まずDynamic optionsと クエリの向上についてです Dynamic optionsは App Intentのパラメータの 有効値を提供するインターフェイスで DynamicOptionsProviderか EntityQuery系のプロトコルに 順応することで実行されます 場合によっては別のパラメータ値に基づく 特定の条件が 合った時にだけ利用できるオプションを 示したいこともあります 例えばこのウィジェット構成では Bus Stopパラメータに基づき 利用可能な路線だけを 表示したいとします このためにはiOS 17の新API IntentParameterDependencyを呼びます これはDynamicOptionsProviderか クエリ内で Intentsからパラメータにアクセスできる プロパティラッパーです これらのパラメータを読んで より動的で コンテキストアウェアな オプションを作成できます この例ではユーザーが選んだバス停に基づき 利用可能なバス路線を返します IntentParameterDependencyは ウィジェットやショートカット 集中モードなど すべての環境で作動します この例では BusRouteQueryという構造体があり EntityQueryプロトコルに順応します この構造体にはIntentParameter Dependencyプロパティラッパーで包まれた ShowNextBusというプロパティがあります つまりBusStopパラメータにおいて Bus RouteクエリはshowNextBus App Intentに従属性があります suggestedEntitiesメソッド を見てください Suggested Routeオブジェクトの列を 返しています まずshowNextBus Intentプロパティが non-nilかチェックします もしそうなら可能路線をフィルターし 特定のバス停にマッチする 路線だけが現れます IntentParameterDependencyはまた いくつものパラメータに依存します 例えばdirectionクエリで 進行方向オプションに bus stopとrouteパラメータの 両方に依存したいとします また同じクエリかdynamic options provider内で幾つかの App Intentに依存できます このdirectionクエリは 2つのIntentからパラメータを読みます ShowNextBusとShowFavoriteRouteです IntentParameterDependency プロパティラッパーは busStopの依存性の特定と ShowNextBus Intentの routeパラメータ そしてShowFavoriteRoute Intentの routeパラメータに使用されます Route computedプロパティは showNextBusかshowFavoriteRouteの どちらかから値を返します
ウィジェット構成には時として 配列パラメータがあります 例えばFavorite Routesウィジェットでは お気に入り路線の バスの時刻表が表示されます しかしスペースが限られているため 最高3路線までに限定すべきです どう定義すればいいでしょう? iOS 17では配列パラメータで サイズを宣言できます 大きいウィジェットは小さいものより 多くアイテムを収容できるので ここでは配列のサイズに合わせた マッピングも受け入れられます Widget Configuration App Intentと そのパラメータを定義すれば どのパラメータを いつ表示すべきか定義します ParameterSummaryは App Intentのパラメータの 視覚表示を定義します つまりショートカットエディタや集中モード そしてウィジェットの構成で App Intentの見た目を左右します Parameter summariesでどのパラメータを どの条件で見せるか定義できます ウィジェットではまず Summary sentenceのパラメータを表示し クロージャにあるパラメータを表示します ここではsentenceに routeパラメータがあり クロージャには includeWeatherInfoがあり configuration UIで その順に表示されます iOS 17ではWhen statementを ウィジェットに使用でき ウィジェットのサイズに基づき 構成の変更が可能になりました 例えば大きいウィジェットに 天気情報を表示するトグルを付け それ以外のサイズには これを提供しないとします そこでincludeWeatherInfoパラメータを 大きいウィジェットの Parameter Summaryにだけ含みます 小さいウィジェットには付けないため パラメータは隠されます App Intentでウィジェットの構成を 実行したところで タップした時にどうなるか どう決めればいいでしょう? ウィジェットのどこをいつタップしても アプリが開きます ウィジェットで選んだ 特定の路線情報を表示した画面に 直接送りたいとします ウィジェットをタップして アプリが起動した時 userActivityで widgetConfigurationIntentを呼んで 関連するconfiguration Intentを 得ることができます App Intentがあればアプリの インターフェイスの更新に使用できます ここではConfiguration Intentから コンテンツを抽出し 一致するバス停と路線を示すため 特定のバス停のビューに アプリを誘導します ウィジェットを作る時 スマートスタックでタイミングよく 見せたいものです そのためには新しい RelevantContext APIsを使って iOSとwatchOSの Widget suggestionsを利用します 以前のINInteractionと INDailyRoutine そして INRelevantShortcut APIsを元に 新しくRelevantIntentManagerと RelevantIntentをデザインし Swiftで使いやすくApp Intentと シームレスに使用できます 試合中にウィジェットが現れる スポーツアプリを想像してみてください 新しいRelevantContext APIで このIntentと 適切な期間の範囲を特定できます 適切な日付情報の提供で スポーツアプリウィジェットが スマートスタックで自動的に勧められ 最も大切な時に試合情報に簡単に アクセスできるのです
Relevance APIsは コンプリケーションにも最適です watchOSでの使用については 「Build widgets for the Smart Stack on Apple Watch」をご覧ください ウィジェットの次は iOS 17とXcode 15での デベロッパ体験の向上について お話ししましょう まずフレームワークサポートです もしアプリとApp Intent Extension の両方から App Intentを実行する必要があるなら 現在はApp Intentコードを 両方でコンパイルする必要があります 残念ながらこれはコードの重複につながり メンテナンス上の問題や エラーや不整合の増加につながります またバイナリーのサイズが増加し アプリの性能に悪く影響し ダウンロード時間が増加します iOS 17とXcode 15では フレームワークはApp Intentを 直接公開でき 2度のコンパイルは不要になります AppIntentsPackage APIsを使用して アプリの依存関係を再帰的に取り込めます AppIntentsPackageに型を 順応させることで 他のフレームワークから メタデータを再書き出しできます フレームワークサポートで Bus Scheduleアプリの実行を簡単にします ここにBusScheduleIntentsという 時刻表の閲覧にApp Intentを供給する フレームワークがあります これは依存性なく再書き込みを可能にします またBusScheduleUIというフレームワークは Bus Scheduleアプリに カスタムインターフェイス要素を供給します これはBusScheduleIntents フレームワークに依存し再書き込みします 最後にBusScheduleUIフレームワークを Bus Scheduleアプリから取り込みます AppIntentsPackageはプロトコルなので SwiftUI App構造体を順応させます Bus Scheduleアプリは BusScheduleUIフレームワークの 直接依存性を言及するだけです これでBus Scheduleアプリ内に SwiftUIボタンを作り ShowSchedule App Intentを実行して お気に入りの路線を表示できます 同じShowSchedule App Intentは ショートカットユーザーも使用でき アプリを起動することなく お気に入り路線の時刻表にアクセスできる カスタムショートカットが作れるのです App Intentを フレームワークに取り込むことで コードベースをシンプルに合理化できます 新しいフレームワークサポートは 特にApp Intentでのウィジェット作成に 役立ちます アプリとWidget Extensionの両方から 同じIntentsにアクセスする必要が ある場合があるため App Intentコードをモジュールにする もう1つのヒントです AppShortcutsProviderの作成と アプリショートカットの定義が App Intent Extensionで可能です これまでアプリショートカットの定義は アプリバンドル内のみでした つまりApp Shortcutが実行される度に アプリが背景で起動するのです これからはアプリショートカットを App Intent Extension内で定義できます これによりApp Intent Extensionを 最適化し アプリより素早く立ち上げ インターフェイスやアナリティクス等の クリティカルではないコードを起動せず 性能向上につながります これらの機能はすべてXcode 15の 静的メタデータ抽出の改善に依拠します ではApp Intentコンテンツが どのようにコード構築中に 静的抽出されるか見てみましょう Swiftコンパイラは App Intent実行からの型レベルや 一部の値レベル情報 及びコード内で利用可能な 型の情報を出力します そして別のツールがこの情報を解析し App Intentやパラメータ エンティティやクエリなどを 記述するファイルを含む Metadata.appIntentsディレクトリを ビルドプロダクト内に生成します Xcode 15では静的抽出プロセスが 著しく向上されました より速く確実により多くのケースで 使用できます Xcode 15でアプリを作成する時 Xcodeが期待通りに何かを 静的抽出できない場合 Xcode editorに直接 エラーメッセージが表示され ライン番号も含まれるので どこを直せばいいかがわかります 統合についてお話しする前に 今年からApp Intentに加わった もう2つの機能を ご紹介しましょう まずIntentが以前に背景で動作していても アプリ内でIntentを 実行し続けられる能力です ForegroundContinuableIntent プロトコルと呼びます 例えば次のバスをフェッチする App Intentが 無効パラメータや接続問題で 時刻表を検索できなかった場合 この問題を解決するため アプリで続行するよう求めることができます そのためにはまずApp Intentを ForegroundContinuableIntent プロトコルに順応させます ForegroundContinuableIntent プロトコルは 背景で実行を始めたものの 前景での続行が必要なIntentのために デザインされています 次にToContinueInForegroundError メソッドを呼ぶ必要があり エラーが返ってきます そのエラーをthrowすると システムはApp Intentを中断し ユーザーに前景での実行を求めます また前景に移ったあと アプリの状態を更新するため メインスレッドで実行される continuation closureを 提供することもできます ここではこのclosureで アプリをエラー画面に導きます needsToContinueInForegroundErrorは Intentの実行を停止し 先程のようにアクションを 続行させる時に使用してください App Intentの実行を停止させる代わり 続行させたい時に使用する 別のAPIもあります その場合 requestToContinueInForeground メソッドを呼びます これは路線の整備問題をアプリが察し 別の路線を選ばせるため アプリにカスタムインターフェイスを 表示したい場合に使用します ユーザーが路線を選ぶと アプリから更新された路線を返し App Intentの実行を続行できます 今度はエラーをthrowする代わり try awaitでメソッドを呼び出します パスしたclosureは値を返し 実行に戻すことができます そしてユーザーからの入力のあと App Intentを続行できます ここではユーザーが選んだ別の路線で その路線の次のバスを示す スニペットを返します 要約すればApp Intentの実行を 完全に止めたければ throwメソッドを使います そうではなくユーザーから結果を受け取り App Intentの実行を完了させたいなら requestToContinueInForegroundを 使用し結果を待ちます
今年からApp Intentで Apple Payがサポートされます 実行メソッドの中で直接 Apple Payの会計処理を開始できます Apple Payを使用するのは簡単です PKPaymentRequestインスタンスを作成し 必要情報とともに構成します 次に PKPaymentAuthorization Controllerで Apple Pay支払いシートを提供し 認証を処理します Guard statementが Controllerが無事提示されたか確認します 提示されなかった場合「Unable to process payment」と返ります それ以外の場合は 支払いが処理されたということです 最後にApp Intentと ショートカットアプリの統合に関する アップデートについてです ではApp Intentが統合された システムの箇所からです App Intentはショートカットアクションを 構築する最新方法で アプリショートカットは Siriやショートカットアプリで あなたのアプリの機能を 発見し使用しやすくします また集中モードや Apple Watch Ultraの アクションボタンとの統合もあります iOS 17では Interactive Live Activitiesや ウィジェット構成に インタラクティブ性やSwiftUIなど App Intentはより アクセシブルになりました アプリショートカットも成長し Spotlight Top Hitsや Automationsをサポートします これらの統合により 同じApp Intentコードを 様々な方法で使用できるということです App Intentは主要システム構成要素に 深く統合されているため みなさんのApp Intentが 健全性を確かめるのが重要です よいparameter summaryの提供は システムを通しApp Intentが 健全であることを保証します Parameter summariesは 文章のように書きましょう さらに任意のパラメータを 折り返しの下に挟めます そしてシステムがコンテキストに基づき Parameter summaryの 最善の可視化表現を決定します App Intentは どこでも動作するのが理想的ですが 場合によってはApp Intentを アプリやインタラクティブ ウィジェットだけに限定し システムのほかの箇所から 隠すべき時もあります 例えばApp Intentが ショートカットアクションを有効に使用しない ローカル関数をアプリ内で 呼び出す時などです その場合 App Intentの isDiscoverableプロパティを falseに設定します Next Busウィジェットに リフレッシュボタンを追加し サーバーから最新のデータを読み込みます ウィジェットで目的を果たしますが 便利な ショートカットアクションではありません このApp Intentはインタラクティブ ウィジェットでのみ使用するため isDiscoverableをfalseに設定します Undiscoverableと記されたApp Intentは アプリショートカットにも使用できません アプリ実行のIntentsは速いですが すべてがそうではありません 今年から長期間実行するIntentの 進捗を確認できる新しい方法が登場しました 進捗の報告にはApp Intentを ProgressReportingIntent プロトコルに順応させます perform()メソッド内で供給された progressオブジェクトにアクセスできます totalUnitCountを設定し Intentの実行が進むにつれ completedUnitCountを増分して 進捗をアップデートします ショートカットアプリが自動的に App Intent実行の進捗を表示します Progress reportingの実行は 特に長期Intentにとって重要です フィードバックがあるのは非常に貴重で Intentの実行が進み いつ完了するかがわかります またアプリの探すアクションとの 統合の仕方を改善しました ユーザーは メモを検索のような特定基準で アプリ内のコンテンツを 探すことを好みます これらのアクションの出力は メール送信のような ショートカットアクションで パワフルなワークフローが可能です iOS 16では EntityPropertyQueryを実行し ユーザーが特定すべき基準を宣言して アプリに探すアクションを 得ることができました iOS 17からは EnumerableEntityQueryプロトコルを その代わりに使用することもできます 適応はシンプルで簡単です EnumerableEntityQueryの実行は allEntities()メソッドで エンティティに可能性ある値を すべて返すのと同じくらい簡単です とApp Intentがそこから受け継ぎ 自動的に探すアクションを生成します EnumerableEntityQueryと EntityPropertyQueryの違いは EntityPropertyQueryは デベロッパに基準を送り ユーザーに代わり検索を実行することです つまり返す結果がしばし限られます EnumerableEntityQueryでは フレームワークに 可能なすべてのエンティティを与え ショートカットがそれをフィルターします すべてのエンティティを返すので EnumerableEntityQueryは 使用が非常に簡単ですが 少数のエンティティに最適です Safariのタブグループなどに最適ですが 大量のエンティティがある メモアプリには向いていません また大量のメモリを使用する 大きなエンティティにも向いていません この場合 EntityPropertyQueryを使用し 一度に多数のエンティティを返す代わりに こちらで検索を行うことにします 最後にIntentDescriptionの アップデートについてです これはアクションに関する情報を得るため 詳細ボタンのタップ時に見える インターフェイスの記入の型です IntentDescriptionには記述書きと カテゴリ名と検索キーワードがあります iOS 17ではIntent Description型が resultValueNameという 新プロパティに更新され アクションの出力により記述的な名前を 提供できるようになりました ここでは「リマインダーを追加」が 作成し返ってきたリマインダーに 「新規リマインダー」の resultValueNameを提供します 「リマインダーを追加」アクションが 「結果を表示」アクションと関連するとき 「結果を表示」アクションのパラメータは 「新規リマインダー」を表示します resultValueNameにはIntentDescriptionで 新イニシャライザを使用します iOS 17からはEntityPropertyQueryか EnumerableEntityQueryプロトコルで 生成された探すアクションの Intent descriptionを含むことができます これには単に findIntentDescriptionプロパティを クエリ型内で採用するだけです もしcategoryNameで アクションを分類したなら アプリがサポートするアクションリストの 望ましいカテゴリで生成された 探すアクションを表示できます 要約するとApp Intentは システムとユーザーに アプリの機能を示す素晴らしい方法です ユーザーがすぐ使えるようApp Intentを アプリショートカットにする方法については 「Spotlight your app with App Shortcuts」をご覧ください App Intentで構成可能でインタラクティブな ウィジェットとライブ活動を 作成でき ショートカットアプリとの統合により よりスムーズなデベロッパ体験を提供します App Intentを使ってぜひ驚きと喜びの 素晴らしいアプリを作成してみてください ご視聴ありがとうございました ♪ ♪
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。