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

Метод 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.

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


person Dmitry    schedule 04.10.2019    source источник
comment
Связанные (возможно, та же основная проблема): ярлык stackoverflow.com/questions/58134706/   -  person rmaddy    schedule 05.10.2019


Ответы (3)


У тебя это почти было:

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

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

person matt    schedule 28.10.2019
comment
все еще не работает у меня. когда приложение закрыто. (проведено из недавних приложений) динамическая ссылка открывает приложение, но URL-адрес равен нулю - person Sergio; 02.04.2020
comment
Этот ответ кажется устаревшим. Другой ответ об итерации над connectionOptions.userActivities сработал для меня. - person Mick; 23.10.2020
comment
@Mick Глядя на то, что я на самом деле написал, мне кажется, что я тоже говорю именно об этом: посмотрите connectionOptions.userActivities. Итерация - это то, как вы выглядите. Я не буду вдаваться в подробности, потому что все это кажется очевидным. :) - person matt; 23.10.2020
comment
@matt Извини! Я просто опробовал блок кода, не читая ваших заметок. :) Вы могли бы просто удалить это ... - person Mick; 23.10.2020

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

person Dmitry    schedule 28.10.2019
comment
У вас есть ссылка на подтвержденную проблему с яблоком? Принятый ответ не работает для меня, когда приложение закрывается и я нажимаю динамическую ссылку, приложение открывается, но URL-адрес равен нулю. - person Sergio; 02.04.2020
comment
это уже исправлено? - person Jalil; 14.10.2020

Это сработало для меня:

func scene(_ scene: UIScene, willConnectTo _: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        for userActivity in connectionOptions.userActivities {
            if let url = userActivity.webpageURL { //ADD WHATEVER CONDITION YOU NEED
                //DO WHAT YOU NEED HERE
                break
            }
        }
    }

В основном проблема в том, что универсальная ссылка скрыта внутри connectionOptions, поэтому вам нужно искать ее с помощью цикла.

person Nicola Salvaro    schedule 14.10.2020