使用之初
在使用WKWebView之前,你一定覺得它比UIWebView更快割按,占用更少的內(nèi)存,使用更加靈活磷籍,摒棄了iOS7之后已經(jīng)迫不及待的要換上它适荣,但是在那之前還是多了解一下是否適合你的項目吧。
關于WKWebView和UIWebView的對比網(wǎng)上一大堆择示,總的來說無非都是說WKWebView的好處。不可否認的晒旅,WKWebView確實要好用栅盲,APP內(nèi)的表現(xiàn)也很好,但我還是吐吐槽吧废恋,順便記錄一下遇到的問題谈秫,如果有錯誤的認識歡迎拍磚指正,不勝感激鱼鼓。
關于緩存
眾所周知拟烫,WKWebView是沒有緩存的,所以也無從清理迄本。
因為現(xiàn)在WKWebView會忽視默認的網(wǎng)絡存儲硕淑, NSURLCache, NSHTTPCookieStorage, NSCredentialStorage。 目前是這樣的嘉赎,WKWebView有自己的進程置媳,同樣也有自己的存儲空間用來存儲cookie和cache, 其他的網(wǎng)絡類如NSURLConnection是無法訪問到的公条。 同時WKWebView發(fā)起的資源請求也是不經(jīng)過NSURLProtocol的拇囊,導致無法自定義請求。
這樣導致了在使用時遇到了H5頁面修改了靶橱,APP卻沒有更新到寥袭,想清理緩存卻無從下手,悲催的我只好在url后面加上時間戳关霸,算是解決了這個問題传黄。(如果你沒有碰到這個情況,那算我的靈異事件了队寇。尝江。)
let url = NSURL(string: "http://xxxx?timestamp=\(NSDate().timeIntervalSince1970)")!
webView.loadRequest(NSURLRequest(URL: url))
關于Cookie
在使用UIWebVIew的時候我們并不關心Cookie,因為在調(diào)用登錄接口的時候無論是AFNetworking英上,還是AlamoFire炭序,登錄成功之后都會保存在
NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies
UIWebView也從這里面取啤覆,所以調(diào)用接口之后UIWebView一路暢通,但WKWebView就不知道往哪里扔了惭聂,全無頭緒窗声。好吧,既然你不來取辜纲,那我扔給你好了笨觅。
lazy var cookieString:String! = {
let cookiesStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
var cookieStr = ""
cookiesStorage.cookies?.forEach({ cookie in
cookieStr += "\(cookie.name)=\(cookie.value);"
})
return cookieStr
}()
func loadUrl() {
let url = NSURL(string: "http://bchat.ocmcom.com/HUser/user")!
let request = NSMutableURLRequest(URL: url)
request.addValue(cookieString, forHTTPHeaderField: "Cookie")
webView.loadRequest(request)
}
好了,這個Request有Cookie了耕腾,但是隨便點擊跳轉別的地方见剩,又沒了,坑爹呢這是扫俺。苍苞。。好吧狼纬,再想辦法
let userScript = WKUserScript(source: cookieJS, injectionTime: .AtDocumentStart, forMainFrameOnly: false)
webView.configuration.userContentController.addUserScript(userScript)
好了羹呵,后續(xù)也有了,又算是解決了吧疗琉。但始終有個頁面要二次進入才有冈欢,不明白。
關于彈窗
開始我想看看iOS調(diào)用JS是否成功盈简,于是寫了一個JS方法
function testAlert() {
alert('this is alert test')
}
結果完全沒反應啊~~凑耻。原來要實現(xiàn)WKUIDelegate
optional public func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: () -> Void)
好吧,一切DIY柠贤,俗話說的好拳话,雙手健全,交什么女朋友种吸。
而且更自由弃衍,原生交互體驗更佳。我就這么說服自己了坚俗。
關于跨域
緊接著镜盯,有一個界面要跳到支付寶頁面去支付,結果怎么點怎么都沒反應啊親猖败。
你要不要這么傲嬌速缆。一定是我哪里沒設置好。
好吧恩闻,果然如此艺糜,它就藏在WKNavigationDelegate里面
// 這個方法決定導航的動作,處理鏈接能否導航。
// WebKit對跨域進行了安全檢查限制破停,不允許跨域翅楼。
// 因此我們要對不能跨域的鏈接單獨處理。
public func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void)
結尾
最終我還是換回了UIWebView真慢,倍感輕松毅臊,但是這種感覺好不爽。
WKWebView始終給我半成品的感覺黑界,各種Android那邊正常到iOS這邊怎么不行的問題管嬉,我是比較喜歡推陳出新的,但如果這種東西需要程序猿花費太多精力來處理兼容的話朗鸠,還是先不要上到項目來吧蚯撩,畢竟大家都這么忙。