最近遇到的问题如下:
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之后,进行相应的操作。
假如您有合适的方案,欢迎进行评论。
网友评论