【iOS 18】コントロールウィジェットの導入 (応用編)
前回の記事では、アプリにコントロールウィジェットを追加する方法と、主要なプロトコルおよび構造体について解説しました。
本記事では、前回の記事に引き続き「Extend your app’s controls across the system」セッションで公開されている内容を解説します。
前回の記事とあわせてお読みいただくことで、実際にアプリで動作確認を行いながら、「Extend your app’s controls across the system」セッションで解説されている内容を把握していただくことができます。
本記事では、以下の内容に絞って解説します。
- ユーザーが構成を変更することができるコントロールの作成方法
- コントロールの状態をアップデートする方法
コントロールウィジェットのタイプ
コントロールウィジェットの構成タイプは、StaticControlConfiguration
と、AppIntentControlConfiguration
が用意されています。
StaticControlConfiguration
ユーザーがコントロールの構成を変更する必要がない時は、StaticControlConfiguration
を使用してコントロールウィジェットを作成します。
StaticControlConfiguration
の初期化を行う時、provider
引数にはControlValueProvider
プロトコルに準拠した構造体を指定します。
StaticControlConfiguration
については、前回の記事で解説しました。
AppIntentControlConfiguration
ユーザーがコントロールの構成を変更する必要がある時は、AppIntentControlConfiguration
を使用してコントロールウィジェットを作成します。
AppIntentControlConfiguration
の初期化を行う時、provider
引数にはAppIntentControlValueProvider
プロトコルに準拠した構造体を指定します。
AppIntentControlValueProvider
一時的にコントロールの外観を表示するため、WidgetKitはpreviewValue
をシステムに提供し、その後、非同期で取得した値はcurrentValue
でシステムに提供することは、前回の記事で解説しました。
AppIntentControlValueProvider
プロトコルに準拠した構造体を定義する時、previewValue(configuration:)
とcurrentValue(configuration:)
を定義します。どちらの関数も、ControlConfigurationIntent
に準拠した構造体を引数に取ります。
ControlConfigurationIntent
ControlConfigurationIntent
プロトコルに準拠した構造体を作成し、ユーザーに入力させたいパラメータは、@Parameter
プロパティラッパーを付与した変数で宣言します。
ユーザーからパラメータの入力を受け付けると、AppIntentControlValueProvider
プロトコルに準拠する構造体が持つpreviewValue
とcurrentValue
経由で入力されたパラメータを受け取ることができます。
コントロールウィジェットの状態をアップデート
コントロールウィジェットの状態はホストアプリ側から更新を行うことができます。
reloadAllControls()
reloadAllControls()
を使用すると、アプリのすべてのコントロールの状態を更新することができます。
reloadAllControls()
reloadControls(ofKind:)
を使用すると、アプリの特定のコントロールの状態を更新することができます。ofKind
引数には、StaticControlConfiguration
またはAppIntentControlConfiguration
初期化時、kind
引数に指定した文字列を指定します。
二つの記事に分けて、「Extend your app’s controls across the system」セッションで公開されている内容を解説しました。本記事では解説していませんが、独自のApp Intentを用意すれば、コントロール経由であらゆる処理を行うことができます。ぜひ独自のApp Intentを開発してアプリの機能を拡張してみてください。
参考資料
・Extend your app’s controls across the system
Discussion