Metoda „scena (_: openURLContexts :)” nie jest wywoływana

9

W pliku info.plist skonfigurowałem URL Identifieri URL Schemeudało mi się. Mogę również otworzyć aplikację przy użyciu niestandardowego adresu URL. Problem polega na tym, że aplikacja uruchamia się po raz pierwszy

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

Mam pewne funkcje zależne od powyższej metody. Więc kiedy aplikacja uruchamia się po raz pierwszy, nie widzę niczego w mojej aplikacji.

Również dodałem kod w metodzie

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

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

        let url = connectionOptions.urlContexts.first?.url

    }

ale dostaję adres URL jako zero tutaj.

Jeśli jednak moja aplikacja działa w tle i trafię w adres URL, powyższe metody wywołują pomyślnie i zależna funkcjonalność działa poprawnie. Poniżej znajduje się mój kod dotyczący scene(_:openURLContexts:)metody w 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()
    }

Czy ktoś może mi powiedzieć, dlaczego po raz pierwszy powyżej metody nie wywołuje?

iPhone
źródło
Jaki jest obecny stan tego pytania? Czy jedna z odpowiedzi rozwiązała problem? Jeśli tak, zaakceptuj jedną z nich. Potrzebujesz dodatkowej pomocy? Jeśli tak, czy możesz wyjaśnić, jakie rozwiązania zapewniły problem i czego wciąż brakuje? Z przyjemnością Ci pomogę w tej sprawie
Muli

Odpowiedzi:

2

Może to pomoże twojej sytuacji.

scena func (_ scena: UIScene, willConnectTo sesja: UISceneSession, opcje connectionOptions: UIScene.ConnectionOptions) {

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

}

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

    niech URL = URLContexts.first! .url jako NSURL

}

Peter_P
źródło
2

Miałem ten sam problem, a metoda scene(_ scene:, continue userActivity:)została wywołana tylko wtedy, gdy aplikacja jest otwarta.

Kiedy sprawdziłem connectionOptionsprzekazaną metodę scene(_ scene:, willConnectTo session, options connectionOptions:), miała aktywność użytkownika z oczekiwanym adresem URL. Ostatecznie ręcznie wywołałem pierwszą metodę:

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

    if let userActivity = connectionOptions.userActivities.first {
        self.scene(scene, continue: userActivity)
    }
}
Hejazi
źródło