程序员

iOS原生登陆获取Set-Cookie,实现与webView共享

2017-05-23  本文已影响259人  大怪猿

最近在做公司下单页面。由于该下单页面暂时是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下编辑,造成代码块浏览非常不舒服,所以删除刚才的重新发布。

上一篇下一篇

猜你喜欢

热点阅读