Firebase Deeplink не вызывает приложение: continueUserActivity: функция восстановленияHandler AppDelegate в Swift 3

Я использую URL-адрес Firebase Deeplink, чтобы открыть специальный раздел моего приложения. Он хорошо работает, когда приложение работает в фоновом режиме, но когда я убил приложение и щелкнул URL-адрес deeplink извне, я не знаю, как справиться с этим случаем, я имею в виду, где я должен написать свое условие, чтобы получить параметры URL-адреса.

Этот метод делегата приложения вызывается, когда приложение находится в фоновом режиме

   @available(iOS 8.0, *)
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    guard let dynamicLinks = DynamicLinks.dynamicLinks() else {
        return false
    }
    let handled = dynamicLinks.handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in
        if let dynamicLink = dynamiclink, let _ = dynamicLink.url
        {
            var path = dynamiclink?.url?.path
            path?.remove(at: (path?.startIndex)!)
            let delimiter = "/"
            var fullNameArr = path?.components(separatedBy: delimiter)
            let type: String = fullNameArr![0]
            let Id: String? = (fullNameArr?.count)! > 1 ? fullNameArr?[1] : nil
            if(type == "games")
            {
                self.callGameDetailView(gameId: Id! , gameType: "created", notificationId: "NIL" )

            }else{
                var paths = dynamicLink.url?.path
                paths?.remove(at: (path?.startIndex)!)
                self.setRewardViewController(paths!)

            }
        } else {
            // Check for errors
        }
    }
    return handled
}

но он не будет вызывать метод открытого URL-адреса, когда я убиваю приложение и нажимаю URL-адрес динамической ссылки:

@available(iOS 9.0, *)
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
    -> Bool {

   return self.application(application, open: url, sourceApplication: nil, annotation: [:])


}


func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

    let dynamicLink = DynamicLinks.dynamicLinks()?.dynamicLink(fromCustomSchemeURL: url)
    if let dynamicLink = dynamicLink
    {
        var path = dynamicLink.url?.path
        path?.remove(at: (path?.startIndex)!)
        let delimiter = "/"
        var fullNameArr = path?.components(separatedBy: delimiter)
        let type: String = fullNameArr![0]
        let Id: String? = (fullNameArr?.count)! > 1 ? fullNameArr?[1] : nil
        if(type == "games")
        {
            self.callGameDetailView(gameId: Id! , gameType: "created", notificationId: "NIL" )

        }else{
            var paths = dynamicLink.url?.path
            paths?.remove(at: (path?.startIndex)!)
            self.setRewardViewController(paths!)
            return true
        }
    }

    return FBSDKApplicationDelegate.sharedInstance().application(
        application,
        open: url,
        sourceApplication: sourceApplication,
        annotation: annotation)
}

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


person Raj    schedule 29.09.2017    source источник
comment
Приложение Metod func (_ application: UIApplication, continue userActivity: NSUserActivity, recoveryHandler: @escaping ([Any]?) - ›Void) -› Bool вызывается, когда ваше приложение iOS установлено и вы нажимаете на динамическую ссылку. Пожалуйста, еще раз проверьте это. Динамические ссылки Firebase используют универсальные ссылки iOS, когда приложение уже установлено, поэтому вы можете еще раз проверить, правильно ли настроены универсальные ссылки. Для дополнительной отладки запустите DynamicLinks.performDiagnostics (завершение: nil) и опубликуйте вывод здесь.   -  person Oleksiy Ivanov    schedule 14.10.2017


Ответы (4)


У меня тоже такая же проблема, вам нужно получить NSUserActivity из launchOptions

var launchURL :URL? = nil

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            ....
            // this code should have worked but not working for me with Xcode 9
            //        if let userActivityDictionary = launchOptions?[.userActivityDictionary] as? [UIApplicationLaunchOptionsKey : Any],
            //            let auserActivity = userActivityDictionary[.userActivityType] as? NSUserActivity {
            //            launchURL = auserActivity.webpageURL
            //        }

             if let userActDic = launchOptions?[UIApplicationLaunchOptionsKey.userActivityDictionary] as? [String: Any],
                        let  auserActivity  = userActDic["UIApplicationLaunchOptionsUserActivityKey"] as? NSUserActivity{

                        NSLog("type \(userActDic.self),\(userActDic)") // using NSLog for logging as print did not log to my 'Device and Simulator' logs
                        launchURL = auserActivity.webpageURL
                    }
            ...
            }

