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)"))
}
}
Link untuk Area Berbeda (Medium/Large Widget)
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
}
}
}