再开发过程我们会经常遇到请求数据时会带cookie,这个可以理解为安全验证,也是我们判断是否登录过期的,获取cookie的方式一般有两种,可能更多,但我遇到都是两种,第一种就是cookie登录成功后以返回值得方式获取到,再以参数的形式给后台。第二种就是cookie在网络协议中返回,在以同一种形式传给服务器
今天我们来说一下第二种
首先就是我们获取这个cookie,一般情况下我们这个cookie都会在登录的接口返回给我们,所以我们要做的就是在登录成功的时候记录下这个cookie值(cookie时效有后台决定,可以为7天、一个月等),那如何记录呢
#pragma mark -
#pragma mark - --> 和网络请求的cookie使用
//缓存
+ (void)cacheCookie{
NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"Cookie"];
[defaults setObject: cookiesData forKey:@"Cookie"];
[defaults synchronize];
}
//cookie注册 如果AppDelegate判断有cookie 也就是登录状态 执行这个方法, 会在之后请求中带上已经缓存的cookie
+ (void)setCookie{
NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"Cookie"]];
NSHTTPCookieStorage * cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie * cookie in cookies){
[cookieStorage setCookie: cookie];
}
}
这两个方法就是实现缓存cookie的方法和将cookie写入NSHTTPCookieStorage的方法,可理解为cookie的注册
怎么使用呢,就是在登录成功的回调里面我要加上这两个使用用法即可。
//缓存cookie到本地
[NetRequestClass cacheCookie];
//cookie注册 如果AppDelegate判断有cookie 也就是登录状态 执行这个方法, 会在之后请求中带上已经缓存的cookie
[NetRequestClass setCookie];
我们也要设置一下cookie属性设值(cookie的存在形式,同样在登录成功回调里面这是一下即可),下面是设置方法:
//Cookie的本地缓存策略
// NSHTTPCookieAcceptPolicyAlways: 保存所有cookie,这个是默认值
// NSHTTPCookieAcceptPolicyNever: 不保存任何响应头中的cookie
// NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain: 只保存域请求匹配的cookie
[[NSHTTPCookieStorage sharedHTTPCookieStorage]setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
有时候我们可能需要判断cookie到底存不存在,下面这个方法就可以解决
//判断本地数据中有没有Cookie, 是判断是否登录的条件之一
+ (BOOL)getCookie{
NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"Cookie"]];
if (cookies.count > 0) {
NSLog(@"存在cook");
return YES;
}else{
NSLog(@"不存在cook");
return NO;
}
}
到这里cookie的一些基本设置就算完事了,下面就是在AFNetworking中cookie的使用
首先这个cookie我是存在本地的,所以我们要在本地读出这个cookie(无论cookie是什么类型,都要直接强转成字符串)
NSString *cookie = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"Cookie"]];
获取万cookie后,就是将这个cookie传给服务器,但是并不是以参数的形式传给后台,而是在AFNetworking的请求头中携带过去,下面是如何携带cookie(切记:key一点不要写错:"Set-Cookie"):
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.requestSerializer.timeoutInterval = 30;
manager.requestSerializer.HTTPShouldHandleCookies = YES;
NSString *cookie = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"Cookie"]];
[manager.requestSerializer setValue:cookie forHTTPHeaderField:@"Set-Cookie"];
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
这些就是iOS开发是cookie的简单实用