美文网首页
WKWebView添加Cookie总结

WKWebView添加Cookie总结

作者: 黑暗森林的歌者 | 来源:发表于2018-07-10 09:46 被阅读112次

WKWebView是苹果在iOS8 开始推出的webView组件,用来替代UIWebView内存占用高的问题,虽然WKWebView的性能提升了很多,但是也有很多的坑是不可忽略的,比如对cookie的使用,就是存在的一个很大的坑。

1、添加到NSURLRequest中

//获取Cookie
- (NSString *)getCookie {
    NSMutableString *cookieStr = [[NSMutableString alloc] init];
    NSArray *array =  [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[NSURL URLWithString:@"https://www.baidu.com"]];
    if ([array count] > 0) {
        for (NSHTTPCookie *cookie in array) {
            [cookieStr appendFormat:@"%@=%@;",cookie.name,cookie.value];
        }
        //删除最后一个分号 “;”
        [cookieStr deleteCharactersInRange:NSMakeRange(cookieString.length - 1, 1)];
    }
    return cookieStr;
}
`



​```objective-c
// 添加request的请求头
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:requestUrl]];
NSString *cookie = [self getCookie];
[request addValue:cookie forHTTPHeaderField:@"Cookie"];

我平时用的时候这个方式经常添加失效,建议使用第二种方式添加,如果是iOS11以上的系统,尽量用第三种方式

2、使用JS注入的方式添加cookie

创建JS字符串

- (NSString *)cookieJSString {
    NSMutableString *script = [NSMutableString string];
    [script appendString:@"var cookieNames = document.cookie.split('; ').map(function(cookie) { return cookie.split('=')[0] } );\n"];
    for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {

        if ([cookie.value rangeOfString:@"'"].location != NSNotFound) {
            continue;
        }

        [script appendFormat:@"if (cookieNames.indexOf('%@') == -1) { document.cookie='%@'; };\n", cookie.name, cookie.da_javascriptString];
    }
    return script;
}

添加JS字符串到WKWebViewconfiguration中,

创建WKUserScript

WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource:[self cookieString] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];

[self.wkwebView.configuration.userContentController addUserScript:cookieScript];

3,使用WKHTTPCookieStore 管理cookie

在iOS11中新增了 WKHTTPCookieStore管理cookie,通过这个API可以添加、删除、查询WKWebView的Cookie,甚至监听Cookie的变化。

文档注释文档注释

先使用NSHTTPCookieStorage获取已经存在的cookie。

NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];

获取到WKWebView的httpCookieStore

WKHTTPCookieStore *cookieStroe = self.wkwebView.configuration.websiteDataStore.httpCookieStore;
// 添加cookie
for (NSHTTPCookie *cookie in cookies) {
    [cookieStroe setCookie:cookie completionHandler:^{
        if ([[cookies lastObject] isEqual:cookie]) {
            return;
        }
    }];
}

WKHTTPCookieStore 添加cookie是通过block执行添加之后的操作

通过WKHTTPCookieStore添加cookie经常在第一次加载的时候没有添加成功, 需要在web开始加载内容的 时候确认一下

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    if (@available(iOS 11.0, *)) {
        WKHTTPCookieStore *cookieStore = webView.configuration.websiteDataStore.httpCookieStore;
        [cookieStore getAllCookies:^(NSArray<NSHTTPCookie *> * _Nonnull allCookies) {
            if (allCookies.count == 0 && ![webView.URL.absoluteString isEqualToString:@"about:blank"]) {
                //如果没有添加成功cookie,在这里让web重新进行loadRequest请求
                [self.wkwebView loadRequest:self.request];
            }
        }];
    }

    decisionHandler(WKNavigationActionPolicyAllow);
}

这三种方式基本上能满足大部分的对于添加cookie的需求,如果APP对cookie的操作比较多的话,建议还是使用UIWebView吧,毕竟WKWebView的坑太多了,cookie的管理知识其中一个😂😂😂

最后建议观看WWDC,这里能增长很多iOS开发的知识。这个视频是WWDC中介绍WKWebView的,里面讲解了cookie的管理等等,好好观看可以跳过很多坑

Customized Loading in WKWebView

相关文章

  • WKWebView添加Cookie总结

    WKWebView是苹果在iOS8 开始推出的webView组件,用来替代UIWebView内存占用高的问题,虽然...

  • WKWebview ajax添加cookie

    wkwebview 用WKUserScript添加cookie,cookie的source里必须带上 path

  • ios WKWebView Cookie

    WKWebView Cookie 加载cookie有两种方式1、使用js注入的形式添加2、使用请求头的形式添加 一...

  • iOS WKWebView添加Cookie

    网络请求添加Cookie都需要在request的时候添加 给request增加请求头 WKWebView加载请求

  • IOS WKWebView添加cookie

    在网络请求中,有一部分需要添加cookie,接下来就把为web添加cookie的方法小小列举一下,其实所有的要添加...

  • WKWebView如何添加cookie

    原文发布在个人站点:WKWebView处理cookies 最近做了一个项目,加载网页使用的是WKWebView,网...

  • iOS WKWebView 添加 cookie

    今天遇到了一个问题,项目中需要加载web界面,使用WKWebView耗内存小、加载速度快、与JS的交互好,所以就尝...

  • WKWebView请求添加Cookie

    WKWebView发送请求时不会把HTTPCookieStorage中的cookie写入请求中需要手动添加。 iO...

  • iOS WKWebView添加Cookie

    一、系统方法设置: 系统方法就不说了,百度一大推,但是听说WKWebView设置Cookie有bug。 二、第三方...

  • iOS开发-WKWebView设置cookie

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

网友评论

      本文标题:WKWebView添加Cookie总结

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