openURL not being called when I launch the app from Scheme Url (Swift project)

When I open my application through myapp://param1=abc the open url function is not called.

I've added functions didFinishLaunchingWithOptions and willFinishLaunchingWithOptions to make it true, as the Apple documentation says, but it's still not called. The application opens perfectly, but not calling the function open url I can not get the param1

This is my AppDelegate file:

class AppDelegate: UIResponder, UIApplicationDelegate  {

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        return true
    }

    func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        return true
    }

    func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        // Here doesn't come! :(
        return true
    }


    // MARK: UISceneSession Lifecycle


    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
}

Any idea what might be going on?

Thanks!

Upvotes: 2

Views: 5834

Answers (4)

davidbaraff
davidbaraff

Reputation: 191

You can find the launch URL as follows:

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
  if let url = connectionOptions.urlContexts.first {
     ...
  }
}

Upvotes: 0

chikko
chikko

Reputation: 416

Since iOS 14 you can use deep links instead:

struct ShapifyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onOpenURL { url in
                    //Whatever you need to do goes here
                }
        }
    }
}

Upvotes: 1

PGDev
PGDev

Reputation: 24341

The signature of openUrl method in AppDelegate is updated to,

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    return true
}

You need to add your urlScheme in the URL Types under Info tab in project settings, i.e.

enter image description here


For Swift-5 and iOS-13:

In SceneDelegate.swift file, you need to implement the below method to handle urlSchemes, i.e.

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

Upvotes: 4

Maulik Pandya
Maulik Pandya

Reputation: 2230

application(_ application: UIApplication, open url will not call at the time of app launch. you need to access the launchOptions: [UIApplication.LaunchOptionsKey: Any] and your url with the help of [UIApplication.LaunchOptionsKey.url]

Here is the snippet that might help you

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        let url = launchOptions![UIApplication.LaunchOptionsKey.url]
        ...

        return true
    }

Upvotes: 0

Related Questions