Как узнать, было ли приложение запущено через Firebase-Deeplink (динамические ссылки) в didFinishLaunchingWithOptions в AppDelegate

Мы добавляем Firebase-Deeplinks в наш IOS-проект, чтобы приложение можно было запускать через deeplink.

Сама функция deeplink пока работает нормально, как и процедура запуска приложения по умолчанию. Но одновременная работа обеих startRoutines вызывает у меня головную боль.

То, что я пытаюсь достичь, становится очевидным, глядя на этот фрагмент кода.

func application(_:didFinishLaunchingWithOptions:) {
   FirebaseApp.configure()

   if "deeplink" {
      return true 
   }
   defaultAppLaunch() // no deeplink
   return true 
}

Если есть deeplink, вызывается одна из этих функций appDelegate:

func application(:continueUserActivity:restorationHandler:) {
    handleDeeplink()
    return true
}

func application(:openURL:options:) {
    handleDeeplink()
    return true  
}

Итак, как мне узнать в приложении (_: didFinishLaunchingWithOptions :), могу ли я вызвать defaultAppLaunch ()?

Я знаю, что есть аргумент launchOptions, но в моем случае он всегда равен nil, по крайней мере, при запуске приложения через XCode. А также Firebase-Documentation ничего не говорит о параметрах запуска, которые должны быть установлены Firebase-Deeplinks.

Помощь очень ценится.


person nayooti    schedule 26.09.2018    source источник
comment
Тебе с этим повезло? У меня та же проблема, и я не вижу способа синхронно узнать, было ли приложение открыто без динамической ссылки.   -  person Yasir    schedule 21.12.2018
comment
Не совсем, не знаю, почему больше никто не сталкивается с этой проблемой.   -  person nayooti    schedule 21.12.2018
comment
В итоге я нашел обходной путь, которым не горжусь. Я добавил что-то вроде экрана запуска (создание глупых анимаций, автоматическое скрытие через несколько секунд), работающее как занавес. Так что в основном я откладываю запуск своего приложения по умолчанию, пока не буду на 95% уверен, что никакой подпрограммы dynamicLink не последует). Я не доволен этим, но я больше не мог искать лучшего решения.   -  person nayooti    schedule 21.12.2018
comment
Хм, также пришлось реализовать обходной путь - хотя, к счастью, моя проблема была связана с отслеживанием аналитики, а не с влиянием на пользовательский интерфейс, поэтому мне не пришлось откладывать отображение пользовательского интерфейса. Будем надеяться на улучшения API в будущем.   -  person Yasir    schedule 22.12.2018


Ответы (2)


TL;DR

Вы не можете знать, что ваше приложение было открыто с помощью deeplink через App Delegate DidFinishLaunching.


Объяснение:

Делегат приложения, завершивший запуск, всегда вызывается, независимо от того, открывалось ли приложение в обычном режиме или через deeplink. поэтому вы не можете узнать через делегата приложения

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

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
  if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
    // Handle the deep link. For example, show the deep-linked content or
    // apply a promotional offer to the user's account.
    // ...
    return true
  }
  return false
}

и вы должны обрабатывать функциональность deeplinks в той же функции

person Awais Fayyaz    schedule 27.09.2018

Я ссылаюсь на документы Firebase при обработке динамических ссылок для iOS: документы Firebase для получения динамических ссылок

Затем в методе application: continueUserActivity: restoreHandler: обработайте ссылки, полученные как универсальные ссылки, когда приложение уже установлено (в iOS 9 и новее):

func application(_ application: UIApplication, continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
  let handled = DynamicLinks.dynamicLinks().handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in
    // ...
  }

  return handled
}

Наконец, в методах application: openURL: sourceApplication: annotation: (iOS 8 и старше) и application: openURL: options: (iOS 9 и выше) обрабатываются ссылки, полученные через настраиваемую схему URL-адресов вашего приложения. Эти методы вызываются, когда ваше приложение получает ссылку на iOS 8 и старше, а также когда ваше приложение открывается в первый раз после установки в любой версии iOS.

@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  return application(app, open: url,
                     sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                     annotation: "")
}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
  if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
    // Handle the deep link. For example, show the deep-linked content or
    // apply a promotional offer to the user's account.
    // ...
    return true
  }
  return false
}

Но вы упомянули, что приложение в настоящее время запускается только на Xcode (и я предполагаю, что iOS Simulator, возможно, вы также можете попробовать его на тестовом устройстве!)

person remingtonchan    schedule 26.09.2018
comment
Спасибо. Может быть, я не совсем понял свою проблему. Мои диплинки работают нормально, это вообще не проблема. Моя проблема в том, что я appDelegate(_:didFinishLaunchingWithOptions) вызывается до методов, которые вы и документация предоставляете. В appDelegate(_:didFinishLaunchingWithOptions) однако я хотел бы знать, было ли приложение запущено через Deeplinks, потому что в противном случае я могу запустить приложение с моей программой по умолчанию (без deeplink). - person nayooti; 26.09.2018