Section 2/141 menit
2. Masalah yang Dipecahkan
2. Masalah yang Dipecahkan
Masalah 1: Informasi Penting Tersembunyi di Balik App Icon
Pengguna harus membuka app hanya untuk melihat informasi seperti cuaca, tugas hari ini, atau harga saham.
swift
// ❌ TANPA WidgetKit: pengguna wajib buka app untuk lihat progress
// Tidak ada cara menampilkan data di Home Screen
// App icon tidak menyampaikan informasi apapun
class HabitViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
updateProgressUI() // Hanya terlihat setelah buka app
}
}
swift
// ✓ DENGAN WidgetKit: progress habit langsung terlihat di Home Screen
struct HabitEntry: TimelineEntry {
let date: Date
let completedToday: Int
let totalHabits: Int
}
struct HabitWidgetView: View {
let entry: HabitEntry
var body: some View {
VStack {
Text("\(entry.completedToday)/\(entry.totalHabits)")
.font(.largeTitle.bold())
Text("Habit hari ini")
.font(.caption)
}
.containerBackground(.fill.tertiary, for: .widget)
}
}
Masalah 2: Today View Extensions Lama Tidak Efisien
Sebelum iOS 14, Today Widgets berbasis UIKit memerlukan view controller penuh dan berjalan sebagai proses aktif — boros memori dan tidak konsisten.
swift
// ❌ TANPA WidgetKit (Today Extension lama): berjalan sebagai proses aktif
// NCWidgetProviding — deprecated dan dihapus di iOS 17
class TodayViewController: UIViewController, NCWidgetProviding {
func widgetPerformUpdate(completionHandler: @escaping (NCUpdateResult) -> Void) {
// Proses berjalan aktif, boros resource
fetchData { result in
self.updateUI(with: result)
completionHandler(.newData)
}
}
}
swift
// ✓ DENGAN WidgetKit: snapshot-based, tidak boros resource
struct SimpleProvider: TimelineProvider {
func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) {
// Sediakan data untuk beberapa jam ke depan — sistem yang atur kapan render
let entries = generateEntries()
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
}
Masalah 3: Tidak Ada Cara Update Real-Time untuk Event Berjalan (Live Activities)
Sebelum iOS 16.1, tidak ada cara menyampaikan update real-time (olahraga, pengiriman makanan) di Lock Screen tanpa pengguna membuka app.
swift
// ❌ TANPA Live Activities: pengguna harus buka app untuk lihat skor terkini
// Push notification = interruptif, pengguna tidak mau notif tiap menit
func sendScoreUpdate(score: String) {
let content = UNMutableNotificationContent()
content.title = "Update Skor"
content.body = score
// Spam notifikasi tidak nyaman untuk pengguna
}
swift
// ✓ DENGAN Live Activities: skor terupdate di Lock Screen dan Dynamic Island
import ActivityKit
struct FootballActivityAttributes: ActivityAttributes {
struct ContentState: Codable, Hashable {
var homeScore: Int
var awayScore: Int
var minute: Int
}
var homeTeam: String
var awayTeam: String
}
// Update dari server via push atau dari app
try await Activity<FootballActivityAttributes>.request(
attributes: attributes,
contentState: initialState
)