WidgetKit — apa itu, framework widget dan SwiftUI

Penulis: IT Sectr Diterbitkan: 2026-06-16 Waktu membaca: 9 mnt

WidgetKit — framework Apple, diperkenalkan di iOS 14, yang memungkinkan pengembang menempatkan widget dinamis di layar utama iPhone dan iPad, desktop Mac, serta tampilan jam Apple Watch. Widget menampilkan informasi penting tanpa membuka aplikasi — prakiraan cuaca, kurs mata uang, kalender, langkah. Menurut Apple Developer Documentation, 2026, WidgetKit memproses hingga 2 miliar pembaruan widget setiap hari di ekosistem Apple, menjadikannya salah satu framework yang paling banyak digunakan untuk menampilkan informasi di layar sistem.

Poin Utama

  • WidgetKit — framework untuk membuat widget di iOS 14+, iPadOS 14+, macOS 11+ dan watchOS 10+ dengan rendering melalui SwiftUI.
  • TimelineProvider — protokol yang menentukan kapan dan seberapa sering widget memperbarui kontennya berdasarkan TimelineEntry.
  • WidgetFamily — tiga ukuran (small, medium, large), masing-masing dapat dikonfigurasi secara terpisah oleh pengembang.
  • WidgetConfiguration — titik masuk ke widget, yang menentukan jenis konfigurasi (Static, Intent, AppEntity) dan keluarga ukuran.
  • Keterbatasan — widget tidak dianimasikan, tidak mendukung video, keyboard, dan pengguliran di dalamnya.

Apa itu WidgetKit dan bagaimana cara kerjanya?

WidgetKit — framework Apple untuk membuat widget yang menampilkan konten di layar sistem perangkat Apple. Widget adalah representasi miniatur dari aplikasi Anda yang ditempatkan pengguna di layar utama dalam mode goyangan (jiggle mode). Tidak seperti komplikasi watchOS yang sudah ada sebelum WidgetKit, framework baru ini menyatukan pembuatan widget untuk semua platform Apple melalui API tunggal di SwiftUI.

Prinsip kerja WidgetKit didasarkan pada TimelineProvider — objek yang membuat array terurut dari TimelineEntry, di mana setiap entri berisi Snapshot (status spesifik widget pada waktu tertentu). Sistem menampilkan entri secara berurutan, memperbarui widget saat beralih ke entri berikutnya pada garis waktu. Di antara entri, WidgetKit tidak memanggil kode aplikasi — waktu prosesor hanya dihabiskan saat membuat Timeline baru.

Menurut data WWDC 2024 Session „WidgetKit: What’s new”, rata-rata pengguna iOS memiliki 8–12 widget di layar utama, dan kategori terpopuler adalah cuaca, waktu, kalender, kebugaran, dan keuangan. WidgetKit mengonsumsi kurang dari 1% baterai per hari dalam penggunaan tipikal karena pembaruan terjadi sesuai jadwal, bukan secara real-time.

Apa yang membedakan WidgetKit dari Today Extension lama

Sebelum iOS 14, widget hanya ada dalam bentuk Today View — panel yang dapat diakses dengan menggeser ke kiri dari layar pertama. Today Extension memiliki keterbatasan serius: hanya tersedia di layar „Hari Ini”, memerlukan pembukaan aplikasi untuk memperbarui konten, dan memiliki dukungan ukuran yang terbatas. WidgetKit sepenuhnya menggantikan Today Extension, menyediakan widget di layar utama, layar kunci (iOS 16+), dan desktop Mac.

  • Widget di layar utama, tidak hanya di Today View
  • Pembaruan mandiri melalui TimelineProvider, tanpa membuka aplikasi
  • Tiga ukuran yang telah ditentukan sebelumnya, bukan satu
  • Smart Rotate dan Smart Stack — rotasi otomatis widget oleh sistem
  • API tunggal di SwiftUI untuk semua platform Apple

