如何解析 Firebase Dynamic Link 参数值并将其放入变量中?

How to parse Firebase Dynamic Link parameter values and put it in a variable?

我正在构建一个可以接收 Firebase 的动态链接并将其重定向到某个 UIViewController 的应用程序。我已按照 this video 上的步骤进行操作,但仍有一些我不明白的地方。所以在我按照上面的步骤操作之后,我在调试区域将我的 link 打印成这样:

Incoming link parameter is https://play.google.com/store/apps/details?id=com.xxx.xxx&referrer=utm_source%3DXXX%26utm_medium%3Dxxx%26utm_campaign%3DXXX

Parameter id has a value of com.xxx.xxx

Parameter referrer has a value of utm_source=XXX&utm_medium=xxx&utm_campaign=XXX

这非常有效,但我想做的是获取 utm_sourceutm_mediumutm_campaign 的值并将其存储到变量中。我仍然不确定我如何设法实现这一目标。这是我的代码:

func handleIncomingDynamicLink(_ dynamicLink: DynamicLink) {
        guard let url = dynamicLink.url else {
            print("Dynamic Link has no URL")
            return
        }
        
        print("Incoming link parameter is \(url.absoluteString)")
        guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false), let queryItems = components.queryItems else { return }
        for queryItem in queryItems {
            print("Parameter \(queryItem.name) has a value of \(queryItem.value ?? "")")
        }
    }

那么我该如何做到这一点呢?如果您需要更多信息,请随时询问。谢谢。

以下是创建结构并为其赋值的方法。

struct MyVariable {
    var referrer: String?, utm_source: String?, utm_medium: String?, utm_campaign: String?
}

func handleIncomingDynamicLink(_ dynamicLink: URL?) {
    guard let string = dynamicLink?.absoluteString.removingPercentEncoding,
        let url = URL(string: string) else {
            print("Dynamic Link has no URL")
            return
    }
    var myVariable = MyVariable()
    guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
        let queryItems = components.queryItems else { return }
    for queryItem in queryItems {
        if queryItem.name == "referrer" {
            myVariable.referrer = queryItem.value
        } else if queryItem.name == "utm_source" {
            myVariable.utm_source = queryItem.value
        } else if queryItem.name == "utm_medium" {
            myVariable.utm_medium = queryItem.value
        } else if queryItem.name == "utm_campaign" {
            myVariable.utm_campaign = queryItem.value
        }
    }
    print("MyVariable: \(myVariable)")
}

我不知道这是否是最佳答案或正确的代码设计,但幸运的是我设法通过将 handleIncomingDynamicLink 函数更改为如下内容来解决:

func handleIncomingDynamicLink(_ dynamicLink: DynamicLink) {
        guard let url = dynamicLink.url else {
            print("Dynamic Link has no URL")
            return
        }
        
        print("Incoming link parameter is \(url.absoluteString)")
        guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false), let queryItems = components.queryItems else { return }
        for queryItem in queryItems {
            if queryItem.name == "referrer" {
                print("Referrer found")
                
                let referrerString = "https://xxx.page.link/details?\(queryItem.value ?? "")"
                let referrerUrl = URL(string: referrerString)
                
                guard let queryItemComponents = URLComponents(url: referrerUrl!, resolvingAgainstBaseURL: false), let itemComponents = queryItemComponents.queryItems else {
                    print("Referrer string couldn't be casted as a URL")
                    return
                }
                
                for item in itemComponents {
                    print("Parameter \(item.name) has a value of \(item.value ?? "")")
                }
                
            }
        }
    }

所以基本上我所做的就是获取主要 URL 的引荐来源值并将其设为“自定义 URL”,以便我可以使用 [=12= 解析这些值] 功能。输出正是我所期望的。

Incoming link parameter is https://play.google.com/store/apps/details?id=com.xxx.xxx&referrer=utm_source%3Dxxx%26utm_medium%3Dxxx%26utm_campaign%3Dxxx

Referrer found

Parameter utm_source has a value of xxx

Parameter utm_medium has a value of xxx

Parameter utm_campaign has a value of xxx