Swift iOS中的动态链接web URL查询项为空

Swift iOS中的动态链接web URL查询项为空,ios,swift,deep-linking,firebase-dynamic-links,ios-universal-links,Ios,Swift,Deep Linking,Firebase Dynamic Links,Ios Universal Links,我从QRCODE扫描中获得了deeplink URL,但它显示Web URL查询为空(使用firebase动态链接实现)。关联域设置为“applinks:avrhub.page.link/Product” info.plist中的“FireBaseDynamicClinksCustomDomains”设置为https://avrhub.page.link“和”https://avrhub.page.link/Product" 深度链接url: func handleIncomingDynami

我从QRCODE扫描中获得了deeplink URL,但它显示Web URL查询为空(使用firebase动态链接实现)。关联域设置为“applinks:avrhub.page.link/Product”

info.plist中的“FireBaseDynamicClinksCustomDomains”设置为https://avrhub.page.link“和”https://avrhub.page.link/Product"

深度链接url:

func handleIncomingDynamicLink(_ dynamicLink:DynamicLink){
    
    
    
    guard let url = dynamicLink.url else {
            print("My Dynamic Link object has no url")
            return
        }
        print("Your Incoming link Parameter is \(url.absoluteString)")
        
        guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
        let queryItems = components.queryItems else {return}
        for queryItem in queryItems {
            
            Api.Params.inputProductId = Int(queryItem.value!)!
            print("Parameter \(queryItem.name) has a value of \(queryItem.value ?? "")")
        }
        
        Switcher.updateRootVC()
        Api.Params.isDeepLink = true

        if dynamicLink.matchType == .unique {
            print("The dynamic link is Unique")
        }
    }


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
    
}


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

        ApplicationDelegate.shared.application(
            app,
            open: url,
            sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
            annotation: options[UIApplication.OpenURLOptionsKey.annotation]
        )
        
        
        
        if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url){
            self.handleIncomingDynamicLink(dynamicLink)
            return true
        } else {
            return GIDSignIn.sharedInstance().handle(url)
        }


    }
深度链接代码:

func handleIncomingDynamicLink(_ dynamicLink:DynamicLink){
    
    
    
    guard let url = dynamicLink.url else {
            print("My Dynamic Link object has no url")
            return
        }
        print("Your Incoming link Parameter is \(url.absoluteString)")
        
        guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
        let queryItems = components.queryItems else {return}
        for queryItem in queryItems {
            
            Api.Params.inputProductId = Int(queryItem.value!)!
            print("Parameter \(queryItem.name) has a value of \(queryItem.value ?? "")")
        }
        
        Switcher.updateRootVC()
        Api.Params.isDeepLink = true

        if dynamicLink.matchType == .unique {
            print("The dynamic link is Unique")
        }
    }


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
    
}


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

        ApplicationDelegate.shared.application(
            app,
            open: url,
            sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
            annotation: options[UIApplication.OpenURLOptionsKey.annotation]
        )
        
        
        
        if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url){
            self.handleIncomingDynamicLink(dynamicLink)
            return true
        } else {
            return GIDSignIn.sharedInstance().handle(url)
        }


    }
即使是分析也没有给出任何错误


如评论中所述,您不能在firebase控制台中创建带有可变产品id的动态链接,而是需要在运行时生成该链接。如果需要,您还可以包括其他参数,这可能有助于分析,例如,如果您想知道哪个用户共享链接及其影响

在我看来,最好在链接中添加产品id作为查询参数。此外,在多参数的情况下,它也会有所帮助。您可以使用参数名称轻松解析它,例如:

var productId: String?
let urlComponents = URLComponents(string: urlString)
if let queryItems = urlComponents?.queryItems {
    for queryItem in queryItems {
        if queryItem.name == "product_id" {
           productId = queryItem.value
        }
    }
}
下面是我用编程方式生成动态链接的代码

