iOS原生登陆获取Set-Cookie,实现与webView共享
最近在做公司下单页面。由于该下单页面暂时是web页面。所以需要获取我们app登陆的时候得到的cookie,在设置到webView的URL中。
在这之前,我从网上查阅了数多资料,但一直实现不了自动登陆效果。经过2天的探索终于填满一个个坑才知道问题出现在哪里。现在写出来当有人出现这些问题的时候可以借鉴思考。
第一步获取cookie:
如果你使用AFNetworking�请求的话:
NSHTTPURLResponse*response = (NSHTTPURLResponse*)task.response;
NSString*cookieheader = response.allHeaderFields[@"Set-Cookie"];
NSLog(@"set-cookie===%@", cookieheader);
cookie1.png
这样就可以得到cookie。但是!但是!大家一定要注意,我就是在这个时候掉坑里了。当我登陆的时候由于以前登陆过,所以获取的cookie是:NanhuFX.Uid=S/hibRt15EvtHb8yhjHPHlwJfom9PeY1Vn9zmSO9HBNHzaZhs9MuD/o6mO8DckD5gphxnJDWPAqUEAKhB3OHo9KgYgaFTCVnX1jdfI8VrP0nB/hnQGgXhcEezn9e9pFW; domain=fsnanhutravel.com; path=/
这一段,但是不正确的。我相信有很多也会在这个时候掉坑中。那么如何获取正确的cookie呢?两种方法,一种是你删除app,或者退出重新登陆,这个时候返回的cookie才是正确的:并且这个cookie是只返回一次给我,接下来每次都是返回上面那一个一小段的cookie了,那么我们要对两段不同时间的cookie进行保存。
下面这一段才是首次登陆获取的,也就是信息最全的
cookie2.png
第2步:保存cookie,首次登陆获取的正确的cookie后,我们要对这个cookie保存:
NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
if (response.allHeaderFields[@"upstream"]) {
[NHUserDefaults setValue:response.allHeaderFields[@"upstream"] forKey:upStream];
}
NSString *cookieheader = response.allHeaderFields[@"Set-Cookie"];
NSLog(@"set-cookie===%@", cookieheader);
if (cookieheader.length) {
if ([cookieheader rangeOfString:@"ASP.NET_SessionId"].location != NSNotFound) {
[NHUserDefaults setObject:cookieheader forKey:SetCookie];
}else {
[NHUserDefaults setObject:cookieheader forKey:SetCookieNew];
}
}
我这样保存两段是因为第一段最长的cookie是包含最多信息的,所以我们需要设置,当我们每次请求的时候会返回第二段短一点的cookie,这是保证我们登陆不过期。这样就可以保存下来后,我们后续都需要使用。
大家要注意一点的就是我保存是判断ASP.NET_SessionId了这个才去保存最长的一段,也就是首次登陆才有的,你们怎么判断的话具体情况你们看下自己的cookie,找找规律。
第3步:设置cookie
//判断是否沙盒中是否有这个值
//赋值cookie
if ([NHUserDefaults objectForKey:SetCookie]) {
NSArray *cookies = [[NHUserDefaults objectForKey:SetCookie] componentsSeparatedByString:@","];
for (NSString *cookie in cookies) {
NSArray *CookAry = [cookie componentsSeparatedByString:@";"];
[self setCookieAry:CookAry];
}
}
if ([NHUserDefaults objectForKey:SetCookieNew]) {
NSArray *CookAry = [[NHUserDefaults objectForKey:SetCookieNew] componentsSeparatedByString:@";"];
[self setCookieAry:CookAry];
}
self.urlString = [NHTOOLS addStringWithString:self.urlString isWebUrl:YES isShareUrl:NO];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.urlString]];
[self.webview loadRequest:request];
- (void)setCookieAry:(NSArray *)array {
if (array.count>2) {
NSArray *nameAry = [array[0] componentsSeparatedByString:@"="];
NSString *firstStr = [NSString stringWithFormat:@"%@=", nameAry[0]];
NSRange range = [array[0] rangeOfString:firstStr];
NSString *value = [array[0] substringFromIndex:range.length];
//NSArray *domainA = [CookAry[1] componentsSeparatedByString:@"="];
NSDictionary *prop1 = [NSDictionary dictionaryWithObjectsAndKeys:
nameAry[0],NSHTTPCookieName,
value,NSHTTPCookieValue,
@"/",NSHTTPCookiePath,[NSURL URLWithString:self.urlString],NSHTTPCookieOriginURL, nil];
NSHTTPCookie *cookieuser = [NSHTTPCookie cookieWithProperties:prop1];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookieuser];
}
}
设置完了 ,大家看看效果怎么样。第一次使用简书发表文章,也是第一次发表技术文章,如果有写得不好的,请谅解。
刚才发布的是因为不是在MarkDown下编辑,造成代码块浏览非常不舒服,所以删除刚才的重新发布。