دیپ لینک ها (Deep Links)
«دیپ لینک (Deep Link)» یعنی لینک مستقیم به یک بخش. مثل رفتن مستقیم به اتاق خاص. «URL» همان آدرس اینترنتی است. در SwiftUI با «onOpenURL» رویداد لینک را می گیریم. تمرکز ما «دیپ لینک SwiftUI» است.
onOpenURL پایه
«onOpenURL» رویداد بازشدن آدرس را می گیرد. سپس با «NavigationStack» به مقصد می رویم. «Path» لیست مسیرهای فعال است. مثل لیست صفحات بازی.
- یک NavigationStack با path بساز.
- در onOpenURL آدرس را بررسی کن.
- آیدی را از مسیر آدرس بگیر.
- آیدی را به path اضافه کن.
import SwiftUI
struct ItemDetail: View {
let id: Int
var body: some View {
Text("Item #\(id)")
}
}
struct DeepLinkBasicDemo: View {
@State private var path: [Int] = []
var body: some View {
NavigationStack(path: $path) {
Text("Home")
.onOpenURL { url in
if url.scheme == "myapp" && url.host == "item" {
if let id = Int(url.lastPathComponent) {
path.append(id)
}
}
}
.navigationDestination(for: Int.self) { id in
ItemDetail(id: id)
}
.navigationTitle("Deep Links")
}
}
}
struct ContentView: View {
var body: some View {
DeepLinkBasicDemo()
}
}
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
نکته: Scheme سفارشی مثل myapp تعریف کن. سپس مسیرها را ساده نگه دار.
نقشه مسیر و چند مقصد
می توانی چند نوع مسیر داشته باشی. سپس با «enum» آن ها را مدیریت کن. «routing» یعنی رفتن به مقصد درست بسته به آدرس.
- Enum برای مسیرها بساز.
- Path را از نوع Enum کن.
- Host آدرس را بررسی کن.
- مقصد مناسب را به path اضافه کن.
import SwiftUI
struct ProfileView: View {
let user: String
var body: some View {
Text("Profile: \(user)")
}
}
struct ArticleView: View {
let slug: String
var body: some View {
Text("Article: \(slug)")
}
}
enum Route: Hashable {
case item(Int)
case profile(String)
case article(String)
}
struct DeepLinkRoutesDemo: View {
@State private var path: [Route] = []
var body: some View {
NavigationStack(path: $path) {
Text("Home")
.onOpenURL { url in
guard url.scheme == "myapp" else {
return
}
switch url.host {
case "item":
if let id = Int(url.lastPathComponent) {
path.append(.item(id))
}
case "profile":
path.append(.profile(url.lastPathComponent))
case "article":
path.append(.article(url.lastPathComponent))
default:
break
}
}
.navigationDestination(for: Route.self) { route in
switch route {
case .item(let id):
Text("Item #\(id)")
case .profile(let u):
ProfileView(user: u)
case .article(let s):
ArticleView(slug: s)
}
}
.navigationTitle("Routes")
}
}
}
struct ContentView: View {
var body: some View {
DeepLinkRoutesDemo()
}
}
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
هشدار: مسیرها را کوتاه و قابل حدس نگه دار. از نام های شفاف استفاده کن.
ارتباط با ناوبری دیگر
پس از «دیپ لینک SwiftUI» بخش های مرتبط را ببین: Sheets و Programmatic Navigation. همچنین لینک تقویتی: دیپ لینک SwiftUI.
جمع بندی سریع
- onOpenURL آدرس را می گیرد.
- Path مقصدها را نگه می دارد.
- Enum مدیریت مسیرها را ساده می کند.
- Scheme و host را بررسی کن.
- مسیرها را شفاف نام گذاری کن.