WKWebView 的cookie 注入

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 关于UIWebView的介绍,相信看过上文的小伙伴们,已经大概清楚了吧,如果有问题,欢迎提问。 本文是本系列...
    CoderLF阅读 13,005评论 2 12
  • 上篇文章中提到过初识Session和Cookie,了解了它们的原理和项目中的作用,但是并没有实际用到过,直到前几天...
    风之谷等风来阅读 12,940评论 12 16
  • 1、WKWebView 白屏问题WKWebView 自诩拥有更快的加载速度,更低的内存占用,但实际上 WKWebV...
    iosRn阅读 6,365评论 1 10
  • 1、WKWebView 白屏问题WKWebView 自诩拥有更快的加载速度,更低的内存占用,但实际上 WKWebV...
    无名感恩阅读 6,586评论 0 3
  • WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨...
    Aiana阅读 10,169评论 1 8

友情链接更多精彩内容