import SwiftUI
@main
struct DeepLinkDemoApp: App {
@StateObject var deepLinkModel = DeepLinkModel()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(deepLinkModel)
}
.onOpenURL { url in
// Parse URL path
deepLinkModel.path = url.path.isEmpty ? "(empty path)" : url.path
// Parse query parameters
if let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let queryItems = components.queryItems, !queryItems.isEmpty {
let params = queryItems.map { "\($0.name)=\($0.value ?? "")" }.joined(separator: ", ")
deepLinkModel.queryParams = params
} else {
deepLinkModel.queryParams = "No query parameters"
}
}
}
}
class DeepLinkModel: ObservableObject {
@Published var path: String = "No URL opened"
@Published var queryParams: String = ""
}
struct ContentView: View {
@EnvironmentObject var deepLinkModel: DeepLinkModel
var body: some View {
VStack(alignment: .leading, spacing: 20) {
Text("URL Path:")
.font(.headline)
Text(deepLinkModel.path)
.foregroundColor(.blue)
Text("Query Params:")
.font(.headline)
Text(deepLinkModel.queryParams)
.foregroundColor(.green)
Spacer()
}
.padding()
}
}
This solution uses SwiftUI's .onOpenURL modifier to handle deep links when the app opens or is already running. The URL's path and query parameters are extracted and stored in a shared DeepLinkModel observable object. The ContentView observes this model and updates the UI to show the current URL path and parameters.
This approach is simple and fits well with SwiftUI's reactive design. It avoids the older SceneDelegate method and uses modern SwiftUI lifecycle APIs.