之前在公司做了一个关于借款的app ,后台出于安全的考虑 ,给用户权限分了等级, 请求头不同,所能返回的接口数据也不一样,但是这个请求头不是不变的,在用户完成一定的验证和借款后,请求头发生改变( 服务器返回新的请求头)。
解决方案:我采用NSUserDefaults写入系统文件(大不了 新添加时,删除就是了),
NSString *Token = JSON[@"data"]; JSON 为返回值(id类型)
NSUserDefaults *user = [NSUserDefaults standardUserDefaults ];
[user setObject:Token forKey:@"Token"];
本以为这么简单就解决了这个问题,天真的我运行就是bug ,
登录后依旧不能请求到数据,没办法了只能断点调试了,后来我发现,我在请求时AFHttpClient 创建了一个只调用一次的单例(为了线程安全又装逼,又高大上)
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{};
这个单例只调用一次,所以我就把它删了,再次执行,依旧没有,但是我退出程序再次运行就可以了,数据拿到了,一点毛病没有。
最后没有在apple 文档里面找到一个
- (BOOL)synchronize;
// -objectIsForcedForKey: returns YES if the value for 'key' is provided by managed preferences (a configuration profile or mcx)(简单说就是立刻马上写入profile)
因为NSUserDefaults 写入系统文件有一定实效性,就是过一段时间再调用- (BOOL)synchronize;这个方法,所以你要及时存取就必须手动调用这个方法。
接下来就是添加到请求头了代码如下
static AFHttpClient *_sharedClient = nil;
_sharedClient = [[AFHttpClient alloc] initWithBaseURL:[NSURL URLWithString:kBaseURLString]];
//不设置会报-1060或者会编码有问题
_sharedClient.responseSerializer = [AFJSONResponseSerializer serializer];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[_sharedClient.requestSerializer setValue:[user objectForKey:@"Token"] forHTTPHeaderField:@"Authorization"];
[_sharedClient.requestSerializer
setValue:@"application/x-www-form-urlencoded "
forHTTPHeaderField:@"Content-type"];
有什么不对的地方希望大家多提提意见
------.开发之路与君共勉之------