func applicationDidBecomeActive(_ application: UIApplication) {
            if let url = self.launchURL {
                self.launchURL = nil

                DispatchQueue.main.asyncAfter(deadline: .now()+2.0, execute: {
                    // wait to initalize notifications

                    if let dynamicLinks = DynamicLinks.dynamicLinks()  {
                        NSLog("handling \(dynamicLinks)")
                        dynamicLinks.handleUniversalLink(url) { (dynamiclink, error) in
                            if let link = dynamiclink?.url {
                                NSLog("proceessing \(dynamicLinks)")
                                let strongMatch = dynamiclink?.matchConfidence == .strong
    // process dynamic link here
                                self.processDynamicLink(withUrl: link, andStrongMatch: strongMatch)
                            }
                        }

                    }

                })
            }

        }
person Eldhose    schedule 13.10.2017
comment
Спасибо! Я весь день боролся с этой проблемой. Жаль, что Firebase SDK не справляется с этим пограничным случаем даже пять месяцев спустя ... Один вопрос, однако, почему двухсекундная задержка перед обработкой динамических ссылок? - person shelll; 22.03.2018
comment
чтобы убедиться, что приложение загружено полностью ... можно изменить или удалить задержку - person Eldhose; 02.04.2018

Я весь день сталкиваюсь с этой же проблемой. Firebase SDK не обрабатывает этот крайний случай и нигде не упоминается в своей документации. Очень неприятно!

Нашел решение после исследования для iOS 13 и более поздних ОС. Динамическая ссылка Firebase работает, а также может перенаправлять на определенную страницу, даже когда приложение запускается в первый раз или запускается после закрытия приложения.

Используйте приведенный ниже код в SceneDelegate вместо AppDelegate

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

if let firstUrlContext = connectionOptions.userActivities.first,let url = firstUrlContext.webpageURL  {
    DynamicLinks.dynamicLinks().handleUniversalLink(url) { (dynamiclink, error) in
        if let dynamiclink = dynamiclink {
            self.handleDynamicLink(dynamiclink)
        }
      }
    }
  }
person Stalin Pusparaj    schedule 06.12.2020

Два openURL метода AppDelegate, на которые вы ссылаетесь, вызываются, когда приложение открывается с использованием схемы URI. Функциональность схемы URI будет работать только в очень специфических сценариях. В iOS 9 Apple перешла на универсальные ссылки, которые фактически вызывают функцию application:continueUserActivity:restorationHandler:.

Эта функция не вызывает openURL методы, поэтому вся ваша обработка универсальных ссылок должна выполняться в continueUserActivity, который вы упомянули первым.

Чтобы избавить себя от множества проблем при работе с другими пограничными случаями, я бы предложил перейти к другому стороннему провайдеру, например Branch (Полное раскрытие информации, я работаю там), поскольку они объединяют всю эту обработку в один обратный вызов и предоставляют больше функций и услуг, связанных с атрибуцией, которые недоступны для пользователей Firebase.

person clayjones94    schedule 29.09.2017
comment
Спасибо @ Clayjones94, но моя проблема в том, что моя ссылка на firebase deeplink работает нормально, я перенаправляю пользователя к определенному контенту, когда приложение работает в фоновом режиме, но когда я убил приложение, чем глубокая ссылка открывает приложение, но не приводит пользователя к определенному контенту в приложение. Что мне не хватает в моем коде? - person Raj; 02.10.2017

В методе application: didFinishLaunchingWithOptions: вам необходимо зарегистрировать свой customURLScheme.

FirebaseOptions.defaultOptions()?.deepLinkURLScheme = YOUR_URL_SCHEME
person Ibrahim Ulukaya    schedule 09.10.2017