Метод scene(_:openURLContexts:) не вызывается

В файле info.plist я настроил URL Identifier а также URL Schemeуспешно. Также я могу открыть приложение, используя собственный URL. Проблема в том, что когда приложение запускает первый раз, метод

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

У меня есть некоторые зависимые функции, основанные на вышеуказанном методе. Поэтому, когда приложение запускается в первый раз, я ничего не вижу в своем приложении.

Также я добавил код в методе

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

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

        let url = connectionOptions.urlContexts.first?.url

    }

но здесь я получаю нулевой URL.

Однако, если мое приложение находится в фоновом режиме, и я нажимаю URL-адрес, вышеуказанный метод вызывает успешные вызовы и зависимые функции работают нормально. Ниже мой код наscene(_:openURLContexts:) метод в 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()
    }

Может ли кто-нибудь сказать мне, почему первый раз вышеупомянутый метод не вызывается?

4 ответа

Может быть, это поможет в твоей ситуации.


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

    пусть urlinfo = connectionOptions.urlContexts
    let url = urlinfo.first?.url as! NSURL

}

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

    пусть url = URLContexts.first!.url как NSURL

}

Я думаю , что документы Apple объясняют это наиболее четко, т.е.

Если ваше приложение выбрало сцены и ваше приложение не запущено, система доставляет URL-адрес методу делегата после запуска и когда ваше приложение открывает URL-адрес во время работы или приостановки в памяти.

Следовательно, он будет вызывать только ваш scene(_:openURLContexts:)(то есть тот, что с этой подписью: func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)в вопросе), когда ваше приложение открывает URL-адрес во время работы или приостанавливается только в памяти.

Вместо этого, когда приложение запускается в первый раз, оно вызывает scene(_:willConnectTo:options:).

У меня была такая же проблема, и метод scene(_ scene:, continue userActivity:) вызывался только тогда, когда приложение открыто.

Когда я проверил connectionOptions передан методу scene(_ scene:, willConnectTo session, options connectionOptions:)у него была активность пользователя с ожидаемым URL. Итак, я вызвал первый метод вручную:

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

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

Моя ситуация заключалась в том, что дополнительная функция openURL, предоставленная в SceneDelegate, не вызывалась после возврата из аутентификации Facebook.

Решение использовало

.onOpenURL { (url) in
                ApplicationDelegate.shared.application(
                    UIApplication.shared,
                    open: url,
                    sourceApplication: nil,
                    annotation: [UIApplication.OpenURLOptionsKey.annotation]
                )
            }

Вызов функции в моем дополнительном делегате приложения, который затем работал правильно.

Другие вопросы по тегам