Arsitektur WidgetKit: TimelineProvider dan Entry

Arsitektur WidgetKit didasarkan pada tiga protokol kunci: TimelineProvider, TimelineEntry dan Widget. TimelineEntry adalah model data yang mewakili status widget pada waktu tertentu. TimelineProvider membuat array dari entri-entri tersebut (Timeline), dengan menentukan tanggal aktivasi untuk masing-masing. Widget — titik masuk yang menghubungkan penyedia dengan tampilan SwiftUI.

Metode getTimeline dipanggil oleh sistem saat pertama kali widget ditambahkan dan kemudian secara periodik — biasanya setiap 1–6 jam tergantung pada jenis penyedia. Timeline dapat berisi entri untuk jam atau hari ke depan, memungkinkan widget bekerja tanpa memanggil kode aplikasi di antara pembaruan. Jika widget perlu segera diperbarui (misalnya, kurs mata uang berubah), aplikasi dapat memanggil WidgetCenter.shared.reloadAllTimelines() secara paksa.

TimelineProvider Dasar

swift
struct SimpleEntry: TimelineEntry {
    let date: Date
    let value: Double
}

struct Provider: TimelineProvider {
    typealias Entry = SimpleEntry
    
    func placeholder(in context: Context) -> Entry {
        Entry(date: Date(), value: 0)
    }
    
    func getSnapshot(
        in context: Context,
        completion: @escaping (Entry) -> Void
    ) {
        Entry(date: Date(), value: 42.5)
    }
    
    func getTimeline(
        in context: Context,
        completion: @escaping (Timeline<Entry>, Error?) -> Void
    ) {
        let entry = Entry(date: Date(), value: fetchLatestValue())
        let nextUpdate = Calendar.current
            .date(byAdding: .hour, value: 1, to: Date())!
        let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
        completion(timeline, nil)
    }
}

Widget Family: small, medium, large

WidgetKit mendukung tiga ukuran widget, masing-masing dengan proporsi tetap. Small (170×170 pt di iPhone) menampilkan informasi kompak — satu nilai, ikon, atau teks pendek. Medium (364×170 pt) dua kali lebih lebar dari small dan cocok untuk menampilkan beberapa nilai atau grafik mini. Large (364×382 pt) menempati hampir setengah layar secara vertikal dan memungkinkan menampilkan tabel, daftar, atau data yang diperluas.

Pengembang harus mendukung setidaknya dua ukuran — Apple merekomendasikan small + medium. Widget Large hanya diperlukan jika aplikasi memiliki cukup konten untuk mengisi volume tersebut. Setiap ukuran mendapatkan tampilan SwiftUI sendiri yang dirender WidgetKit di layar sistem. Penting bahwa WidgetKit tidak mendukung ukuran kustom — hanya tiga ukuran tetap, yang menjamin keseragaman antarmuka.

Konfigurasi ukuran melalui WidgetConfiguration

swift
struct WeatherWidget: Widget {
    let kind: String = "WeatherWidget"
    
    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider()) { entry in
            WeatherWidgetView(entry: entry)
        }
        .configurationDisplayName("Weather")
        .description("Current temperature and forecast")
        .supportedFamilies([.systemSmall, .systemMedium])
    }
}

Jenis konfigurasi widget: Static dan Intent

WidgetKit menawarkan dua jenis konfigurasi — StaticConfiguration dan IntentConfiguration. StaticConfiguration cocok untuk widget yang menampilkan konten yang sama untuk semua pengguna: kurs mata uang, cuaca, kalender. IntentConfiguration memungkinkan pengguna menyesuaikan widget saat menambahkannya melalui sistem intent Siri — misalnya, memilih kota tertentu untuk cuaca atau ticker tertentu untuk harga saham.

