什么是Cookie
- Cookie是服务端为了识别终端身份,保存在本地的用户凭证信息,Cookie本质是包含了一系列key-value的数组。
- Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。
iOS中管理Cookie
- 管理Cookie主要用
NSHTTPCookie
和NSHTTPCookieStorage
当你访问网站时NSURLRequest
会帮你主动记录访问网站的Cookie。如果Cookie存在的话,会把Cookie存放在NSHTTPCookieStorage
容器中共享,当你再访问的时候NSURLRequest
会带上保存下来的Cookie去请求。
- NSHTTPCookieStorage
A container that manages the storage of cookies.Each stored cookie is represented by an instance of the NSHTTPCookie class.
一个用于储存Cookie的容器,一个NSHTTPCookie单例代表一个Cookie- NSHTTPCookie
A representation of an HTTP cookie.
HTTP请求Cookie数据对象
UIWebView处理Cookie
- UIWebView会将NSHTTPRequest的所有请求产生的Cookie自动保存到NSHTTPCookieStorage中,并在app内多个UIWebView之间共享。通过 UIWebView 发起请求 ,请求头会自动带上Cookie
NSHTTPCookieStorage *sharedCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSDictionary *properties = @{NSHTTPCookieName : @"cookie name",
NSHTTPCookieValue : @"cookie value",
NSHTTPCookieDomain : @"your omain",
NSHTTPCookiePath : @"/"};
NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:properties];
[sharedCookieStorage setCookie: cookie];
WKWebView处理Cookie
- WKWebView不会自动带上Cookie,所以需要另外处理
- 在iOS 11以后苹果官方有提供接口设置WKWebView的cookieStorage
if (@available(iOS 11.0, *)) {
[self.webview.configuration.websiteDataStore.httpCookieStore setCookie:eventCK completionHandler:^{
@wb_strongify(self)
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webview loadRequest:request];
}];
}
- 在iOS 11以前设置Cookie比较复杂。
方法一:通过key-value构造Cookie,在loadRequest前,在request header中设置Cookie
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:yourURL]];
NSDictionary *headFields = request.allHTTPHeaderFields;
NSString *cookie = headFields[@"cookie"];
if (cookie == nil) {
[request addValue:[NSString stringWithFormat:@"%@=%@", cookieName, cookieValue] forHTTPHeaderField:@"Cookie"];
}
[self.webView loadRequest:request];
方法二:可以通过document.cookie设置Cookie
//在请求中添加cookie
[self.requestToLoad setValue:[NSString stringWithFormat:@"%@=%@", cookieName, cookieValue] forHTTPHeaderField:@"Cookie"];
NSString *cookieSource = [NSString stringWithFormat:@"document.cookie = '%@=%@';", cookieName, cookieValue];
//写一个js脚本,并将cookieSource放入脚本中
WKUserScript *cookieScrip = [[WKUserScript alloc] initWithSource:cookieSource injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
//添加js脚本
[self.webView.configuration.userContentController addUserScript:cookieScrip];
- (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly;
Returns an initialized user script that can be added to a user content controller.
注意第二个参数通常为WKUserScriptInjectionTimeAtDocumentStart
表示在加载网页时注入
- setValue:forHTTPHeaderField
If the length of your upload body data can be determined automatically (for example, if you provide the body content with an NSData object), then the value of Content-Length is set for you.- addValue:forHTTPHeaderField
This method provides the ability to add values to header fields incrementally. If a value was previously set for the specified field, the supplied value is appended to the existing value using the appropriate field delimiter (a comma).
到此为止WKWebView的Cookie问题已经可以基本解决了
未经授权,禁止转载!
尊重原创,转载请注明出处,谢谢!
参考文章:
https://www.jianshu.com/p/cd0d819b9851
https://www.jianshu.com/p/19e100b0c674
网友评论