Section 3/141 menit

3. Teori: Cara Kerja Timeline dan Widget Rendering

3. Teori: Cara Kerja Timeline dan Widget Rendering

Model Rendering Berbasis Snapshot

Widget tidak berjalan terus-menerus. Sistem bekerja seperti ini:

swift
App Anda (WidgetExtension target)
    ↓
getTimeline() dipanggil oleh sistem
    ↓
Anda mengembalikan array TimelineEntry
(misal: 24 entry, satu per jam)
    ↓
WidgetKit merender SwiftUI view untuk SETIAP entry
dan menyimpannya sebagai snapshot/image
    ↓
Sistem menampilkan snapshot yang tepat sesuai waktu
(tanpa menjalankan kode Anda lagi)
    ↓
Pada waktu yang ditentukan policy, getTimeline() dipanggil lagi

Implikasi penting: view Anda dirender di luar proses app utama, di proses WidgetKit milik sistem. Ini berarti:

  • Tidak bisa akses UserDefaults.standard — harus gunakan App Group
  • Tidak bisa shared state dengan app — gunakan @AppStorage dengan suite, atau file bersama
  • Network request harus selesai sebelum completion() dipanggil dalam getTimeline

Timeline Policy

swift
Timeline Policy mengontrol kapan WidgetKit akan request timeline baru:

.atEnd       Minta timeline baru setelah entry terakhir berlalu
              Cocok untuk: konten yang refresh berkala (cuaca, berita)

.after(date)  Minta timeline baru pada tanggal tertentu di masa depan
              Cocok untuk: jadwal yang diketahui (countdown event)

.never       Jangan refresh otomatis  app harus panggil WidgetCenter.shared.reloadTimelines()
              Cocok untuk: data yang hanya berubah saat user interact dengan app

Batasan Widget

  • Runtime: getTimeline() harus mengembalikan data dalam waktu terbatas (sistem kill jika terlalu lama)
  • Memory: Sangat terbatas — hindari gambar besar atau operasi berat
  • Network: Bisa melakukan network request di getTimeline(), tapi harus async dengan getTimeline(in:completion:) biasa atau menggunakan TimelineProvider yang mendukung async
  • Refresh rate: Apple membatasi seberapa sering widget bisa refresh untuk menjaga battery. Jangan asumsi refresh bisa terjadi setiap menit.