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
)