iOS 应用程序:Firebase 动态链接不适用于最新的 Pod 文件

iOS Application: Firebase Dynamic Links are not working with latest Pod file

我们将最新的 Dynamic link Pod 集成到我们的 iOS 应用程序中。

每当我们打开 link 的 firebase 时,我们的 Appdelegate 中不会触发任何功能。 查看我们在App delegate

中实现的方法
    func application(_ application: UIApplication, continue userActivity: NSUserActivity,     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
 DynamicLinks.dynamicLinks().handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in
     if(dynamiclink != nil){
         let aStr = dynamiclink!.url!.absoluteString
         print("reopen url :\(String(describing: aStr.removingPercentEncoding))")
         let decodeUrl = aStr.removingPercentEncoding!
     }
 }
 return true 
}

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
 print("got link1")
 print(" first time url :\(url)")
 let aStr = url.absoluteString
 print("url :\(String(describing: aStr.removingPercentEncoding))")
 let decodeUrl = aStr.removingPercentEncoding!
 if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
     if dynamicLink.url != nil{
         let aStr = dynamicLink.url!.absoluteString
         let decodUrl = aStr.removingPercentEncoding!
     }
 }
return true }

我们在应用程序中使用自定义域,我们也在 info.plist 中添加了它们

<key>FirebaseDynamicLinksCustomDomains</key>
<array>
    <string>https://page.google.com/newrequest</string>
</array>
<key>FirebaseAppDelegateProxyEnabled</key>
<string>YES</string>

我们向我们的 AssociatedDomains 添加了动态 link URL,其前缀为应用程序 links,例如 applinks:page.google.com

试试这个:这可能会解决您最初的 DL 问题,并按照以下代码解决评论中提到的问题。

您可以在以下函数中获取URL(将这些方法添加到您的App Delegate中):

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    if DynamicLinks.dynamicLinks().shouldHandleDynamicLink(fromCustomSchemeURL: url) {
            let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url)
            self.handleDynamicLink(dynamicLink)
            return true
    }
}

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        if let incomingURL = userActivity.webpageURL {
            print(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.handleDynamicLink(dynamicLink)
                }
            }

            if linkHandled {
                return true
            }
            else {
                //May be do other things with our incoming URL?
                return false
            }
        }

        return false
    }

handleDynamicLink 方法:

func handleDynamicLink(_ dynamicLink: DynamicLink?) {
        guard let dynamicLink = dynamicLink else { return }
        guard let deepLink = dynamicLink.url else { return }
    }

不要忘记添加:

希望这能解决您的问题。

在iOS13,AppDelegate方法不会调用。将 SceneDelegate 添加到您的项目。添加 func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { print(userActivity.webpageURL) }

我们会得到userActivity.webpageURL将是我们的长动态link。

回答 Swift 5.0 和 iOS 14.0

对于那些仍在努力管理 SceneDelegate 中的深度 links 的人,这个答案可能会有所帮助。

案例 1:应用是 运行(前景和背景):

首先你应该记住,在 iOS 13 更新后,深层 link 不再由 UIApplicationDelegate 管理,这项工作移交给 SceneDelegate .

所以对于第一种情况,你需要添加下面的方法来处理用户点击深度时的事件link

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        
        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
            let url = userActivity.webpageURL,
            let host = url.host else {
                return
        }
        
        DynamicLinks.dynamicLinks().handleUniversalLink(url) { dynamicLink, error in
            guard error == nil,
                let dynamicLink = dynamicLink,
                let urlString = dynamicLink.url?.absoluteString else {
                    return
            }
            print("Dynamic link host: \(host)")
            print("Dyanmic link url: \(urlString)")
            
            // Handle deep links
            self.handleDeepLink(urlString: urlString)
            
            print("Dynamic link match type: \(dynamicLink.matchType.rawValue)")
        }
    }

情况二:应用不是运行(Kill模式):

如果应用程序不是 运行,那么在 SceneDelegateconnectionOptions 中可以使用更深的 link。所以你需要在willConnectTo(:)方法中编写代码来管理Firebase深度links。

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

        if let userActivity = connectionOptions.userActivities.first {
            if let incomingURL = userActivity.webpageURL {
                _ = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
                    guard error == nil else { return }
                    if let dynamicLink = dynamicLink {
                        if let urlString = dynamicLink.url?.absoluteString {
                            // Handle deep links
                            self.handleDeepLink(urlString: urlString)
                        }
                    }
                }
            }
        }
    }