WKWebView的坑相信大家已经踩过很多了.之前cookie的问题已经处理过一些了.但是这次又出现了新坑.在第一次加载并且做页面内跳转时cookie丢了...好吧,下面是我找到的解决方法.
原贴:http://www.jianshu.com/p/85f24794bbea
我遇到的问题就是这个:302跳转Set-Cookie丢失
如果302跳转出现在你的第一次加载并且你使用了下面的方法设置第一次加载的Cookies,那么在302跳转时服务器Set-Cookie将不会被携带到下一次302跳转的目标请求中。
NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https:/a.com/test1"]];
[request setValue:[NSString stringWithFormat:@"%@=%@",@"a", @"1"] forHTTPHeaderField:@"Cookie"];
比如:第一次加载https:/a.com/test1,然后加载https:/a.com/test1设置Cookie为a=1,服务器在https:/a.com/test1中Set-Cookie a=2;然后302跳转到https:/a.com/test2,这个时候会发现https:/a.com/test2中获取到的a还是1,Set-Cookie并没有成功。
解决办法
1.加载一个本地为空的html,域名指向你的第一次加载的url的域名。
//加载本地html
[self.webView loadHTMLString:@"" baseURL:[NSURL URLWithString:@"https:/a.com"]];
2.通过以下方法,在第一次加载完成后,将需要设置的Cookies设置到WKWebView中,因为是加载的本地的html以下方法会立即执行。
// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
if (isFirstLoaded) {
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
//js函数
NSString *JSFuncString =
@"function setCookie(name,value,expires)\
{\
var oDate=new Date();\
oDate.setDate(oDate.getDate()+expires);\
document.cookie=name+'='+value+';expires='+oDate+';path=/'\
}";
//拼凑js字符串,按照自己的需求拼凑Cookie
NSMutableString *JSCookieString = JSFuncString.mutableCopy;
for (NSHTTPCookie *cookie in cookieStorage.cookies) {
if (![cookie.name isEqualToString:@"__cust"]) {
NSString *excuteJSString = [NSString stringWithFormat:@"setCookie('%@', '%@', 3);", cookie.name, cookie.value];
[JSCookieString appendString:excuteJSString];
}
}
//执行js
[webView evaluateJavaScript:JSCookieString completionHandler:^(id obj, NSError * _Nullable error) {
//加载真正的第一次Request
[self loadRealRequest];
}];
}
}