IntentConfiguration menggunakan INWidgetIntent — subkelas dari INIntent dari SiriKit. Saat pengguna menambahkan widget dan memilih parameter (misalnya, kota), sistem menyimpan intent ini dan meneruskannya ke TimelineProvider pada setiap pembaruan. Penyedia menerima intent dalam metode getTimeline dan menggunakan parameternya untuk menghasilkan konten. IntentConfiguration adalah metode yang lebih disukai untuk widget yang dipersonalisasi karena terintegrasi dengan Siri dan Shortcuts.

IntentConfiguration dengan pemilihan parameter

swift
struct WeatherWidgetEntryView: View {
    var entry: WeatherEntry
    
    var body: some View {
        VStack(alignment: .leading) {
            Text(entry.cityName)
                .font(.caption)
                .foregroundColor(.secondary)
            Text("\(entry.temperature)°C")
                .font(.largeTitle)
        }
    }
}

struct WeatherWidget: Widget {
    var body: some WidgetConfiguration {
        IntentConfiguration(
            kind: "WeatherWidget",
            intent: WeatherConfigIntent.self,
            provider: WeatherTimelineProvider()
        ) { entry in
            WeatherWidgetEntryView(entry: entry)
        }
    }
}

Membuat widget di SwiftUI: contoh langkah demi langkah

Pembuatan widget dimulai dengan menambahkan Widget Extension Target di Xcode: File → New → Target → Widget Extension. Xcode secara otomatis menghasilkan struktur dengan TimelineEntry, TimelineProvider, dan WidgetConfiguration. Pengembang hanya perlu mengimplementasikan tampilan SwiftUI untuk menampilkan data dan mengonfigurasi penyedia untuk jadwal pembaruan yang benar.

Di bawah ini — contoh lengkap widget sederhana untuk menampilkan harga bitcoin saat ini: Provider memuat harga melalui URLSession dan membuat Timeline dengan pembaruan setiap jam. WidgetSwiftUIView menampilkan harga dengan font besar dan waktu pembaruan terakhir dengan font kecil.

swift
struct BTCPriceEntry: TimelineEntry {
    let date: Date
    let price: Double
    let change24h: Double
}

struct BTCWidgetEntryView: View {
    var entry: BTCPriceEntry
    
    var body: some View {
        VStack {
            Text("BTC/USD").font(.caption)
            Text("$\(entry.price, specifier: "%.0f")")
                .font(.title2).fontWeight(.bold)
            Text(entry.change24h > 0 ? "+" : "")
        }
    }
}

Widget layar kunci iOS 16+

Mulai iOS 16, WidgetKit memperluas dukungan ke Lock Screen — layar kunci iPhone. Widget Lock Screen terdiri dari dua jenis: inline (satu baris teks di bawah jam) dan rectangular (area persegi panjang). Tidak seperti widget Home Screen, widget Lock Screen lebih sering diperbarui — pemicu sistem memungkinkan pembaruan setiap 15–30 menit untuk menampilkan informasi terkini tanpa membuka kunci ponsel.

Widget Lock Screen memerlukan konfigurasi terpisah melalui WidgetConfiguration dengan accessoryFamilies: accessoryCircular, accessoryRectangular, accessoryInline. Keluarga ini memiliki batasan ketat pada ukuran dan konten — mereka tidak mendukung gambar, animasi, dan font kustom. Apple merekomendasikan hanya menggunakan informasi teks dan ikon sistem SF Symbols untuk widget Lock Screen.

  • accessoryCircular — widget bundar kompak untuk tempat di bawah jam
  • accessoryRectangular — widget persegi panjang untuk area di atas jam
  • accessoryInline — teks satu baris di bawah waktu, ukuran minimal
  • Batasan: hanya teks, SF Symbols, gradien; tanpa gambar dan video

Best practices dan keterbatasan WidgetKit

