前言
如果App項目中, 使用了webview, 后臺需要知道該用戶的來源, 來區分是網站端還是移動端, 從而進行一些后續處理, 這是需要判斷依據 --UserAgent. 有時候項目中也需要對Cookie進行處理. 現在作者就聊一下這個問題.
一 UserAgent
User Agent : 用戶代理,是指瀏覽器,它的信息包括硬件平臺、系統軟件、應用軟件和用戶個人偏好。iOS中 主要用于webview加載的頁面, 給后臺提供處理依據.
處理 : 用webview, 調用 JS 的navigator.userAgent, 獲取原UserAgent, 與后臺商定, 拼接字符串, 放入字典中, 存儲.
#pragma mark - 修改UserAgent
-(void)reviseUserAgent{
UIWebView *tempWebView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *secretAgent = [tempWebView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *newUagent = [NSString stringWithFormat:@"%@ iOSApp",secretAgent];
NSDictionary *dictionary = [[NSDictionary alloc]
initWithObjectsAndKeys:newUagent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
[[NSUserDefaults standardUserDefaults] synchronize];
}
在創建 需要加載的頁面之前, 調用該方法, 進行修改UserAgent.
結果打印 :
NSLog(@"NewUserAgent : %@", [self.webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]);
// 輸出結果:
NewUserAgent :Mozilla/5.0 (iPhone; CPU iPhone OS 9_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13E230 iOSApp
WKWebView處理
// 獲取
[self.webView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
NSLog(@"UserAgent: %@", result);
}];
// 設置
[self.webView setCustomUserAgent:@"newUagent"];
二 Cookie
- 先說下 Cookie 與 Session
Session : 服務端要為特定的用戶創建特定的Session,用于標識這個用戶,并且跟蹤用戶的后續操作, 保存在服務器端.
Cookie : 大多數的應用 用 Cookie 來實現Session跟蹤, 在 Cookie 里面記錄一個Session ID,以后每次請求把這個會話ID發送到服務器, 保存在客戶端.
詳情傳送門 : COOKIE和SESSION有什么區別?
-
1. 獲取Cookie
可以在afn加載成功 或者 webview 加載完成處打印.
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
for (NSHTTPCookie *tempCookie in cookies) {
//打印獲得的cookie
NSLog(@"GetCookie: %@", tempCookie);
}
打印結果舉例 :
GetCookie: <NSHTTPCookie version:0 name:"BDSVRTM" value:"12" expiresDate:(null) created:2016-07-04 05:43:54 +0000 sessionOnly:TRUE domain:"www.baidu.com" path:"/" isSecure:FALSE>
-
2. 存儲Cookie 與 重新寫入Cookie
默認cookies失效時間是直到關閉瀏覽器,cookie失效, 也就是App退出, cookie就失效, 但是可以設置失效時間, 這部分最好由后臺來處理, 既然加載的是頁面, 那就是頁面的布局設計由后臺來完成, 所以App程序里控制的越少越好.
如果采用的是默然失效時間, 那可以把Cookie存儲起來, 下次打開App, 從新寫入.
例:
- 存儲 : 需要對cookie進行歸檔處理, 轉換為NSData, 采用NSUserDefaults存儲. 可以在afn加載成功 或者 webview 加載完成處選擇存儲.
NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];
//存儲歸檔后的cookie
[[NSUserDefaults standardUserDefaults] setObject: cookiesData forKey: @"cookie"];
- 寫入 : 取出保存的cookie, 對取出的cookie進行反歸檔處理, 重新設置cookie .
//取出保存的cookie
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//對取出的cookie進行反歸檔處理
NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:[userDefaults objectForKey:@"cookie"]];
if (cookies) {
NSLog(@"有cookie");
//設置cookie
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (id cookie in cookies) {
[cookieStorage setCookie:(NSHTTPCookie *)cookie];
}
}else{
NSLog(@"無cookie");
}
-
3. 刪除
可以刪除特定cookie
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
//刪除cookie
for (NSHTTPCookie *tempCookie in cookies) {
if ([tempCookie.name isEqualToString:@"dbsource"]) {
[cookieStorage deleteCookie:tempCookie];
}
}
如存儲在NSUserDefaults中, 刪除整個cookies.
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"cookie"];
[[NSUserDefaults standardUserDefaults] synchronize];
4. App程序寫入需要的cookie
舉例 (寫入如下需求的cookie):
<NSHTTPCookie version:0 name:"Baidu" value:"99" expiresDate: 2016-08-14 00:00:00 +0000 created:2016-07-04 05:43:54 +0000 sessionOnly:FALSE domain:"www.baidu.com" path:"/" isSecure:FALSE>
- 寫入(需要求的)cookie :
NSMutableDictionary *cookiePropertiesDic = [NSMutableDictionary dictionary];
[cookiePropertiesDic setObject:@"Baidu" forKey:NSHTTPCookieName];
[cookiePropertiesDic setObject:@"99" forKey:NSHTTPCookieValue];
[cookiePropertiesDic setObject:@"www.baidu.com" forKey:NSHTTPCookieDomain];
[cookiePropertiesDic setObject:@"www.baidu.com" forKey:NSHTTPCookieOriginURL];
[cookiePropertiesDic setObject:@"/" forKey:NSHTTPCookiePath]; [cookiePropertiesDic setObject:@"0" forKey:NSHTTPCookieVersion];
[cookiePropertiesDic setObject:@"2016-08-14 00:00:00 +0000" forKey:NSHTTPCookieExpires];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookiePropertiesDic];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
參考 : IT985博客
工程中對UserAgent與Cookie的介紹完.
以上 !