iOS WKWebView Cookie同步

阅读:478 2019-03-19 15:02:07 来源:新网

uiwebview从ios2就有,ios8以后,苹果推出了新框架webkit,提供了替换uiwebview的组件wkwebview。各种uiwebview的性能问题没有了,速度更快了,占用内存少了,体验更好了,下面列举一些其它的优势:

1、在性能、稳定性、功能方面有很大提升(加载速度,内存的提升谁用谁知道)2、更多的支持html5的特性3、官方宣称的高达60fps的滚动刷新率以及内置手势4、safari相同的javascript引擎5、将uiwebviewdelegate与uiwebview拆分成了14类与3个协议,包含该更细节功能的实现。相比之下,wkwebview复杂得多,一些常用api如下:

@protocolwknavigationdelegate@optional//请求之前,决定是否要跳转:用户点击网页上的链接,需要打开新页面时,将先调用这个方法。-(void)webview:(wkwebview*)webviewdecidepolicyfornavigationaction:(wknavigationaction*)navigationactiondecisionhandler:(void(^)(wknavigationactionpolicy))decisionhandler;//接收到相应数据后,决定是否跳转-(void)webview:(wkwebview*)webviewdecidepolicyfornavigationresponse:(wknavigationresponse*)navigationresponsedecisionhandler:(void(^)(wknavigationresponsepolicy))decisionhandler;//页面开始加载时调用-(void)webview:(wkwebview*)webviewdidstartprovisionalnavigation:(null_unspecifiedwknavigation*)navigation;//主机地址被重定向时调用-(void)webview:(wkwebview*)webviewdidreceiveserverredirectforprovisionalnavigation:(null_unspecifiedwknavigation*)navigation;//页面加载失败时调用-(void)webview:(wkwebview*)webviewdidfailprovisionalnavigation:(null_unspecifiedwknavigation*)navigationwitherror:(nserror*)error;//当内容开始返回时调用-(void)webview:(wkwebview*)webviewdidcommitnavigation:(null_unspecifiedwknavigation*)navigation;//页面加载完毕时调用-(void)webview:(wkwebview*)webviewdidfinishnavigation:(null_unspecifiedwknavigation*)navigation;//跳转失败时调用-(void)webview:(wkwebview*)webviewdidfailnavigation:(null_unspecifiedwknavigation*)navigationwitherror:(nserror*)error;//如果需要证书验证,与使用afn进行https证书验证是一样的-(void)webview:(wkwebview*)webviewdidreceiveauthenticationchallenge:(nsurlauthenticationchallenge*)challengecompletionhandler:(void(^)(nsurlsessionauthchallengedispositiondisposition,nsurlcredential*__nullablecredential))completionhandler;//9.0才能使用,web内容处理中断时会触发-(void)webviewwebcontentprocessdidterminate:(wkwebview*)webviewns_available(10_11,9_0);@endcookie同步

不同于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可能不同,否则,因此需要手动替换,否则同样无法同步。

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服