检查URL与UIWebView的请求或WKWebView的navigationAction.request是否相等

时间:2018-07-20 04:31:16

标签: ios swift url uiwebview

我们想从URL的受控列表中加载UIWebView(或WKWebView)内容。我们希望确保没有可能的网络导航。我们想到了webView:shouldStartLoadWith:navigationType:,但是来自webView的request.url在URL的主机后面附加了斜杠,使其不适合直接比较。

我们要加载的不同URL的示例:

// example 1
let url = URL(string: "https://example.com/foo/")!

// example 2
let url = URL(string: "https://example.com/foo")!

// example 3
let url = URL(string: "https://example.com")!

我们如何加载请求:

webView.loadRequest(URLRequest(url: url))

我们如何控制请求

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    return request.url == url
}

第一个示例有效,因为request.url确实等于https://example.com/foo/

第二个示例可行,因为request.url确实等于https://example.com/foo

但是第三个示例失败了,因为request.url现在是https://example.com/而不是https://example.com

为了支持正确的比较,如何像UIWebView一样标准化URL?

2 个答案:

答案 0 :(得分:2)

一种解决方法是,您可以采用URL的absoluteString属性,如果最后一个元素为'/',则可以删除它并进行比较。

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if let url = request.url{
        var requestUrlArray = url.absoluteString.map { String($0) }
        if let lastElement = requestUrlArray.last, lastElement == "/"{
            _ = requestUrlArray.popLast()
        }
        let requestUrlString =  requestUrlArray.joined()
        return requestUrlString == url.absoluteString
    }
    return false
}

答案 1 :(得分:0)

从您的问题来看,您似乎想允许使用相同主机的网址,在这种情况下……

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    return request.url.host == url.host
}