項(xiàng)目用到了 把用戶信息保存在 cookie 中,類似瀏覽器記錄用戶信息一樣,然后請求的接口從cookie中獲取 當(dāng)前用戶信息,這就要求我們每次登陸后把 cookie 保存起來,還有退出程序 清空cookie的 問題,由于項(xiàng)目中用到了 AFN,所以導(dǎo)致了一些難以發(fā)現(xiàn)的問題。
首先,用戶第一次 注冊APP,請求注冊接口 后臺會把cookie 返回回來,我們需要把cookie保存起來,代碼如下:
NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
NSString *cookieString = [response.allHeaderFields valueForKey:@"Set-Cookie"];
if (cookieString) {
NSArray *cookieStrings = [cookieString componentsSeparatedByString:@","];
for(NSString* temp in cookieStrings)
{
NSArray *tempArr = [temp componentsSeparatedByString:@";"];
[finalCookie appendString:[NSString stringWithFormat:@"%@",tempArr[0]]];
}
[[XSTUserDefault sharedXSTUserDefault]loadUserInfoFormSanbox];
[XSTUserDefault sharedXSTUserDefault].cookie = finalCookie;
[[XSTUserDefault sharedXSTUserDefault]saveUserInfoToSanbox];
[[NSUserDefaults standardUserDefaults] setObject:cookieString forKey:@"UserCookies"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 單例 項(xiàng)目中共享
NSHTTPCookieStorage *myCookie = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSMutableDictionary *mutdict = [NSMutableDictionary dictionary];
[mutdict setObject:@"SESSION" forKey:NSHTTPCookieName];
[mutdict setObject:cookieString forKey:NSHTTPCookieValue];
[mutdict setObject:@"api.xiaoshentu.com" forKey:NSHTTPCookieDomain];
[mutdict setObject:@"api.xiaoshentu.com" forKey:NSHTTPCookieOriginURL];
[mutdict setObject:@"/" forKey:NSHTTPCookiePath];
[mutdict setObject:@"0" forKey:NSHTTPCookieVersion];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:mutdict];
[myCookie setCookie:cookie];
NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];
//存儲歸檔后的cookie 由于網(wǎng)頁中用的數(shù)據(jù)是后臺從 cookie取得所以需要保存起來,每次啟動(dòng)APP 在加載下 cookie
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject: cookiesData forKey: @"myCookie"];
每次請求接口需要把 cookie傳給后臺,由于用到的是AFN 當(dāng)cookie 為空時(shí) 需要傳給空字符串給后臺,不然換個(gè)用戶登錄后臺不會返回當(dāng)前用戶cookie,代碼如下
[[XSTUserDefault sharedXSTUserDefault]loadUserInfoFormSanbox];
NSString *cookieString = [XSTUserDefault sharedXSTUserDefault].cookie;
NSLog(@"%@",cookieString);
if(cookieString){
[mgr.requestSerializer setValue: cookieString forHTTPHeaderField:@"Cookie"];
}else{
[mgr.requestSerializer setValue:@"" forHTTPHeaderField:@"Cookie"];
}
由于APP 中加載網(wǎng)頁需要用戶信息,后臺是從cookie取得,由于網(wǎng)頁是默認(rèn)加載cookie的 所以每次啟動(dòng)APP 需要加載下當(dāng)前的 保存的cookie,代碼如下:
//合適的時(shí)機(jī)加載持久化后Cookie 一般都是app剛剛啟動(dòng)的時(shí)候
- (void)loadSavedCookies{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//對取出的cookie進(jìn)行反歸檔處理
NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:[userDefaults objectForKey:@"myCookie"]];
if (cookies) {
NSLog(@"有cookie");
//設(shè)置cookie
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (id cookie in cookies) {
[cookieStorage setCookie:(NSHTTPCookie *)cookie];
}
}else{
if ([[NSUserDefaults standardUserDefaults]objectForKey:@"UserCookies"]) {
NSHTTPCookieStorage *myCookie = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSMutableDictionary *mutdict = [NSMutableDictionary dictionary];
[mutdict setObject:@"SESSION" forKey:NSHTTPCookieName];
[mutdict setObject:[[NSUserDefaults standardUserDefaults]objectForKey:@"UserCookies"] forKey:NSHTTPCookieValue];
// 后面幾個(gè)參數(shù) 一定要設(shè)置,否則發(fā)現(xiàn) cookie 是空的
[mutdict setObject:@"api.xiaoshentu.com" forKey:NSHTTPCookieDomain];
[mutdict setObject:@"api.xiaoshentu.com" forKey:NSHTTPCookieOriginURL];
[mutdict setObject:@"/" forKey:NSHTTPCookiePath];
[mutdict setObject:@"0" forKey:NSHTTPCookieVersion];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:mutdict];
[myCookie setCookie:cookie];
}
NSLog(@"無cookie");
}
//打印cookie,檢測是否成功設(shè)置了cookie
NSArray *cookiesA = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
for (NSHTTPCookie *cookie in cookiesA) {
NSLog(@"setCookie: %@", cookie);
}
}
加載網(wǎng)頁請求是需要開啟加載cookie,這樣網(wǎng)頁就能獲取用戶信息了。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.url]];
[request setHTTPShouldHandleCookies:YES];
[self.h5WebView loadRequest:request];
有問題 請加微信 743278081