iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

iOS14 Widget Configuration まとめ1

今回は前回の iOS14 Widget の記事に続き、Widget Configuration に関して、下記の WWDC2020 セッションから得た知見をまとめていこうかと思います。また、1日で全ての内容をまとめる時間がなかったため、Part1・Part2 の二部構成でまとめていきたいと思います。

developer.apple.com

目次

Part1 では、下記の内容をまとめます。

  • Widget を Configurable にする方法の基本
  • ユーザに入力を求めることができる情報のタイプおよび、データのインターフェース

Widget を Configurable にする方法の基本

Widget を Configurable にすると、何をシステムに表示するか Widget の裏側でユーザが選択できるオプションの内容を指定することができます。また、これらの選択事項は "パラメーター" と呼ばれます。

どのパラメーターを表示するか定義するには Intents を使用します。これらは、Siri や Shorcuts のサポートをアプリケーションに追加する際と同様のものです。Intents には指定されたパラメータのリストが含まれます。Intents に入れた各パラメータは Widget の configuration UI で1つの行として表示されます。

f:id:yum_fishing:20201020191646p:plain

Xcode内で Intents は、Intent Definition File を使用して定義できます。このファイルには、Intent パラメーター、そしてそれらがシステムのどの部分をサポートするかが記述されています。このファイルをアプリケーションにコンパイルすると、システムは Intents の情報を読み出すことができます。Intents が定義できたら、Xcode が Intents Class も生成します。この Intents Class のインスタンス は、ラインタイムに Widget Extension に渡されます。

f:id:yum_fishing:20201020191740p:plainf:id:yum_fishing:20201020192106p:plain

前回の Widget の記事でも少し触れましたが、Widget を Configurable にするには、IntentConfiguration を使用する必要があります。また、そのための最初の一歩として Widget を設定するのに使用する Intent を定義する必要があります。Xcode の Intent Definition File 内で Custom Intents を定義できます。

ユーザに入力を求めることができる情報のタイプおよび、データのインターフェース

Intents の定義に基づいて Widget の UI が構築されます。

タイプとして "String" を設定すると、Configuration UI は TextField を表示します。そして、"Boolean" パラメータには Switch を表示します。Configuration UI は様々な入力方法の数値もサポートしています。"Integer" については数値フィールドと増減ボタンがサポートされています。小数については数値フィールドと増減スライダーがサポートされています。また、Configuration UI は連絡先と場所の選択もサポートしています。

f:id:yum_fishing:20201020192407p:plain

また、Configuration UI は一覧表からの選択もサポートしています。このリストは静的なもの、またはアプリケーションからの動的なものの両方をサポートしています。

f:id:yum_fishing:20201020192527p:plain

パラメーターは Array 値もサポートします。例えば Widget がカレンダーからのイベントの一覧を表示する場合、Intent が複数のカレンダー項目を選択するのをサポートするように設定できます。iOS14 の新機能として Intent が固定サイズの配列をサポートしました。これは Widget が決まった数の項目を表示することをサポートする場合に役に立ちます。これにより、ユーザは決まった数を超える項目を配列に追加できないようになります。Intent Editor で項目数を Widget Family 別に設定できます。

Dynamic Options と検索

多くのケースでは、Widget Configuration で表示したいデータは人によって異なります。そのため、Intent Definition File で事前に指定することができません。Intent のいずれかのパラメーターに対し、Dynamic Option を有効にするには、Xcode 内でパラメーターの Dynamic Options チェックボックスをオンにします。

Dynamic Options を有効にすると、好きな値を入力できるようにするのではなく、選択できる可能性がある値をアプリケーションと相談して取得するようシステムに指示します。

動的オプションを有効にすると下記の2つのが Configuration UI で更新されます。まず Widget の裏側でパラメーターの見た目が変わります。モードに応じた選択しのリストを開くボタンになります。

  • Widget の裏側でパラメータの見た目が変わる
  • モードに応じた選択肢のリストを開くボタンになる

次に、アプリケーション内で2つのメソッドを生成します。可能性のある選択肢のリストと初期値です。これらのメソッドは Intent handler Protocol の一部分で Xcode が生成します。アプリケーション内か Intent extension のいずれかで、この Protocol に準拠したクラスを作成する必要があります。ユーザが Widget を設定する時、そのクラスに対してシステムが可能性のある選択肢を提供するよう請求します。また、セクションでリストを分けるようなことも可能です。

func provideCardOptionsCollection(for intent: ViewRecentPurchasesIntent, with completion: (INObjectCollection<IntentCard>?), Error?) -> Void)

func defaultCard(for intent: ViewRecentPurchasesIntent) -> IntentCard?

リストの数が多い場合は、ユーザが打ち込んだデータに応じた検索結果を提供できます。これらの結果には動的に提供される標準選択肢以外の選択肢を含めることができます。

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com