Live Activity — widget dinamis di layar kunci iPhone dan Dynamic Island yang menampilkan informasi secara waktu nyata: status pengiriman, skor olahraga, timer, dan pemutaran musik. Diimplementasikan melalui ActivityKit (Swift, iOS 16.1+) bersama WidgetKit. Live Activity diperbarui secara lokal atau melalui notifikasi push, mendukung beberapa status, dan diakhiri oleh sistem setelah acara selesai. Selengkapnya di ActivityKit Documentation.
Poin utama
Live Activity — ekstensi WidgetKit yang menampilkan konten dinamis di layar kunci iPhone dan Dynamic Island. Tidak seperti widget statis yang diperbarui berdasarkan timer sistem, Live Activity dimulai oleh aplikasi dan hidup dalam waktu terbatas — hingga 8 jam untuk Activity aktif dan hingga 4 jam setelah selesai. Pengguna melihat data terkini tanpa membuka kunci perangkat: status pesanan pengiriman, jarak ke tujuan di taksi, hasil pertandingan, atau kemajuan latihan.
ActivityKit — framework untuk bekerja dengan Live Activities, diperkenalkan di iOS 16.1. Menyediakan API untuk meminta, memperbarui, dan mengakhiri Activity. Activity adalah objek dengan konten dan status. Konten (ActivityContent) mendefinisikan data statis, sedangkan status (ActivityState) — data dinamis yang berubah seiring waktu. Sistem sendiri yang memutuskan kapan merender status baru — ini menghemat baterai dan memastikan animasi yang mulus.
Setiap Live Activity diidentifikasi secara unik oleh ActivityID dan terikat pada satu proses — aplikasi yang membuatnya. Sistem dapat mengakhiri Activity saat memori tidak mencukupi atau baterai rendah. Pengembang mendapat pemberitahuan tentang penghentian paksa melalui delegasi ActivityKit dan dapat menyimpan status terakhir untuk pemulihan.
Arsitektur Live Activity dibangun di atas dua framework: WidgetKit bertanggung jawab untuk merender tampilan SwiftUI, ActivityKit — untuk siklus hidup Activity. Pengembang membuat WidgetBundle dengan dukungan LiveActivityConfiguration. Setiap konfigurasi menentukan tipe data (Attributes dan State) dan SwiftUI View yang dirender oleh sistem di Lock Screen dan Dynamic Island. Data ditransfer melalui ActivityAttributes — struct dengan bidang let untuk konten dan var untuk status.
| Komponen | Fungsi | API |
|---|---|---|
| Attributes | Data statis seluruh Activity | let name: String, let icon: String |
| ContentState | Status dinamis yang berubah saat pembaruan | var progress: Double, var status: Status |
| Activity | Objek permintaan dan pengelolaan Activity | Activity.request(attributes:content:) |
| PushToken | Token untuk pembaruan push server | activity.pushToken publisher |
| ActivityUI | SwiftUI View untuk Lock Screen dan Dynamic Island | LockScreenView, ExpandedView, CompactView |
Siklus hidup Activity mencakup tiga fase: aktif (sistem menampilkan dan memperbarui), final (aktivitas selesai tetapi UI masih terlihat 4 jam), dihapus (sistem menghapus UI). Aplikasi dapat mengakhiri Activity kapan saja. Sistem juga mengakhiri Activity secara paksa — misalnya, saat perangkat di-restart atau batas 8 jam terlampaui.
import ActivityKit
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable & Hashable {
var status: DeliveryStatus
var estimatedMinutes: Int
}
var orderNumber: String
var restaurantName: String
}
WidgetBundle mendaftarkan Live Activity melalui makro @main: widget mengembalikan daftar konfigurasi, termasuk LiveActivityConfiguration. Berdasarkan konfigurasi ini, sistem tahu tipe data apa yang diharapkan dan cara merender UI dalam berbagai status — kompak, minimal, dan diperluas untuk Dynamic Island.
Membuat Activity dimulai dengan permintaan ke ActivityKit. Aplikasi memanggil Activity.request(attributes:content:pushType:) dengan data awal. Sistem memeriksa apakah Dynamic Island tersedia di perangkat dan mengembalikan objek Activity. Permintaan bisa gagal jika batas Activity aktif terlampaui — biasanya tidak lebih dari 5 secara bersamaan. Setelah permintaan berhasil, sistem menampilkan widget di Lock Screen dan, jika memungkinkan, di Dynamic Island.
let attributes = DeliveryAttributes(
orderNumber: "A-1234",
restaurantName: "Pizza House"
)
let initialState = DeliveryAttributes.ContentState(
status: DeliveryStatus.preparing,
estimatedMinutes: 30
)
do {
let activity = try await Activity<DeliveryAttributes>.request(
attributes: attributes,
content: ActivityContent(state: initialState, staleDate: nil),
pushType: .token
)
print("Activity started: \(activity.id)")
} catch {
print("Failed: \(error)")
}
SwiftUI View untuk Live Activity menggunakan struktur LockScreenView, ExpandedView, dan CompactView dari WidgetKit. View menerima konteks (ActivityViewContext) dengan atribut dan status saat ini. Pembaruan View terjadi secara otomatis saat menerima status baru dari sistem. Live Activity hanya mendukung serangkaian komponen SwiftUI terbatas — Text, Image, HStack, VStack, dan beberapa pengubah.
Setiap Live Activity View harus ringan dan cepat — sistem menolak merender tampilan yang berat. Batas waktu rendering — 30 ms per frame. Animasi terbatas pada transisi sistem antar status — animasi kustom tidak tersedia di Live Activity. Rendering dilakukan di latar belakang oleh proses WidgetKit dengan prioritas responsivitas Lock Screen.
Pembaruan lokal — aplikasi memperbarui status Activity dengan memanggil activity.update(using:). Metode ini menerima ContentState baru dan AlertConfiguration opsional untuk menampilkan notifikasi saat pembaruan. Pembaruan lokal cepat — sistem menggambar ulang View pada siklus rendering berikutnya, biasanya dalam 1–2 detik. Untuk pembaruan sering (timer, stopwatch) gunakan mode lokal — ini lebih andal dan lebih cepat daripada push.
let updatedState = DeliveryAttributes.ContentState(
status: DeliveryStatus.outForDelivery,
estimatedMinutes: 10
)
await activity.update(
ActivityContent<DeliveryAttributes.ContentState>(
state: updatedState,
staleDate: Date().addingTimeInterval(60)
),
alertConfiguration: AlertConfiguration(
title: "Order out for delivery",
body: "Arriving in 10 min"
)
)
Pembaruan push — server mengirim notifikasi push ActivityKit dengan status baru dalam format JSON. Untuk ini, aplikasi mendapatkan pushToken dari activity.pushToken publisher dan meneruskannya ke server. Server mengirim permintaan POST ke APNs dengan payload berisi ContentState baru. Sistem menerima push, mendekode status, dan memperbarui Live Activity tanpa partisipasi aplikasi — ini memungkinkan Activity diperbarui bahkan saat aplikasi ditutup.
Pembaruan push lebih hemat daripada lokal untuk pembaruan jarang (status pengiriman setiap 5–10 menit) — aplikasi tidak perlu menjaga koneksi jaringan. Untuk pembaruan sering setiap 1–2 detik gunakan metode lokal. Payload server hanya berisi bidang ContentState yang dapat diubah — data statis Attributes hanya dikirim saat pembuatan Activity.
Dynamic Island — area perangkat keras-perangkat lunak di iPhone 14 Pro, 15 Pro, dan lebih baru yang beradaptasi dengan konten Live Activity. Sistem secara otomatis menampilkan Activity dalam tiga mode: kompak (ikon + teks pendek di sebelah kiri potongan), minimal (hanya ikon), dan diperluas (persegi panjang 300pt dengan informasi). Pengembang tidak mengelola mode ini secara langsung — sistem memilih mode berdasarkan prioritas dan ruang yang tersedia.
struct DeliveryLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: DeliveryAttributes.self) { context in
LockScreenView(context: context)
} dynamicIsland: { context in
DynamicIsland {
DynamicIslandExpandedContent {
ExpandedView(context: context)
}
} compactLeading: {
CompactLeadingView(context: context)
} compactTrailing: {
CompactTrailingView(context: context)
} minimal: {
MinimalView(context: context)
}
}
}
}
Dynamic Island mendukung interaktivitas — pengguna mengetuk area dan masuk ke aplikasi atau membuka tampilan diperluas. Mengetuk mode kompak beralih ke mode diperluas, dan menggeser ke kiri menyembunyikan Activity ke mode minimal. Tombol dalam mode diperluas (pause/cancel) ditangani melalui Link dari SwiftUI — sistem meluncurkan aplikasi dengan URL deep link, penanganan dilakukan di UIApplicationDelegate.
Batasan Dynamic Island: lebar mode diperluas — hingga 300pt, teks kompak — hingga 30 karakter. Warna dan font sesuai dengan tema sistem — kustomisasi terbatas. Animasi transisi antar mode bersifat sistemik dan tidak dapat dikonfigurasi. Jika beberapa aplikasi memiliki Activity aktif, Dynamic Island menampilkannya dengan prioritas berdasarkan waktu mulai dan jenis konten.
Pertanyaan yang sering diajukan
Widget biasa WidgetKit menampilkan informasi statis dan diperbarui berdasarkan timer sistem dengan interval minimal 15–30 menit. Live Activity menampilkan data dinamis secara waktu nyata di layar kunci dan Dynamic Island. Live Activity dimulai oleh aplikasi, hidup hingga 8 jam, dan diakhiri oleh sistem setelah acara selesai, tidak seperti widget yang ada secara permanen.
Live Activity mendukung dua mode pembaruan: lokal — aplikasi memperbarui status melalui API ActivityKit kapan saja, dan push — server mengirim notifikasi push ActivityKit yang sistem ubah menjadi status widget baru. Saat baterai rendah, sistem dapat membekukan Live Activity hingga pengisi daya terhubung.
Live Activities tersedia di iPhone dengan iOS 16.1 dan lebih baru. Di iPhone 14 Pro dan lebih baru, Live Activity juga ditampilkan di Dynamic Island. Di iPad, Live Activity hanya didukung di layar kunci — Dynamic Island tidak ada di iPad. Apple Watch tidak mendukung Live Activities secara langsung, tetapi dapat menampilkan notifikasi penyelesaian.
Sistem membatasi jumlah Live Activities aktif — biasanya tidak lebih dari 5 secara bersamaan untuk semua aplikasi. Saat mencoba melebihi batas, ActivityKit mengembalikan kesalahan. Setiap Live Activity dapat memiliki beberapa status — misalnya, menunggu, dalam perjalanan, terkirim untuk pesanan makanan. Setelah selesai, Activity tetap di UI selama 4 jam.
Ya, aplikasi harus meminta izin untuk mengirim notifikasi — Live Activity menggunakan saluran notifikasi sistem. Pengguna dapat menonaktifkan Live Activity untuk aplikasi tertentu di pengaturan. Saat pertama kali dijalankan, ActivityKit menampilkan dialog permintaan izin. Tanpa izin, permintaan Activity gagal dengan kesalahan.
Kesimpulan
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.
Baca juga