美文网首页平时生活和工作中的iOSiOS BlogUI进价
保证可行!两步实现iOS UIWebView 通过 cookie

保证可行!两步实现iOS UIWebView 通过 cookie

作者: ZPengs | 来源:发表于2016-07-01 17:49 被阅读11619次

这两天有个项目需求,在网上找了好多博文都不可以拿来就能实现(对于伸手党怎么能行),为了避免浪费大家的时间我在这里给出一份一定可行的方法:

1、相关知识点介绍

  1. iOS在UIWebView中获取的cookie的方法:NSHTTPCookieStorage * nCookies = [NSHTTPCookieStorage sharedHTTPCookieStorage]
  2. 再具体获取某个域的饼干:NSArray* cookiesURL = [nCookies cookiesForURL:[NSURL URLWithString:@“你的URL”]];
  3. 通过[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie]方法将 cookies来保存起来,但是这样虽然可以保存cookies但是你应用退出之后还是会丢失(其实是cookies过期的问题),做好的方法是把cookies放到NSUserDefaults保存起来:

2、实现方法

  • 简单粗暴直接上码:GitHub Demo欢迎star, 你的star就是对我最好的鼓励.
    1.在UIWebView的代理方法中实现获取cookies并将cookies放到NSUserDefaults保存起来:(void)webViewDidFinishLoad:(UIWebView *)webView中写入
    需要注意的是你的CookieName
 NSArray *nCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
    NSHTTPCookie *cookie;
    for (id c in nCookies)
    {
        if ([c isKindOfClass:[NSHTTPCookie class]])
        {
            cookie=(NSHTTPCookie *)c;
            if ([cookie.name isEqualToString:@"PHPSESSID"]) {
                NSNumber *sessionOnly = [NSNumber numberWithBool:cookie.sessionOnly];
                NSNumber *isSecure = [NSNumber numberWithBool:cookie.isSecure];
                NSArray *cookies = [NSArray arrayWithObjects:cookie.name, cookie.value, sessionOnly, cookie.domain, cookie.path, isSecure, nil];
                [[NSUserDefaults standardUserDefaults] setObject:cookies forKey:@"cookies"];
                break;
            }
        }
    }

2.获取cookies:运行之后,UIWebview加载url之前获取保存好的cookies,并设置cookies

 NSArray *cookies =[[NSUserDefaults standardUserDefaults]  objectForKey:@"cookies"];
        NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
        [cookieProperties setObject:[cookies objectAtIndex:0] forKey:NSHTTPCookieName];
        [cookieProperties setObject:[cookies objectAtIndex:1] forKey:NSHTTPCookieValue];
        [cookieProperties setObject:[cookies objectAtIndex:3] forKey:NSHTTPCookieDomain];
        [cookieProperties setObject:[cookies objectAtIndex:4] forKey:NSHTTPCookiePath];
        NSHTTPCookie *cookieuser = [NSHTTPCookie cookieWithProperties:cookieProperties];
        [[NSHTTPCookieStorage sharedHTTPCookieStorage]  setCookie:cookieuser];

注意:要在[self.webView loadRequest:req];之前设置获取cookies!
到现在为止你的应用肯定就已经实现了你想要的功能!
感谢楼下@440bd488f596这位同学提供的新方案,供大家参考:

NSArray *headeringCookie = [NSHTTPCookie cookiesWithResponseHeaderFields:
[NSDictionary dictionaryWithObject:
[[NSString alloc] initWithFormat:@"token=%@;",self.token]
forKey:@"Set-Cookie"]
forURL:url];

(其中连接上面实现的稍微有些问题,我在我这里已经进行了修改)功能实现参考链接

                                                                             ----By ZPengs

相关文章

