How to navigate from widget extension to UIKit viewController?

Viewed 985

I am currently trying to make a widget with SwiftUI. Let's say my code is like this:

struct WidgetView: View {
    var data : DataProvider.Entry
    var body: some View {
        ZStack {
            Image("Clicker")
                .padding(.all, 15)
        }.widgetURL(URL(string: "ClickerViewController"))
        .padding(.all, 30)
        .background(Color.green)
    }
}

At the moment, tapping the widget opens the home screen of the app. Want to navigate to a specific screen. supportedFamilies: .systemSmall - so need to use .widgetURL and not .Link

So where the URL is Clicker, how to navigate to viewController that is called ClickerViewController? How to handle these links? Any examples or explaining would help me and a lot of others in the near future I guess ;)

Thank you!

2 Answers

Here is possible approach

var body: some Scene {
    @StateObject private var appState = AppState()

    WindowGroup {
        ContentView()
            .environmentObject(appState)
            .onOpenURL(perform: { url in
                appState.handle(url)       // redirect to app state
            })
    }
}

and AppState can have, for example

class AppState: ObservableObject {
    @Published var appScreen: _SomeEnumType_

    func handle(url: URL) {
        // ... update `appScreen` here correnspondingly
    }
}

so inside ContentView depending on app state you can switch shown views.

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {

}

I got this method performed in SceneDelegate when I clicked the widget. You can handle your url and redirect to the ViewController

Related