美文网首页
这样子能否从WKWebview中获取Cookie呢?

这样子能否从WKWebview中获取Cookie呢?

作者: CocoaJason | 来源:发表于2018-01-01 19:32 被阅读47次

最近遇到的问题如下:

1.iOS的网络请求,UIWebview的HTML加载,其cookie均会由系统存储到 NSHTTPCookieStorage 中。

2.WKWebview的cookie有其单独的容器存储,而且在iOS 11中放出的API中才找到。

3.由于要使用WKWebview(取代UIWebview)来获取更好的加载体验,造成只能从 NSHTTPCookieStorage中取得cookie,向其中注入的cookie,前端获取不到。


由于暂时找不到如何处理WKWebview的cookie问题,所以做出如下几种方案

方案一:

(1)拦截所有的HTML加载请求
(2)判断此请求头部有没有cookie字段,假如有,便允许此请求继续,假如没有执行(3)。
(3)取消此次请求,不允许其加载
(4)向前面获取到的请求头中注入cookie
(5)加载此次网络请求,此时此请求已无效,会回到第一步加载添加过头部的请求
方案一的结果:
(1)WKWebview的HTML请求,只要是能获取到的请求,都能够添加成功。
(2)遇到的问题就是:对于前端发起的网络请求,在其通过‘document.getCookie();’获取cookie的时候,却有时候能够获取到,有时候获取不到。

document.getCookie();

猜测是跟WKWebview的cookie保存机制有关系。通过向请求头注入cookie,前端取得的cookie是浏览器中保存的,并非是请求头中注入的。


方案二:

document.setCookie(cookie);

在网页加载完成之后,执行js方法(document.setCookie(cookie);),但是依然会出现第一种方案的问题,造成前段在获取cookie(document.getCookie();)时,获取不到。

猜测
在页面加载完成时调用此函数,虽然能够调用成功(猜想),但是并未能够在前端需要使用的时候注入,因此造成前端使用时并未获取到。

方案三和四,均未验证,需要由前端的小伙伴配合验证

方案三:

(1)移动端在加载HTML时,将cookie所需要保存的字段,拼接到URL后面
(2)前段通过截取URL来获取参数并且暂时保存。

www.test.a?cookie=ss

方案四:

(1)前段声明JS函数:

function sendCookieMesaageToWKWebview() {                 
      window.webkit.messageHandlers.ocMethodName.postMessage();
};

function WKWebviewSetCookie(cookie){
    document.setCookie(cookie);
    getUserInfo();
}
        
function getUserInfo(){
    document.getCookie();
        //do somtThing
        //send a get request 
}

(2)前段通过js(sendCookieMesaageToWKWebview)向移动端发送获取cookie的消息;
(3)移动端在接收到上一步的消息之后,执行前端js函数(function WKWebviewSetCookie(cookie));
(4)前端在接收到移动端发送来的cookie之后,进行相应的操作。

假如您有合适的方案,欢迎进行评论。

相关文章

网友评论

      本文标题:这样子能否从WKWebview中获取Cookie呢?

      本文链接:https://www.haomeiwen.com/subject/wdatnxtx.html