美文网首页程序员iOS实用功能
WKWebView对cookie的处理

WKWebView对cookie的处理

作者: 鄂北 | 来源:发表于2019-10-16 09:27 被阅读0次

小编在网上查了很多wkwebview怎么去保存cookie,怎么保证cookie不丢失的资料,可大多发现说的不怎么清楚,无法处理cookie丢失的问题。在这里贴上小编的代码,让童鞋们拿来就能用。当然这是在你第一次用wkwebview加载url的时候是有cookie的情况下的,如果不是在这种情况下的,代码就需要改动一下,但原理还是一样的。

第一步:先获取cookie并保存cookie

// 此方法是收到响应开始加载后才会调用
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
    
    // 获取cookie
    if (@available(iOS 12.0, *)) {//iOS11也有这种获取方式,但是我使用的时候iOS11系统可以在response里面直接获取到,只有iOS12获取不到
        WKHTTPCookieStore *cookieStore = webView.configuration.websiteDataStore.httpCookieStore;
        [cookieStore getAllCookies:^(NSArray* cookies) {
            [self setCookie:cookies];
        }];
    }else {
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;
        NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL];
        [self setCookie:cookies];
    }
    
    decisionHandler(WKNavigationResponsePolicyAllow);
}

// 保存cookie到NSHTTPCookieStorage
-(void)setCookie:(NSArray *)cookies {
    if (cookies.count > 0) {
        for (NSHTTPCookie *cookie in cookies) {
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        }
    }
}

先是在wkwebview的代理方法中获取到第一次加载url的cookie,并保存到NSHTTPCookieStorage中。NSHTTPCookieStorage是一个保存cookie的单例
其中获取cookie的方式在iOS12以前和iOS12以后有所区别,代码里做了分别的处理。

第二步在以后加载url时将保存在NSHTTPCookieStorage中cookie放到请求中

    // 在此处获取返回的cookie
    NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
    
    NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
    NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    
    for (NSHTTPCookie *cookie in [cookieJar cookies]) {
        [cookieDic setObject:cookie.value forKey:cookie.name];
    }
    
//     cookie重复,先放到字典进行去重,再进行拼接
    for (NSString *key in cookieDic) {
        NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];
        [cookieValue appendString:appendString];
    }
            
    
    // 对链接进行UTF-8编码,防止中文字符
    NSString * encodedString = [self.url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    // 设置请求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:encodedString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20];

    [request addValue:cookieValue forHTTPHeaderField:@"Cookie"];

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.wkwebview loadRequest:request];
    });

加上这两步wkwebview的cookie问题就解决了,是不是很简单也很实用呢

相关文章

  • WKWebView对cookie的处理

    小编在网上查了很多wkwebview怎么去保存cookie,怎么保证cookie不丢失的资料,可大多发现说的不怎么...

  • WKWebView对Cookie的处理

    因为WKWebView是通过WebKit内核进行网络处理的,所以我们的NSHTTPCookieStorage里的C...

  • H5遇到的常见问题

    iOS WKWebView cookie 写入慢以及易丢失 现象: 原因:WKWebView 对 NSHTTPCo...

  • 再会WKWebView

    有关WKWebView处理cookie问题,又多次测试,发现并不需要在 初识WKWebView那么麻烦,有更简...

  • WKWebView处理cookie问题

    问题描述 公司接入第三方H5接入,页面上需要输入用户名和密码,使用WKWebView总是记不住密码(应该是有时能记...

  • 关于WKWebView的Cookie处理

    WKWebView的坑相信大家已经踩过很多了.之前cookie的问题已经处理过一些了.但是这次又出现了新坑.在第一...

  • iOS WKWebView Cookie的处理

    1. 最近接到一个模块迁移的功能,就是把H5页面的某个功能模块嵌入的App中...其中涉及到一些原生和JS交互,c...

  • iOS开发-WKWebView设置cookie

    1.初始化WKWebView时设置cookie 2.WKWebView已经存在时,设置cookie

  • APP中的cookie

    wkwebview中的cookie: 1:wkwebview默认可以携带原生接口种下的cookie;iOS8以后,...

  • 疑难问题收集

    WKWebview 在重定向时 cookie 丢失 1.WKWebview 在重定向时 cookie 丢失: 1....

网友评论

    本文标题:WKWebView对cookie的处理

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