【iOS】App Intentsでアプリのショートカットを作成する

App Intentsはユーザーのインタラクションを簡略化し、特定のタスクや操作を実行するショートカットです。App Intentsフレームワークを使用することで、数行のSwiftコードを記述するだけでアプリのIntent を作成することができます。App IntentsフレームワークはWWDC2022で発表されましたが、App Intentsフレームワークが登場する前はIntentdefinition ファイルに必要なメタデータを入力し、Intent を定義する必要がありました。この工程がSwiftコードに置き換わることにより、コードレビューやマージ後のコンフリクト解消が容易になり、Intent のメンテナンス性を向上させることできます。
本記事では、最初にApp IntentsフレームワークでIntent を作成し、Intent をAppショートカットに設定するための最小実装方法を説明します。続けて最小実装コードをベースにIntent 機能を拡張していきます。
本記事をお読みいただくことで、アプリにApp Intentsを搭載し、アプリを起動しなくてもアプリの特定の機能を実行することができるようになります。
Intentの作成
Intent はAppIntent プロトコルに準拠した構造体で定義します。
AppIntent プロトコル
AppIntent はIntent を作成するためのインタフェースが定義されているプロトコルです。AppIntent プロトコルに準拠するためには title プロパティとperform() メソッドを定義する必要があります。ショートカットのタイトルはtitle プロパティに定義し、Intent 実行時に行いたい処理をperform() メソッド内に定義します。Intent 実行時にアプリを起動したい時はopenAppWhenRun プロパティをtrue にします。 openAppWhenRun プロパティの定義は任意ですが、デフォルトはfalse です。

ショートカットの追加
作成したIntent をSpotlightやショートカットAppで表示させるために、AppShortcutsProvider プロトコルに準拠した構造体を定義します。
AppShortcutsProvider プロトコル
AppShortcutsProvider はAppインストール時にショートカットを作成するためのインタフェースが定義されているプロトコルです。AppShortcut のintent プロパティには実行したいIntentを指定し、phrases プロパティにSiriを経由してショートカットを実行するためのフレーズを指定します。また、shortcutTileColor プロパティにカラーを指定することで、ショートカットAppに表示するショートカットアイコンボタンのカラーを変更することができます。

AppIntent 、AppShortcutsProvider 各プロトコルに準拠した構造体を定義するだけで、Appのショートカットを作成することができました。次章以降ではIntent 機能を拡張する方法を説明します。
ショートカット実行結果の表示
ダイアログ
IntentResult オブジェクトのdialog 引数に文字列を指定することで、実行結果をダイアログで表示することができます。

カスタムView
IntentResult オブジェクトのview 引数にカスタムViewを指定することで、
ショートカットの実行結果をカスタムViewで表示することができます。

パラメータの追加
Intent にあらかじめ用意したパラメータを設定できるようにします。以下のサンプルコードではショートカットで開きたい教科書の科目情報をパラメータとして設定しています。
AppEnum プロトコルに準拠したEnum の各要素がショートカットのパラメータとなります。AppIntent オブジェクト側では、パラメータは@Parameter プロパティラッパーで宣言され、title 引数に指定した文字列はパラメータの初期表示として表示されます。
AppEnum プロトコル
AppEnum はショートカットに設定する変数を作成するためのインタフェースが定義されているプロトコルです。typeDisplayRepresentation プロパティはAppEnum の名称、caseDisplayRepresentations プロパティに定義した辞書配列の値は、ショートカットのパラメータ名として表示されます。

パラメータサマリ
AppIntent オブジェクトのparameterSummary プロパティを定義することで、パラメータをショートカットのサマリーに埋め込むことができます。

所感
Swiftコードのみでショートカットを作成することができ、Appにショートカットを導入する敷居がグッと下がったように感じました。
参考資料
Dive into App Intents Implement App Shortcuts with App Intents
Discussion