美文网首页程序员
iOS原生登陆获取Set-Cookie,实现与webView共享

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

作者: 大怪猿 | 来源:发表于2017-05-23 17:27 被阅读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下编辑,造成代码块浏览非常不舒服,所以删除刚才的重新发布。

    相关文章

      网友评论

        本文标题:iOS原生登陆获取Set-Cookie,实现与webView共享

        本文链接:https://www.haomeiwen.com/subject/kjrgxxtx.html