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的介绍完.

以上 !

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • iOS App开发中的Cookie 一、何为Cookie Cookie是网站为了便是终端身份,保存在终端本地的用户...
    o本是后山人o偶作前堂客o阅读 3,664评论 1 8
  • 这次接触的项目里,后台在登录后,返回了一个token,让我将token存在本地,然后在今后每次请求的cook...
    Iris_lin阅读 3,519评论 2 6
  • 项目中用到了本地登录存储cookie,再进行webView请求时间带上cookie的功能。不是很清晰逻辑,于是学习...
    小胡子杰克阅读 3,106评论 2 12
  • 我有一个秘密,想让清晨的第一缕阳光照进你的心里 我有一个秘密,想让夜晚的每一寸柔和的月光伴随着你归途的笑意 我有一...
    雪落雨滴阅读 182评论 0 0
  • 今日大年初三,在娘家参加悼礼时,再次看见那双眼睛,近距离地时隔一年再次见到。 这是一双中年男子的眼睛。布满疲惫生活...
    与你画夕阳阅读 648评论 26 7