美文网首页
WKWebView 的cookie 注入

WKWebView 的cookie 注入

作者: 轻轻语焉 | 来源:发表于2018-11-08 12:05 被阅读33次

    WKWebView 同UIWebView 的cookie 管理机制还是不一样的。

    UIWebView 、AFN 等等吧,可以通过 NSHTTPCookieStorage (单例类)统一管理,设置不同的域名、不同的cookieName、cookieValue。  

     WKWebView 没有用 NSHTTPCookieStorage 这个类管理cookie。所以想要给 WKWebView 注入cookie,有以下方法

    1、JS注入   WKWebView初始化

    WKUserContentController *userContentController = WKUserContentController.new;

     WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource:@"document.cookie ='cookieName=cookieValue';" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];         

     [userContentController addUserScript:cookieScript];

    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc]init];

    config.userContentController = userContentController;

    WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0 , 100, 200 ) configuration:config ];

    在WKWebView 初始化的时候,通过配置类,实现了注入cookie。

    2、JS 注入 WKWebView 代理方法

     //js 注入cookie        

     [_webView evaluateJavaScript:@"document.cookie ='cookieName=cookieValue';" completionHandler:^(id result, NSError *error) {                                                                    //注入成功

    }];

    ps:如果进入当前页面就需要状态的时候,需要在初始化的时候写入cookie。在代理方法, -(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler 里加入应该也可以,这点没有验证。

    3、iOS 11 推出 WKHTTPCookieStore

     if (@available(iOS 11.0, *)) {                                         

       NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:@{NSHTTPCookieName: @"cookeName",NSHTTPCookieValue:@"cookieValue",NSHTTPCookieDomain:@"cookieDomain",NSHTTPCookiePath: @"/" }];

        [_webView.configuration.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:^{ }];  

    }

    4、在request 请求里加cookie

    NSURL *url = [NSURL URLWithString:_urlStr];     

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

     [request setValue:@"cookieName=cookieValue" forHTTPHeaderField:@"Cookie"];

     [_webView loadRequest:request];

    NOTICE:

    JS注入的Cookie,比如PHP代码在Cookie容器中取是取不到的, javascript document.cookie能读取到,浏览器中也能看到。

    NSMutableURLRequest 注入的PHP等动态语言直接能从$_COOKIE对象中获取到,但是js读取不到,浏览器也看不到

    所以合理的办法让js,php,浏览器都能读取到相同的Cookie方法就是创建WebView的时候javascript注入Cookie,一开始发送NSMutableURLRequest请求的时候也要加上Cookie,并且保证两个地方的设置的cookie一致。

    参考:http://www.skyfox.org/ios-wkwebview-cookie-opration.html

    相关文章

      网友评论

          本文标题:WKWebView 的cookie 注入

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