Widget Code-Along 2 – 異なるタイムライン – WWDC2020

Session概要

パート1 から続けて、異なるタイムラインに進む方法について。
あなたのWidgetにシステムインテリジェンスを組み込み、1日の中での特別なタイミングでダイナミックに変化させて、もっとも関連性の高い情報を表示する方法を見つけましょう。
コアとなるタイムラインのコンセプト、複数Widgetのファミリー(サイズ)をサポートする方法、Widgetを設定可能とする方法について https://developer.apple.com/videos/play/wwdc2020/10035/

Widgetのファミリーについて

WidgetKitには3つのファミリーがある
  1. .systemSmall
  2. .systemMedium
  3. .systemLarge
  • Widget側ではsupportedFamilies モディファイアにサポートするサイズを設定する
  • Widgetの元のViewにはWidgetKitが提供するWidgetFamily環境変数を使用する
    • @Environment(\.widgetFamily) var family

タイムラインとその更新方法

  • WidgetのエンジンはTimelineProviderである
  • パート1ではプロバイダからエントリーを一つだけ返したが、複数返すことも可能
    • 重要なのは最後にどうなるか

エントリーの更新方法

  • TimelineReloadPolicy を利用する
    • atEnd
      • タイムラインの最後のエントリーが表示された時、更新のスケジュールを開始することをWidgetKitに伝える
      • 伝えられたら、タイムラインメソッドが再度呼び出されることでさらなるエントリーを返すことが可能となる
    • after(date)
      • 指示された日時に更新のスケジュールを開始することをWidgetKitに伝える
      • 例えば、10:00 PMに更新する設定とした場合、タイムラインの他のエントリーが、先または前にあるかに関係なく午後10時に更新をスケジューリングする
    • never
      • システム単独ではWidgetを更新しない
      • Widget Center APIを通して、手動でリロードするタイミングを指示する必要がある



システムでは同時に多数のタイムラインがアクティブになっており、個別のリロードポリシーがあります。
そのため、より早いタイミングでWidgetを更新するためシステムは賢く更新をスケジューリングする。すなわち、「atEnd」と「after」を設定している場合、より早い方の時間でリフレッシュされることを意味する

Widgetをユーザが構成できるようにする方法

  • Widgetはホーム画面で構成できるよう設定可能
  • WidgetKitの構成にはSiriKitを使用する
    • すなわち、インテリジェントシステムにWidgetが適合している
  • 構成のコアテクノロジーは、カスタムインテントに重点を置くINIntents
  • 新しくIntentを追加するには、ファイル作成時にSiriKit Intent Definition Fileを指定して追加する
  • Intent定義ファイルでの設定必須フィールド
    • カテゴリ
      • Information → Viewを選択
    • IntentがWidgetであることを示すために、Widgetsのチェックボックスにチェックをつける

WidgetでIntent定義ファイルを使用して、カスタマイズする

  • Widgetのタイプを StaticConfiguration になっている場合は、IntentConfiguration に変更する
    • IntentConfigurationには対応する IntentTimelineProviderが必要
    • TimelineProviderプロトコルに準拠していた場合は、IntentTimelineProviderに変更する
      • IntentTimelineProviderではsnapshotとtimelineメソッドに追加の引数を1つ渡す(configuration)
  • 上記設定を行うことで、ホーム画面のWidget → Widget編集からユーザがカスタマイズ可能となる

Widgetとアプリのコンテンツをリンクする方法

  • Widgetにはアニメーションやカスタムインタラクションはないが、ディープリンクを設定可能
  • systemMedium、systemLargeでは新しいSwiftUIリンクAPIを使用してWidget内にタップ可能なゾーンを複数作成可能
    • systemSmallはViewの全てが一つのタップエリア
  • ViewにwidgetURLモディファイアを追加することで、対象のアプリにジャンプ(直接移動)することが可能

最新情報をチェックしよう!