根本没有调用动态链接 Firebase 函数 Xcode 12?

Dynamic Links Firebase function not being called at all Xcode 12?

所以我有一个正在运行的动态 link,当我单击它时它会打开应用程序,但不会处理动态 link。这是因为从来没有进入下面看到的应用程序功能,我不确定为什么...

func handleIncomingDynamicLink(_ dynamicLink: DynamicLink){
    guard let url = dynamicLink.url else {
        print("That's weird. My dynamic link object has no url")
        return
    }
    print("Your incoming link parameter is \(url.absoluteString)")
}

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if let incomingURL = userActivity.webpageURL {
        print("Incoming URL is \(incomingURL)")
        let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
            guard error == nil else{
                print("Found an error! \(error!.localizedDescription)")
                return
            }
            if let dynamicLink = dynamicLink {
                self.handleIncomingDynamicLink(dynamicLink)
            }
        }
        if linkHandled {
            return true
        } else {
            return false
        }
    }
    return false
}

任何帮助将不胜感激——这是否可能是 Firebase 本身的问题?

SwiftUI 1.0/场景代理

你做同样的事情,但在你的 SceneDelegate 中,跟随回调:

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    if let incomingURL = userActivity.webpageURL {
        print("Incoming URL is \(incomingURL)")
        let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
            guard error == nil else{
                print("Found an error! \(error!.localizedDescription)")
                return
            }
            if let dynamicLink = dynamicLink {
                self.handleIncomingDynamicLink(dynamicLink)
            }
        }
}

SwiftUI 2.0/窗口组

使用 SwiftUI 2.0 life-cycle 您需要改用 .onContinueUserActivity,比如

WindowGroup {
    ContentView()
     .onContinueUserActivity(<your_activity_type_here>) { userActivity in
         if let incomingURL = userActivity.webpageURL {
              print("Incoming URL is \(incomingURL)")
              let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
                    guard error == nil else{
                         print("Found an error! \(error!.localizedDescription)")
                         return
                    }
                    if let dynamicLink = dynamicLink {
                         self.handleIncomingDynamicLink(dynamicLink)
                    }
              }
        }
    }
}

SwiftUI 2.0 / @main App 对于新的 SwiftUI 2.0,您可以仅使用 SwiftUI 制作应用程序。这意味着您不使用 AppDelegate 或 SceneDelegate。然后,您必须使用 .onOpenURL 来获取在您单击 link 时调用的任何操作。我将其用于 Firebase 动态链接。

WindowGroup {
  ContentView()
    .onOpenURL { url in
      // handle the URL that must be opened
      let incomingURL = url
      print("Incoming URL is: \(incomingURL)")
      let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
          guard error == nil else {
             print("Error found!: \(error!.localizedDescription)")
                return
          }
          if let dynamicLink = dynamicLink {
             self.handleDynamicLink(dynamicLink)
          }
       }
       if linkHandled{
          print("Link Handled")
          return
       }else{
          print("NO linkHandled")
          return
       }
    }
}

在 iOS 上配置 Firebase 动态链接有几个必须遵循的步骤。所以,我建议参考官方文档 here. Additionally, there is a Firecasts series that walks through all of the steps here.

我关注的是 Firecasts 系列,但我的设置略有不同;所以,我 运行 陷入了几个问题。首先,我使用的是自定义域。其次,我使用的是 SwiftUI。我只会解决我遇到的问题,所以请参阅完整的 Firecasts 系列以了解所有可怕的细节。

SwiftUI 2.0

您的应用需要处理两种不同类型的 link。首先,当您的应用已安装时(即 https://app.yourcustomdomain.com/...),您的应用需要处理 link。其次,您的应用需要处理在安装应用之前复制到剪贴板的 link(即 com.your.bundle.id://google/link/...)。

此外,您可能想要处理来自网络浏览器 (Safari) 的 links。在我的例子中,我从 QR 码扫描中处理 link。显然 NFC 标签扫描 links 也来自 Safari,但我无法证实这一点。

经过反复试验,我找到了一种使用 SwiftUI 处理所有这些问题的方法;目前尚不清楚这是否是官方推荐的方法,因此请谨慎行事。

首先,使用onOpenURL(perform:).onContinueUserActivity(_,perform:):

var body: some Scene {
    WindowGroup {
        ContentView()
            .onContinueUserActivity(NSUserActivityTypeBrowsingWeb, perform: onWebBrowserActivity)
            .onOpenURL(perform: onOpenURL)
    }
}

其次,定义onContinueUserActivity处理程序:

// Handles links originating from the web browser
func onWebBrowserActivity(_ userActivity: NSUserActivity) {
    guard let url = userActivity.webpageURL else {
        return
    }
    onOpenURL(url)
}

三、定义onOpenURL处理函数:

func onOpenURL(_ url: URL) {
    let dynamicLinks = DynamicLinks.dynamicLinks()
    if dynamicLinks.shouldHandleDynamicLink(fromCustomSchemeURL: url),
       let dynamicLink = dynamicLinks.dynamicLink(fromCustomSchemeURL: url) {
        handle(dynamicLink: dynamicLink)
    } else {
        handleUniversalLink(url: url)
    }
}

上面提到的两种类型的 links 都被传递到 onOpenURL 处理程序中,所以这个 if 语句处理这两种情况。

最后,(正如其他人提到的)处理通用 links:

func handleUniversalLink(url: URL) {
    let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(url) { dynamicLink, error in
        if let error = error {
            print("Could not follow the dynamic link \(error.localizedDescription)")
            return
        }
        if let dynamicLink = dynamicLink {
            self.handle(dynamicLink: dynamicLink)
        }
    }
    if linkHandled {
        print("Link handled")
    } else {
        print("Link not handled")
    }
}

自定义域

我必须遵循自定义域设置说明 here。具体来说,我必须设置 Firebase 托管,这需要添加 A DNS 记录(除了为动态链接 URL 前缀设置设置 TXT DNS 记录之外)。另外,我必须在 Info.plist

中指定自定义域
   <key>FirebaseDynamicLinksCustomDomains</key>
   <array>
           <string>https://app.yourcustomdomain.com</string>
   </array>