{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
uiwebview从ios2就有,ios8以后,苹果推出了新框架webkit,提供了替换uiwebview的组件wkwebview。各种uiwebview的性能问题没有了,速度更快了,占用内存少了,体验更好了,下面列举一些其它的优势:
1、在性能、稳定性、功能方面有很大提升(加载速度,内存的提升谁用谁知道)2、更多的支持html5的特性3、官方宣称的高达60fps的滚动刷新率以及内置手势4、safari相同的javascript引擎5、将uiwebviewdelegate与uiwebview拆分成了14类与3个协议,包含该更细节功能的实现。相比之下,wkwebview复杂得多,一些常用api如下:
@protocolwknavigationdelegate
不同于uiwebview,wkwebview会忽视默认的网络存储,nsurlcache,nshttpcookiestorage,nscredentialstorage。目前是这样的,wkwebview有自己的进程,同样也有自己的存储空间用来存储cookie和cache,其他的网络类如nsurlconnection是无法访问到的。同时wkwebview发起的资源请求也是不经过nsurlprotocol的,导致无法自定义请求。
方法1、同域名c/s->b/s同步
如果c/s和b/s中,服务器端域名一致的话,在初始化wkwebview时同步即可
nsurl*url=[nsurlurlwithstring:urlstring];nsmutablestring*cookies=[nsmutablestringstring];nsmutableurlrequest*requestobj=[nsmutableurlrequestrequestwithurl:urlcachepolicy:nsurlrequestuseprotocolcachepolicytimeoutinterval:10];//一般都只需要同步jsessionid,可视不同需求自己做更改nsstring*jsessionid;//获取本地所有的cookiensarray*tmp=[[nshttpcookiestoragesharedhttpcookiestorage]cookies];for(nshttpcookie*cookieintmp){if([cookie.nameisequaltostring:@"jsessionid"]){jsessionid=cookie.value;break;}}if(jsessionid.length){//格式化cookie[cookiesappendformat:@"jsessionid=%@;",jsessionid];}//注入cookie[requestobjsetvalue:cookiesforhttpheaderfield:@"cookie"];//加载请求[self.wk_webviewloadrequest:requestobj];
方法2、不同域名c/s->b/s
注意:我们这里实际上重新loadrequest了,正常情况下,我们应该拷贝原来的request
nsmutableurlrequest*mutablerequest=[requestmutablecopy];//拷贝request
方法三3、b/s->c/s同步
在wkwebview接收到response后,将response带的cookies取出,然后直接放入[nshttpcookiestoragesharedhttpcookiestorage]容器中:
-(void)webview:(wkwebview*)webviewdecidepolicyfornavigationresponse:(wknavigationresponse*)navigationresponsedecisionhandler:(void(^)(wknavigationresponsepolicy))decisionhandler{nshttpurlresponse*response=(nshttpurlresponse*)navigationresponse.response;nsarray*cookies=[nshttpcookiecookieswithresponseheaderfields:[responseallheaderfields]forurl:response.url];for(nshttpcookie*cookieincookies){[[nshttpcookiestoragesharedhttpcookiestorage]setcookie:cookie];}decisionhandler(wknavigationresponsepolicyallow);}
所有的同步过程中,我们发现使用了nshttpcookiestorage(当然uiwebview也使用了此类自动同步),对于方法1而言,对于跳转则会丢失cookie,因此实际使用中推荐2、3两种方法。
注意:方法2给出的是个简单例子,由于不同域名同步时,我们获取到cookie种domain和path可能不同,否则,因此需要手动替换,否则同样无法同步。