`scene (_ scene: UIScene, continue userActivity: NSUserActivity)` не вызывается при запуске приложения после нажатия пользователем универсальной ссылки - PullRequest
1 голос
/ 05 октября 2019

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

Работает нормально, когда уже запущенное приложение открывается снова после того, как пользователь нажимает на универсальную ссылку. Пример кода:

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
        let incomingURL = userActivity.webpageURL,
        let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
        let path = components.path else {
            return
    }
    let params = components.queryItems ?? [URLQueryItem]()

    print("path = \(path)")
    print("params = \(params)")
}

Я пытался использовать application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration, но он никогда не вызывается, когда пользователь нажимает на ссылку:

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
    if let scene = connectingSceneSession.scene, let userActivity = scene.userActivity {
        if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
            if let incomingURL = userActivity.webpageURL,
                let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
                let path = components.path {
                let params = components.queryItems ?? [URLQueryItem]()

                print("path = \(path)")
                print("params = \(params)")
            }
        }
    }
    return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}

Я пытался использовать scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions):

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = scene.userActivity {
        self.scene(scene, continue: userActivity)
    }
}

Я также попробовал следующие методы:

func sceneDidBecomeActive(_ scene: UIScene) {
    if let userActivity = scene.userActivity {
        self.scene(scene, continue: userActivity)
    }
}

func sceneWillEnterForeground(_ scene: UIScene) {
    if let userActivity = scene.userActivity {
        self.scene(scene, continue: userActivity)
    }
}

Но scene.userActivity всегда равен нулю, и я не могу получить userActivity.webpageURL.

Как мы можем распознать, что ссылка была нажата, и приложение было запущено (а не только открыто)?

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

У вас почти было это:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = scene.userActivity { // <-- not quite
        self.scene(scene, continue: userActivity)
    }
}

Его нет на сцене;это в options. Посмотри в options.userActivities. (Хотя, если пользователь нажал на ссылку , чтобы запустить нас, я мог бы найти URL в options.urlContexts.)

0 голосов
/ 28 октября 2019

Apple ответила, подтверждая эту проблему в iOS 13.

...