【问题标题】:After opening iOS app "continue userActivity:" method isn't called - Firebase dynamic link打开 iOS 应用后“继续 userActivity:”方法未被调用 - Firebase 动态链接
【发布时间】:2019-08-30 07:52:19
【问题描述】:

我已成功集成 Firebase 动态链接,当我点击动态链接时,我的应用正在打开。

我面临的问题是从动态链接打开应用程序后,应该调用 continue userActivity: 方法,但没有任何反应。

我已经检查了所有可能的事情,但没有发现问题。

我已经为此搜索了 SO,但没有一个答案对我有帮助。

我的代码:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

  GIDSignIn.sharedInstance().clientID = kGoogleSignInClientId
  FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

 // DynamicLinks.performDiagnostics(completion: nil)

  FirebaseApp.configure()

  return true
}

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

  if url.absoluteString.contains(kFBAppId) {

    return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)

  }

  if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
    print(dynamicLink.url ?? URL(string: "test") as Any)
    return true
  }

    return GIDSignIn.sharedInstance().handle(url, sourceApplication: options[.sourceApplication] as? String, annotation: options[.annotation])

}

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

  //This method is not getting called
}

【问题讨论】:

    标签: ios swift appdelegate firebase-dynamic-links


    【解决方案1】:

    我不知道他们是否保留他们的文档。是否是最新的。

    我刚刚从 Google 的官方 Firebase 动态链接文档中复制粘贴了代码。

    为什么没有调用continue userActivity: 方法?

    原因是(看下面方法的区别)

    从谷歌文档复制粘贴。 - 一个错误

    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restoreHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

    }

    我写了这个(没有从谷歌文档复制粘贴。) - 更正一个

    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restoreHandler: @escaping ([Any]?) -> Void) -> Bool {

    }

    我已经大胆地改变了。

    这是我尝试了好几个小时的方法。盲目相信google doc真的很让人沮丧:-|

    希望这对其他人有帮助。

    【讨论】:

    • 但即使 xcode 自动完成如下:func application(_ application: UIApplication, continue userActivity: NSUserActivity, restoreHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
    【解决方案2】:

    对于那些使用单独的 SceneDelegate.swift 和 AppDelegate.swift 的人的附加答案: 这个方法在 AppDelegate >

    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        if userActivity.activityType == CSSearchableItemActionType {
    
    }
    

    现在在 SceneDelegate >

    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    
    }
    

    【讨论】:

    • 你拯救了我的一天!因为我使用 SwiftUI,所以有 SceneDelegate——在这个上下文中没有提到它是相关的。 (无论是在 Firebase 文档中,还是在过去两个小时内我查看的任何其他地方。)??
    • 我有点太兴奋了。只有当应用程序已经在后台运行时,才会触发 SceneDelegate 方法。你知道在冷启动的情况下在哪里接收深层链接(不一定是在全新安装之后。如果有 SceneDelegate,AppDelegate 中的方法也不会再被调用。
    • 在添加 SceneDelegate 后,Apple 不会更新他们的官方文档。谢谢!
    • 对于所有其他登陆这里的人,如果应用程序尚未运行,则可以在此处找到解决方案:stackoverflow.com/questions/60524108/…
    【解决方案3】:

    你需要检查两次。

    1. 当应用程序。正在后台运行并从链接打开: 委托方式为:func checkForTransferedTicket(_ userActivity: NSUserActivity) { }

    2. 当应用程序。不在后台运行,而是从链接打开:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2016-10-03
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2020-02-01
      相关资源
      最近更新 更多