iOS UserAgent與Cookie使用

前言

如果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的介紹完.

以上 !

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • iOS App開發中的Cookie 一、何為Cookie Cookie是網站為了便是終端身份,保存在終端本地的用戶...
    o本是后山人o偶作前堂客o閱讀 3,750評論 1 8
  • 這次接觸的項目里,后臺在登錄后,返回了一個token,讓我將token存在本地,然后在今后每次請求的cook...
    Iris_lin閱讀 3,575評論 2 6
  • 項目中用到了本地登錄存儲cookie,再進行webView請求時間帶上cookie的功能。不是很清晰邏輯,于是學習...
    小胡子杰克閱讀 3,131評論 2 12
  • 我有一個秘密,想讓清晨的第一縷陽光照進你的心里 我有一個秘密,想讓夜晚的每一寸柔和的月光伴隨著你歸途的笑意 我有一...
    雪落雨滴閱讀 199評論 0 0
  • 今日大年初三,在娘家參加悼禮時,再次看見那雙眼睛,近距離地時隔一年再次見到。 這是一雙中年男子的眼睛。布滿疲憊生活...
    與你畫夕陽閱讀 682評論 26 7