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

Posted

技术标签:

【中文标题】检查 URL 是不是与 UIWebView 的请求或 WKWebView 的 navigationAction.request 相等【英文标题】:Check for equality of an URL with UIWebView's request or WKWebView's navigationAction.request检查 URL 是否与 UIWebView 的请求或 WKWebView 的 navigationAction.request 相等 【发布时间】:2018-07-20 04:31:16 【问题描述】:

我们希望从受控的 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?

【问题讨论】:

shouldStartLoadWith 中尝试webView.url @Jack webView.url 不存在:“'UIWebView' 类型的值没有成员'url' 仅供参考:UIWebView 已弃用。你应该改用WKWebView @MichaelHulet 完成,但同样的问题,啊啊。 【参考方案1】:

一种解决方法是您可以获取 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

【讨论】:

【参考方案2】:

从您的问题来看,您似乎希望允许 url 具有相同的主机,在这种情况下......

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

【讨论】:

以上是关于检查 URL 是不是与 UIWebView 的请求或 WKWebView 的 navigationAction.request 相等的主要内容,如果未能解决你的问题,请参考以下文章

iOS 如何为每个 UIWebView 请求添加 cookie?

在ios uiwebview objective-c中检查布尔值是yes还是no时出错

在调用 UIWebView 的 loadHTMLString 时拦截和修改资源/url 请求

如何仅加载请求的 UIWebView url 的特定部分?

UIWebView带Post请求地址

在 UIWebview 中加载带有帖子的 URL 的问题