🌊

AppIntentControlValueProviderでエラーを投げたらどうなる

2024/10/07に公開

システム全体にアプリのコントロールを拡張で一言だけ言及があるのですが、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は取り除かれないかもしれず、その "しばらく経ってからの再チャレンジ "が "リロード" を意味するのかもしれないし、他にもいろんな条件で試してみないと分かりません。

GitHubで編集を提案

Discussion