我们想从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?
答案 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
}