iOS8.0以后,蘋(píng)果推出了WKWebView锈拨,相比原來(lái)的UIWebView砌庄,WKWebView的體驗(yàn)有較大的提升,但同時(shí)也帶來(lái)了一些問(wèn)題推励。
1.代理方法的改變
WKWebView的代理和UIWebView相比有了很大的改變:
比如說(shuō)鹤耍,原來(lái)我們可以用
webView:shouldStartLoadWithRequest:navigationType:
來(lái)攔截url,但是WKWebView中并沒(méi)有現(xiàn)成的方法验辞,這時(shí)候稿黄,我們需要在WKWebView的代理方法中去取消請(qǐng)求:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if(...){//判斷是否取消
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
decisionHandler(WKNavigationActionPolicyAllow);
}
2.設(shè)置cookie
在UIWebView中,我們可以直接在NSHTTPCookieStorage中設(shè)置cookie跌造,打開(kāi)網(wǎng)頁(yè)時(shí)會(huì)自動(dòng)附帶上cookie杆怕,而WKWebView中則不會(huì),在對(duì)WKWebView設(shè)置cookie時(shí)壳贪,參考了幾篇文章陵珍,總體來(lái)說(shuō)有以下思路:
- 調(diào)用javascript代碼設(shè)置cookie:在網(wǎng)頁(yè)加載完成后,調(diào)用evaluateJavaScript:completionHandler:javascript代碼運(yùn)行來(lái)設(shè)置cookie违施,以下是設(shè)置cookie 的javascript代碼互纯,XXXXX的內(nèi)容請(qǐng)自行拼接
document.cookie = 'xxxxx';
此方法有一個(gè)缺點(diǎn),js設(shè)置cookie磕蒲,需要瀏覽器刷新界面后才會(huì)生效留潦,對(duì)于某些一打開(kāi)就判斷cookie的網(wǎng)頁(yè),此方法通常沒(méi)有效果辣往。
- 記得曾經(jīng)看到一篇文章說(shuō)在WKWebView的configuration中可以設(shè)置cookie兔院,但是本人測(cè)試好像并沒(méi)有達(dá)到預(yù)期的效果,不知道是否和javascript代碼一樣需要刷新網(wǎng)頁(yè)才會(huì)生效站削。
- 在request中直接設(shè)置cookie到header中坊萝,這是我目前能找到的最好的解決方案,以下是示例代碼:
NSMutableURLRequest *mrequest = [NSMutableURLRequest requestWithURL:request.URL];
//獲取原來(lái)的cookie
NSString *cookie = [self readCurrentCookie];
for (NSString *key in [cookies allKeys]) {
//如果沒(méi)有cookies中的值存在许起,就拼接上去
if ([cookie rangeOfString:key].length == 0) {
cookie = [NSString stringWithFormat:@"%@;%@=%@",cookie,key,[cookies objectForKey:key]];
}
}
//設(shè)置cookie到header
[mrequest addValue:cookie forHTTPHeaderField:@"Cookie"];
//打開(kāi)請(qǐng)求
[self.wkWebView loadRequest:mrequest];
3.網(wǎng)頁(yè)的截圖
在UIWebView中十偶,我們截圖可以通過(guò)與UIScrollerView相同的方法,就能獲取到整個(gè)網(wǎng)頁(yè)的截圖园细,而WKWebView中扯键,調(diào)用相同的方法,只能截取到一片空白珊肃,直到發(fā)現(xiàn)了這篇文章我只是想要截個(gè)屏(續(xù)) 通過(guò)作者的代碼荣刑,可以實(shí)現(xiàn)對(duì)WKWebView整個(gè)網(wǎng)頁(yè)的截圖馅笙,雖然還是有一定的瑕疵(比如說(shuō)有的圖片還沒(méi)加載完成就會(huì)變成黑的),不過(guò)只要再次截圖就可以了厉亏。作者的截圖代碼是用swift寫(xiě)的董习,為了使用方便,我將它翻譯成了OC的代碼爱只,方便OC的項(xiàng)目使用皿淋。
4.長(zhǎng)按保存圖片
這個(gè)功能相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,也是通過(guò)javascript代碼實(shí)現(xiàn)即可恬试,具體可以參考這篇文章的實(shí)現(xiàn)WKWebView實(shí)現(xiàn)長(zhǎng)按保存圖片
為了方便使用窝趣,我將封裝好的控件上傳到github,有需要的同學(xué)可以下載參考
GZCWebView
參考文章:
http://blog.csdn.net/reylen/article/details/46437517
http://blog.sina.com.cn/s/blog_5bc079940102wsok.html
https://my.oschina.net/u/2461772/blog/634958?p=%7B%7BcurrentPage+1%7D%7D