使用WKWebURLSchemeHandler

使用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,非正規設置方法可能出現其他問題

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章