AppIntentControlValueProviderでエラーを投げたらどうなる
システム全体にアプリのコントロールを拡張で一言だけ言及があるのですが、AppIntentControlValueProvider. currentValue(configuration:)でエラーをスローした場合、システムにControl Widgetをリロードする必要があることを通知できます。
ですが、どのような挙動になるか分からなかったので、サンプルを作って試しみてました。
検証内容
下記のコードを実行し、コントロールセンターへのControl Widget追加時に選択した対象オブジェクトを、ホストアプリ内で削除します。
currentValue
で存在しないオブジェクトを選択していた場合はエラーを投げるようにしているので、エラーが投げられたとき、どのような挙動をするか確かめます。
サンプルコード
currentValue
のguard節で削除済みのオブジェクトへのcontainsがfalse
になるのでNoSelectionError
が投げられます。
@available(iOSApplicationExtension 18.0, *)
struct ToggleStateControl: ControlWidget { (メインじゃないので割愛) }
@available(iOSApplicationExtension 18.0, *)
extension ToggleStateControl {
struct Value {
var isOn: Bool
var object: MyObject?
}
struct Provider: AppIntentControlValueProvider {
struct NoSelectionError: Error {}
func previewValue(configuration: ToggleStateConfiguration) -> Value {
ToggleStateControl.Value(isOn: false, object: nil)
}
func currentValue(configuration: ToggleStateConfiguration) async throws -> Value {
let objectSet = MyObjectSet().loadFromAppGroup()
guard let object, objectSet.contains(object) else {
throw NoSelectionError()
}
return ToggleStateControl.Value(isOn: object.isOn, object: object)
}
}
}
@available(iOS 18.0, *)
struct ToggleStateConfiguration: ControlConfigurationIntent {
static let title = "Configuration"
@Parameter(title:"Object")
var object: MyObject?
}
結果
ホストアプリで削除してからコントロールセンターを開くと、設定済みのControl Widgetがコントロールセンターから消えていました。
まとめ
AppIntentControlValueProvider. currentValue(configuration:)でエラーをスローした場合、今回のようなケースにおいては リロードとは「コントロールセンターからControl Widget自体が削除される」を指します。
ただし、他のケースでは異なった挙動をする可能性が十二分にあるため、ご注意ください。例えば、なんどかリトライして何回やってもダメな場合のみControl Widgetをコントロールセンターから取り除いているだけで、非同期処理で2回目のチャレンジで処理が成功したような場合はControl Widgetは取り除かれないかもしれず、その "しばらく経ってからの再チャレンジ "が "リロード" を意味するのかもしれないし、他にもいろんな条件で試してみないと分かりません。
Discussion