一. UIWebView
在使用 UIWebView 的时候,我们是通过 NSHTTPCookieStorage 来管理 cookie 的,我们给 momo.domain.com 域名添加一个名字为 user 的 cookie,代码类似下面。
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"user" forKey:NSHTTPCookieName];
[cookieProperties setObject:@"xxxxxx" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"momo.domain.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
这样就完成了给UIWebView设置 cookie 的工作。
在 WKWebView 中通过 NSHTTPCookieStorage 来设置 cookie 是行不通的,要通过 URLRequest 来添加 cookie 才能起效果 。代码类似下面。
二. WKWebView
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://momo.domain.com"]];
NSDictionary *headFields = request.allHTTPHeaderFields;
NSString *cookie = headFields[@"user"];
if (cookie == nil) {
[request addValue:[NSString stringWithFormat:@"user=%@", @"userValue"] forHTTPHeaderField:@"Cookie"];
}
[self.webView loadRequest:request];
你以为 WKWebView 添加 cookie 就这样结束了 ? 其实远远没有。上面通过 URLRequest 来添加 cookie 的方式只能对 WKWebView loadRequest 的那个 request 起作用,如果你的 WKWebView 加载的 Web 页面包含了 ajax
请求的话,那 cookie 又要重新处理了,这个处理需要在 WKWebView 的 WKWebViewConfiguration 中进行配置。代码类似下面。
//应用于 ajax 请求的 cookie 设置
WKUserContentController *userContentController = WKUserContentController.new;
NSString *cookieSource = [NSString stringWithFormat:@"document.cookie = 'user=%@';", @"userValue"];
WKUserScript *cookieScript = [[WKUserScript alloc] initWithSource:cookieSource injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = userContentController;
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://momo.domain.com"]];
// 应用于 request 的 cookie 设置
NSDictionary *headFields = request.allHTTPHeaderFields;
NSString *cookie = headFields[@"user"];
if (cookie == nil) {
[request addValue:[NSString stringWithFormat:@"user=%@", @"userValue"] forHTTPHeaderField:@"Cookie"];
}
self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:config];
[self.webView loadRequest:request];
三 使用Safari调试 cookie
1.首先先用真机或者模拟器打开一个网页
2.打开Safari,然后选择开发选项
image.png
3.选择 存储空间 -> cookie 管理,即可看到相关 cookie 了
image.png
本文参考 WKWebView 设置 Cookie
同类文章参考
1.《 WKWebView 那些坑》
2.献上苹果工程师在官方论坛的一个关于 WKWebView Cookie 问题的答复
网友评论