func generateAndShareDynamicLink(event: Event, controller: UIViewController, presentationCompletion: @escaping (() -> Void), dismissCompletion: @escaping (() -> Void) ) {
        
        let user = Utility.shared.getCurrentUser()!
        let ownReferralCode = user.ownReferralCode.value
        let offerShareUrlString = youAPILink + "?referral=" + ownReferralCode + "&event_id=" + event.id.value + "&shared_by=" + user.userId.value + "&shared_by_name=" + user.fullName.value
        
        let url = URL(string: offerShareUrlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!)!
        
        let iOSNavigationParams = DynamicLinkNavigationInfoParameters()
        iOSNavigationParams.isForcedRedirectEnabled = false
        
        let linkComponents = DynamicLinkComponents(link: url, domainURIPrefix: dynamicLinkGenaricDomain)!
        linkComponents.navigationInfoParameters = iOSNavigationParams
        linkComponents.iOSParameters = DynamicLinkIOSParameters(bundleID: bundleId)
        linkComponents.iOSParameters?.appStoreID = kAppStoreId
        linkComponents.iOSParameters?.customScheme = theBarCodeInviteScheme
        
        linkComponents.androidParameters = DynamicLinkAndroidParameters(packageName: androidPackageName)
        
        let descText = "\(user.fullName.value) has shared an event with you, check it out!"
        linkComponents.socialMetaTagParameters = DynamicLinkSocialMetaTagParameters()
        linkComponents.socialMetaTagParameters?.title = "App Name"
        linkComponents.socialMetaTagParameters?.descriptionText = descText
        linkComponents.socialMetaTagParameters?.imageURL = tbcLogoUrl
        
        linkComponents.otherPlatformParameters = DynamicLinkOtherPlatformParameters()
        linkComponents.otherPlatformParameters?.fallbackUrl = URL(string: barCodeDomainURLString)
        
        linkComponents.shorten { (shortUrl, warnings, error) in
            
            guard error == nil else {
                presentationCompletion()
                controller.showAlertController(title: "Share Event", msg: error!.localizedDescription)
                return
            }
            
            if let warnings = warnings {
                debugPrint("Dynamic link generation warnings: \(String(describing: warnings))")
            }
            
            let activityViewController = UIActivityViewController(activityItems: [descText, shortUrl!], applicationActivities: nil)
            activityViewController.popoverPresentationController?.sourceView = controller.view
            activityViewController.completionWithItemsHandler = { (activityType, completed:Bool, returnedItems:[Any]?, error: Error?) in
                dismissCompletion()
            }
            controller.present(activityViewController, animated: true, completion: {
                presentationCompletion()
            })
        }
        
    }

我同意另一个答案,即解决此问题的最佳方法是让后端开发人员使用Firebase Dynamic Links SDK正确生成动态链接并嵌入二维码

但是,如果您无法控制该链接,则可以获取传入链接并解析它以获取嵌入的产品ID。在这种情况下,您不需要使用某些动态链接功能,例如,您可以执行以下操作:

if let incomingURL = userActivity.webpageURL {
    print("incoming URL is \(incomingURL)")
    handleIncomingURL(incomingURL)
}
//快速而肮脏的解析-您可以根据您的环境做一些更健壮的事情

func handleIncomingURL(_ url:URL) {
    
    guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true), let host = components.host else {
        return
    }
    var pathComponents = components.path.components(separatedBy: "/")
    // the first component is empty
    pathComponents.removeFirst()
    
    if pathComponents[0] == "Product" && pathComponents[1] != nil {
        print("found productId: \(pathComponents[1])")
        //Action here: jump to the right page from here, now that you have a product ID to work with
    } else {
        print("invalid URL path for my use case....")
    }
}

我也有同样的问题,在尝试从下面的函数获取Firebase动态链接时,我总是获取
nil

dynamicLink.dynamicLink().dynamicLink(:)

我在Github上的一篇有用的文章中发现,该文章解释了我们需要在动态链接中使用的
.plist
文件中添加域

这对我来说很有用,也许这会有帮助

您可以在plist中添加域,如下所示:

<key>FirebaseDynamicLinksCustomDomains</key>
    <array>
        <string><YOUR_DOMAIN_NAME></string>
    </array>
FireBaseDynamicClinksCustomDomains

如果你点击“通用”链接时,应用程序似乎正在打开,那么这一部分似乎已经设置好了。猜测它是如何组成完整的通用链接。链接是否在firebase控制台中创建?通过编程?您是否能够通过在浏览器中调试来查看链接
example.page.link/suffix?d=1
产品ID在您的示例中是“30”吗?@HanzalaRaza产品ID是动态的,因此您需要在移动中创建动态链接。通过使用Firebase的dynamic link SDK以编程方式创建它。否-您的BE开发人员似乎没有正确生成动态链接这同样的东西在多个平台上可用,您也可以在后端生成它。您好,我遇到了相同的错误,请检查下面的链接帮助我如果您有解决方案stackoverflow.com/q/67019905/11468227您好,我遇到了相同的错误,请检查下面的链接帮助我如果您有解决方案stackoverflow.com/q/67019905/11468227