WKWebView的session存储

2017-12-25  本文已影响0人  婼熙之名

WKWebView不自动存储session的问题(参考别人)

1)预加载一次HTML只加载不显示(获得Cookies,存储传递)

//加载本地html

[self.webView loadHTMLString:@"" baseURL:[NSURL URLWithString:self.url]];

2)实现一下两个代理方法(上面出现过),直接复制就行

// 页面加载完成之后调用   ----- self.isFirstLoad:是否首次调用,首次调用才存储

//下面是上图的代码,直接复制即可

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{

if (!self.isFirstLoad) {

//取出cookie

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=/'\

}\

function getCookie(name)\

{\

var arr = document.cookie.match(new RegExp('(^| )'+name+'=({FNXX==XXFN}*)(;|$)'));\

if(arr != null) return unescape(arr[2]); return null;\

}\

function delCookie(name)\

{\

var exp = new Date();\

exp.setTime(exp.getTime() - 1);\

var cval=getCookie(name);\

if(cval!=null) document.cookie= name + '='+cval+';expires='+exp.toGMTString();\

}";

//拼凑js字符串

NSMutableString *JSCookieString = JSFuncString.mutableCopy;

for (NSHTTPCookie *cookie in cookieStorage.cookies) {

if (![cookie.name isEqualToString:@"__cust"]) {

NSString *excuteJSString = [NSString stringWithFormat:@"setCookie('%@', '%@', 1);", cookie.name, cookie.value];

[JSCookieString appendString:excuteJSString];

}

}

//执行js

[webView evaluateJavaScript:JSCookieString completionHandler:^(id obj, NSError * _Nullable error) {

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.url]]];

}];

self.isFirstLoad = YES;

}

}

//--------------- 在收到响应后,决定是否跳转

//以下是上图的代码

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{

//存储session

NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;

NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL];

for (NSHTTPCookie *cookie in cookies) {

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

}

//允许跳转

decisionHandler(WKNavigationResponsePolicyAllow);

}

上一篇下一篇

猜你喜欢

热点阅读