La méthode 'scene (_: openURLContexts :)' n'est pas appelée

9

Dans le fichier info.plist, j'ai configuré URL Identifieret URL Schemeréussi. Je peux également ouvrir l'application en utilisant une URL personnalisée. Le problème est lorsque l'application lance la première fois la méthode

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) does not call.

J'ai des fonctionnalités dépendantes basées sur la méthode ci-dessus. Ainsi, lorsque l'application est lancée pour la première fois, je ne vois rien dans mon application.

J'ai aussi ajouté du code dans la méthode

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let _ = (scene as? UIWindowScene) else { return }

        let url = connectionOptions.urlContexts.first?.url

    }

mais je reçois l'URL nulle ici.

Cependant, si mon application est en mode arrière-plan et que je clique sur URL, la méthode ci-dessus appelle avec succès et la fonctionnalité dépendante fonctionne correctement. Voici mon code sur la scene(_:openURLContexts:)méthode dans sceneDelegate.

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>){
        let url = URLContexts.first?.url
        let urlString: String = url!.absoluteString

        if let urlComponents = URLComponents(string: urlString),let queryItems = urlComponents.queryItems {
            queryParams = queryItems
        } else {
            print("invalid url")
        }

        guard let windowScene = (scene as? UIWindowScene) else { return }


        self.window = UIWindow(windowScene: windowScene)
        //self.window =  UIWindow(frame: UIScreen.main.bounds)

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        guard let rootVC = storyboard.instantiateViewController(identifier: "LocationViewIdentifier") as? UIViewController else {
            print("ViewController not found")
            return
        }
        let rootNC = UINavigationController(rootViewController: rootVC)
        self.window?.rootViewController = rootNC
        self.window?.makeKeyAndVisible()
    }

Quelqu'un peut-il me dire pourquoi la première méthode ci-dessus n'appelle pas?

iPhone
la source
Quel est l'état actuel de cette question? L'une des réponses a-t-elle résolu votre problème? Si oui, veuillez en accepter un. Avez-vous besoin de plus d'aide? Si oui, pouvez-vous expliquer ce que les solutions apportées ont apporté à votre problème et qu'est-ce qui manque encore? Je serais heureux de vous aider sur celui-ci
Muli

Réponses:

2

Peut-être que cela aidera votre situation.

func scene (_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    laissez urlinfo = connectionOptions.urlContexts
    laissez url = urlinfo.first? .url as! NSURL

}

scène func (_ scène: UIScene, openURLContexts URLContexts: Set) {

    let url = URLContexts.first! .url as NSURL

}

Peter_P
la source
2

J'ai eu le même problème et la méthode scene(_ scene:, continue userActivity:) n'a été appelée que lorsque l'application est ouverte.

Lorsque j'ai vérifié le connectionOptionspassé à la méthode, scene(_ scene:, willConnectTo session, options connectionOptions:)il y avait une activité utilisateur avec l'URL attendue. Donc, j'ai fini par appeler la première méthode manuellement:

func scene(_ scene: UIScene,
           willConnectTo session: UISceneSession,
           options connectionOptions: UIScene.ConnectionOptions) {

    if let userActivity = connectionOptions.userActivities.first {
        self.scene(scene, continue: userActivity)
    }
}
Hejazi
la source