Saat mengembangkan widget, penting untuk mempertimbangkan keterbatasan WidgetKit. Widget adalah tampilan hanya-baca: mereka tidak memproses peristiwa sentuh (kecuali sentuhan yang membuka aplikasi). Widget tidak mendukung animasi, video, input keyboard, pengguliran, atau elemen interaktif. Setiap widget adalah snapshot statis data pada waktu tertentu, dan upaya menambahkan interaktivitas akan menyebabkan penolakan aplikasi di App Store.

Praktik terbaik mencakup Widget Center untuk pembaruan paksa, penyimpanan cache data di tingkat TimelineProvider untuk respons cepat, dan penggunaan placeholder untuk status awal. Juga penting untuk mendukung beberapa ukuran — pengguna mengharapkan widget tersedia dalam varian small maupun medium. Hindari menampilkan data yang tidak akurat atau usang — pengguna mengingat informasi yang salah dari widget untuk waktu yang lama.

Keterbatasan WidgetKit dalam tabel

Apa yang tidak bisaMengapa
Animasi dan videoWidget adalah snapshot statis; animasi menghabiskan baterai
InteraktivitasWidgetKit tidak mendukung elemen UI selain tautan ke aplikasi
PengguliranUkuran tetap tanpa pengguliran
KeyboardInput teks dalam widget tidak mungkin
Data langsungData diperbarui sesuai jadwal Timeline, tidak secara real-time
Ukuran kustomHanya small, medium, large, accessory* tetap

Pertanyaan yang Sering Diajukan

Bisakah membuat satu widget untuk iOS dan macOS?

Ya, WidgetKit lintas platform. Widget Extension yang sama dapat disertakan dalam target iOS, iPadOS, dan macOS dengan kode SwiftUI yang seragam. Perbedaan hanya muncul pada Family yang didukung — di Mac tidak ada accessoryRectangular.

Seberapa sering WidgetKit memperbarui widget?

Sesuai jadwal Timeline. Pengembang menentukan kapan pembaruan berikutnya akan terjadi — dalam satu menit atau satu hari. Sistem juga dapat mempercepat pembaruan untuk widget yang sering digunakan.

Bisakah menambahkan tombol ke widget?

Tidak, WidgetKit tidak mendukung UIButton atau elemen interaktif apa pun. Satu-satunya tindakan adalah menyentuh widget, yang membuka aplikasi melalui deep link.

Bagaimana cara memaksa pembaruan widget dari aplikasi?

Gunakan WidgetCenter.shared.reloadAllTimelines() atau reloadTimelines(ofKind:) untuk widget tertentu. Panggilan dari aplikasi segera meminta Timeline baru dari penyedia.

Apakah widget memengaruhi masa pakai baterai?

Minimal — kurang dari 1% daya per hari dalam penggunaan tipikal. WidgetKit membatasi pembaruan latar belakang dan tidak membuat aplikasi tetap aktif. Biaya utama adalah pembuatan Timeline saat penambahan pertama.

Ringkasan

  • WidgetKit — framework Apple untuk widget di iOS 14+, iPadOS 14+, macOS 11+ dan watchOS 10+, menggunakan SwiftUI untuk menampilkan konten.
  • TimelineProvider mengelola jadwal pembaruan melalui array TimelineEntry, yang masing-masing mewakili status widget pada waktu tertentu.
  • Widget Family mencakup tiga ukuran — small, medium, large — dan keluarga accessory untuk layar kunci iOS 16+.
  • StaticConfiguration cocok untuk konten yang sama di semua pengguna, IntentConfiguration — untuk widget yang dipersonalisasi dengan pengaturan.
  • Widget bersifat statis — tanpa animasi, interaktivitas, pengguliran, dan video; hanya tampilan data baca-saja.
  • Widget Lock Screen (iOS 16+) adalah accessoryCircular, accessoryRectangular, dan accessoryInline dengan batasan konten.
  • Pembaruan paksa melalui WidgetCenter.shared.reloadAllTimelines() memungkinkan permintaan segera Timeline baru.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga