El método 'scene (_: openURLContexts :)' no se llama

9

En el archivo info.plist configuré URL Identifiery con URL Schemeéxito. También puedo abrir la aplicación usando una URL personalizada. El problema es cuando la aplicación se inicia por primera vez el método

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

Tengo alguna funcionalidad dependiente basada en el método anterior. Entonces, cuando la aplicación se inicia por primera vez, no puedo ver nada en mi aplicación.

También agregué código en el método

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

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

        let url = connectionOptions.urlContexts.first?.url

    }

pero recibo url como nil aquí.

Sin embargo, si mi aplicación está en modo de fondo y presiono la URL, el método anterior llama con éxito y la funcionalidad dependiente funciona bien. El siguiente es mi código sobre el scene(_:openURLContexts:)método en 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()
    }

¿Alguien puede decirme por qué el método anterior no llama por primera vez?

iPhone
fuente
¿Cuál es el estado actual de esta pregunta? ¿Alguna de las respuestas resolvió tu problema? En caso afirmativo, acepte uno de ellos. ¿Necesitas más ayuda? En caso afirmativo, ¿puede explicar qué hicieron las soluciones proporcionadas a su problema y qué es lo que aún falta? Estaré encantado de ayudarte en esto
Muli

Respuestas:

2

Quizás esto ayude a su situación.

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

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

}

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

    let url = URLContexts.first! .url como NSURL

}

Peter_P
fuente
2

Tuve el mismo problema, y ​​el método scene(_ scene:, continue userActivity:)solo se llamó cuando la aplicación está abierta.

Cuando verifiqué el connectionOptionspasado al método scene(_ scene:, willConnectTo session, options connectionOptions:), tenía una actividad de usuario con la URL esperada. Entonces, terminé llamando al primer método manualmente:

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

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