美文网首页
WKWebView的session存储

WKWebView的session存储

作者: 婼熙之名 | 来源:发表于2017-12-25 16:41 被阅读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);

    }

    相关文章

      网友评论

          本文标题:WKWebView的session存储

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