【Widget入門】TimelineEntryプロトコルとは?

この記事は約5分で読めます。

TimelineEntryプロトコルは、SwiftUIのウィジェット開発で使用されるプロトコルです。

このプロトコルに準拠した構造体は、ウィジェットが表示するデータの単位(エントリ)を表します。
TimelineEntryには、ウィジェットが表示される日時を表すdateプロパティが含まれており、これを基にウィジェットの内容が更新されます。

  • iOS:14.0以上
  • XCode(当サイトの環境):15.0.1

構造

struct MyWidgetEntry: TimelineEntry {
    let date: Date
    let value: String
}

上記の例では、MyWidgetEntryTimelineEntryに準拠し、datevalueの2つのプロパティを持っています。

ここで、dateはウィジェットの更新タイミングを指定し、valueは表示されるデータです。
このように、必要に応じて他のプロパティを追加することで、ウィジェットが表示する情報を柔軟に拡張できます。

TimelineEntryの使い方

TimelineEntryを使用する際、TimelineProviderと共に使われることが多いです。
TimelineProviderは複数のTimelineEntryを生成し、それをタイムラインとしてウィジェットに渡します。
このタイムラインによってウィジェットがどのタイミングで更新されるかが決まります。

TimelineEntryの使い方をもう少し詳しく解説します。

TimelineProviderとの連携

TimelineEntryは通常、TimelineProviderと一緒に使われます。
TimelineProviderはウィジェットのデータを生成し、それをタイムラインとして提供します。

struct MyTimelineProvider: TimelineProvider {
    func placeholder(in context: Context) -> MyWidgetEntry {
        MyWidgetEntry(date: Date(), value: "Loading...")
    }

    func getSnapshot(in context: Context, completion: @escaping (MyWidgetEntry) -> ()) {
        let entry = MyWidgetEntry(date: Date(), value: "Snapshot Value")
        completion(entry)
    }

    func getTimeline(in context: Context, completion: @escaping (Timeline<MyWidgetEntry>) -> ()) {
        var entries: [MyWidgetEntry] = []

        let currentDate = Date()
        for hourOffset in 0..<5 {
            let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
            let entry = MyWidgetEntry(date: entryDate, value: "Value \(hourOffset)")
            entries.append(entry)
        }

        let timeline = Timeline(entries: entries, policy: .atEnd)
        completion(timeline)
    }
}

getTimelineメソッド

getTimelineメソッドは、複数のTimelineEntryを生成し、ウィジェットが定期的に更新されるようにします。
上記の例では、現在の時間から1時間ごとに5回のエントリを作成しています。

タイムラインの表示

生成されたTimelineEntryは、ウィジェットのbodyで使用され、更新タイミングに応じて表示内容が変わります。

struct MyWidgetEntryView: View {
    var entry: MyTimelineProvider.Entry

    var body: some View {
        Text(entry.value)
    }
}

タイムラインのポリシー

Timelineにはpolicyがあります。policyは、ウィジェットが更新をリクエストするタイミングを制御します。
例えば、.atEndはタイムラインが終了したときに次の更新をリクエストします。

まとめ

  • TimelineEntryは、ウィジェットで表示されるデータを定義するために使います。
  • TimelineProviderと連携して、定期的な更新を設定します。
  • 複数のプロパティを持たせることで、ウィジェットの内容をカスタマイズできます。

TimelineEntryを使うことで、定期的に更新される動的なウィジェットを実装できます。

タイトルとURLをコピーしました