🎮

【iOS 18】コントロールウィジェットの導入 (応用編)

2024/06/20に公開

前回の記事では、アプリにコントロールウィジェットを追加する方法と、主要なプロトコルおよび構造体について解説しました。
https://zenn.dev/naoya_maeda/articles/b5e13101cdf904

本記事では、前回の記事に引き続き「Extend your app’s controls across the system」セッションで公開されている内容を解説します。
https://developer.apple.com/jp/videos/play/wwdc2024/10157/

前回の記事とあわせてお読みいただくことで、実際にアプリで動作確認を行いながら、「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 プロトコルに準拠する構造体が持つpreviewValuecurrentValue経由で入力されたパラメータを受け取ることができます。

コントロールウィジェットの状態をアップデート

コントロールウィジェットの状態はホストアプリ側から更新を行うことができます。

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
https://developer.apple.com/jp/videos/play/wwdc2024/10157/

Discussion