使用WKWebURLSchemeHandler
iOS11以上,蘋果爲WKWebView增加了WKURLSchemeHandler協議,可以爲自定義的Scheme增加遵循WKURLSchemeHandler協議的處理。其中可以在start和stop的時機增加自己的處理。
遵循協議中的兩個方法
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) { let proxy_server = "YourProxyServer" // proxy server
let proxy_port = 1234 // your port
let hostKey = kCFNetworkProxiesHTTPProxy as String
let portKey = kCFNetworkProxiesHTTPPort as String
let proxyDict:[String:Any] = [kCFNetworkProxiesHTTPEnable as String: true, hostKey:proxy_server, portKey: proxy_port] let config = URLSessionConfiguration.ephemeral
config.connectionProxyDictionary = proxyDict
let defaultSession = URLSession(configuration: config)
dataTask = defaultSession.dataTask(with: urlSchemeTask.request, completionHandler: {[weak urlSchemeTask] (data, response, error) in
/// 回調時urlSchemeTask容易崩潰,可能蘋果沒有考慮會在handler裏做異步操作,這裏試了一下weak寫法,崩潰不出現了,不確定是否爲完全解決方案
guard let urlSchemeTask = urlSchemeTask else { return
}
if let error = error {
urlSchemeTask.didFailWithError(error)
} else { if let response = response {
urlSchemeTask.didReceive(response)
}
if let data = data {
urlSchemeTask.didReceive(data)
}
urlSchemeTask.didFinish()
}
})
dataTask?.resume()
}
當然這裏URLSession的處理和URLProtocol一樣,可以進行復用處理。
然後生成WKWebviewConfiguration,並使用官方API將handler設置進去。
let config = WKWebViewConfiguration()
config.setURLSchemeHandler(HttpProxyHandler(), forURLScheme: "http")//拋出異常
但因爲蘋果的setURLSchemeHandler只能對自定義的Scheme進行設置,所以像http和https這種scheme,已經默認處理了,不能調用這個API,需要用KVC取值進行設置。
extension WKWebViewConfiguration{ class func proxyConifg() -> WKWebViewConfiguration{ let config = WKWebViewConfiguration() let handler = HttpProxyHandler() /// 先設置
config.setURLSchemeHandler(handler, forURLScheme: "dummy") let handlers = config.value(forKey: "_urlSchemeHandlers") as! NSMutableDictionary
handlers["http"] = handler
handlers["https"] = handler return config
}
}
然後給WKWebview設置就能使用了。
優點:
-
蘋果官方方法
-
無審覈風險
缺點:
-
僅支持iOS11以上
-
官方不支持非自定義Scheme,非正規設置方法可能出現其他問題