网友评论

  • 进击的巨人Alan:wkwebview 可以么
  • 可惜你不是我的双子座:这个方法怎么没用!求解释
  • 皮乐皮儿:这个不可行吧,如果服务端的cookie是变化的,你这个不行的
  • 又是一个晴天_7568:博主有没有使用AF进行原生的登录后,记录cookie,然后再用到webview中就自动登录的方法呢? 一直走不通。
  • F麦子:你这又没有登录功能啊,怎么证明对,而且我试了试,为何还是不能自动登录
  • F麦子:大哥,我的APP外壳是原生的,tabbarControlelr上面的四个导航控制器是加载的网页,为何在个人设置界面(也是加载的网页)登陆以后,其他导航控制器的网页进行一些操作时还要求我登录,貌似没有做到同步?这是什么原因啊?还有,就是网页版的APP以前登陆以后再次打开webapp可以自动登录,现在我原生外壳加载UIWebView登录后就不能自动登录了。。。啥原因
  • _水畔竹汐:感觉你这方法都不行,你这登录只是系统记录了 cookie 我打断点你存在本地和取的地方都不走,第二次能登录只是系统自动加载的cookie ,网上一搜大部分都是一模一样的方法,真是不明白现在 ios 都这样了,找不到一点有用的知识
  • 时米高的人生笔记:楼主, 我用的是wkwebview,代码照着你的写, 但是 在NSArray *nCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];获取nCookies一直是空数组, 请问知道是什么问题吗?
    时米高的人生笔记:@ZPengs 意思是wkwebview不会将cookie存储到NSHTTPCookieStroage是吗?
    ZPengs:@Atimey UIWebView加载一个URL的时候,在加载完成时候,Http Response,对Cookie进行写入,更新或者删除,结果更新Cookie到NSHTTPCookieStorage存储容器中,NSURLCache和NSHTTPCookieStroage无法操作(WKWebView)WebCore进程的缓存和Cookie.
    时米高的人生笔记:同样的url用uiwebview照你的demo是可以实现自动登录的, 不明白换成wkwebview为什么就不行了:sob:
  • 259ef7ae0bd1:我第一次登陆了以后,第二次运行的时候我把从userdefault取cookie这段注释掉了,我进去还是登陆状态。系统会自己保存cookie吧
  • 封丑儿:如果是加载本地的 js 和 html 也可以用这种机制获取 cookie 吗 ?
    我用的百度的 url 就走你的方法
    但是用加载本地的 Url 就不行
    本地加载的方式是NSURL *url = [[NSBundle mainBundle] URLForResource:@"client/index.html" withExtension:nil];
    ZPengs:本地的html可以本地进行读取!就不没必要用这个机制了!jsbridge可以搞定了
  • 440bd488f596:请问你的demo里cookie.name是不是与PHPSESSID匹配才能登陆? 这个PHPSESSID是百度特有的吗,我有点不明白
    ZPengs:@440bd488f596 :clap:
    440bd488f596:@ZPengs 不知道是不是我少了什么,我尝试了新的解决方案:
    NSArray *headeringCookie = [NSHTTPCookie cookiesWithResponseHeaderFields:
    [NSDictionary dictionaryWithObject:
    [[NSString alloc] initWithFormat:@"token=%@;",self.token]
    forKey:@"Set-Cookie"]
    forURL:url];
    这样就加上去了,而且web服务端也拦截到了Cookie.
    ZPengs:每一次SESSION会话都有一个SESSION ID,用来识别不同的会话,保存在浏览器Cookie之中,也就是这个名为PHPSESSID的Cookie(当然,这个名称是可以更改的)
  • 52dc74d38022:为什么我第一次自动登录后可以加载web页面 数据也是正常的 第二次就不行了
    ZPengs:@52dc74d38022 上面有demo 请参考!
  • liyaoyao:楼主,我这边用这个还是不能自动登录,能加下qq交流下么,qq:535814116
  • f62385835449:前提是服务器没有定期更换cookie。
    NSGhoul:要是有定期更新 应该如何实现?

本文标题:保证可行!两步实现iOS UIWebView 通过 cookie

本文链接:https://www.haomeiwen.com/subject/jgafjttx.html