Section 9/141 menit

9. Deep Linking ke Main App

9. Deep Linking ke Main App

Widget harus bisa membuka bagian spesifik di app ketika di-tap.

widgetURL untuk Seluruh Widget

swift
struct HabitWidgetView: View {
    let entry: HabitEntry

    var body: some View {
        VStack {
            Text(entry.habitName)
            Text("Streak: \(entry.streak)")
        }
        .containerBackground(.fill.tertiary, for: .widget)
        // Seluruh widget menjadi tapable, membuka URL ini
        .widgetURL(URL(string: "myapp://habit/\(entry.habitID)"))
    }
}
swift
struct MediumHabitView: View {
    let entry: HabitEntry

    var body: some View {
        HStack(spacing: 16) {
            // Area kiri — buka detail habit
            Link(destination: URL(string: "myapp://habit/\(entry.habitID)")!) {
                VStack {
                    Text(entry.habitName).font(.headline)
                    Text("Detail →").font(.caption).foregroundStyle(.blue)
                }
            }

            Divider()

            // Area kanan — buka statistik
            Link(destination: URL(string: "myapp://stats")!) {
                VStack {
                    Text("\(entry.streak)").font(.title.bold())
                    Text("Hari Streak").font(.caption)
                }
            }
        }
        .containerBackground(.fill.tertiary, for: .widget)
    }
}

Menangani URL di App Utama

swift
// Di SwiftUI App
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onOpenURL { url in
                    handleWidgetDeepLink(url)
                }
        }
    }

    private func handleWidgetDeepLink(_ url: URL) {
        guard url.scheme == "myapp" else { return }
        switch url.host {
        case "habit":
            let habitID = url.pathComponents.last ?? ""
            NavigationState.shared.navigateToHabit(id: habitID)
        case "stats":
            NavigationState.shared.navigateToStats()
        default:
            break
        }
    }
}