Метод 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]
)
}
Вызов функции в моем дополнительном делегате приложения, который затем работал правильно.