• iOS “请在微信客户端打开链接” UIWebview加载H5页面携带session、cookie、User-Agent信息 设置cookie、清除cookie、设置User-Agent


    公司新开的一个项目。。内容基本上是加载H5页面显示。。当时觉得挺简单的。。后来发现自己掉坑里了。。一些心理历程就不说了。。说这个项目主要用到的知识点吧。。也是自己踩得坑。

    首先说说。。这个项目上的内容是公司微信公众号的内容。所以加载的H5的页面也是公众号的页面。。只是为了有个APP的壳吧。。

    然后呢。在一些页面是需要登录信息的,如果没有登录则会跳到申请微信登录授权的界面。这个界面是公众号申请的。这就是坑的所在。。因为APP打开这些页面会提示“请在微信客户端打开链接”。

    由于是H5页面跳转的。但是小弟我不懂前端的知识。不明白为什么会跳转。合作的同事让我自己去找原因。。我真的觉得郁闷到家了。不过学到这方面的知识吧。虽然问题的解决方案不是我自己找的。。汗。还是他告诉我信息才知道。。他告诉我。前端那边判断用户有没有成立需不需要跳转是有打开web页面的时候。携带的cookie信息来判断的。。我们这里需要的是一个sessionid与cookie的信息和另一个时间的cookie联合判断。具体判断规则我就不明白了。。就说说iOS这边做的处理吧。

    既然需要设置cookie。。那么我就找设置cookie的代码咯:

     1 #pragma mark 设置cookie-------cookie名称、cookie值、cookie域名
     2 +(void)setCookieWithName:(NSString *)name value:(NSString *)value domain:(NSString *)domain{
     3     NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary]; // 创建cookie属性字典
     4     [cookieProperties setObject:name forKey:NSHTTPCookieName]; // 手动设置cookie的属性....值的名称
     5     [cookieProperties setObject:value forKey:NSHTTPCookieValue];//cookie的值
     6     [cookieProperties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60*24*7] forKey:NSHTTPCookieExpires];//cookie过期时间
     7     [cookieProperties setObject:domain forKey:NSHTTPCookieDomain];//cookie域名
     8     [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];//路径分隔符
     9     //    [cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieOriginURL];//cookie的url..这里不需要
    10     //    [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];//cookie的版本。。这里也不需要
    11     NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];//设置cookie
    12     [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
    13 }

    。。啧啧啧。。居然有插入代码这个功能。之前不会用。。我的锅。。

    因为登录注册是原生的,所以这边需要在所有的接口的请求头加入sessionid的信息。。用来作为在web页面的账号凭据。

    所以在接口都加了请求头。。按理说。应该没问题了。。但是还是显示“请在微信客户端打开链接”。我就奇怪了。。确实不懂这些道道。。虚心的问同事。前端是怎么判断的。。结果他说我不会告诉你的。自己找原因。不会H5是不行。。我这暴脾气。当场就。。。乖乖回去找资料了。。

    后来发现是不是域名错了呢。又去问问他域名的规则。。他看了下说。。域名是不能带“http://”的。。好吧。。这座坑过了。。结果还是不行。

    没办法,只能继续埋头苦干。。。同事估计觉得我弄得有点久了。过来缅怀一下。发现可能是User-Agent 不一样的缘故。。接口请求的User-Agent 和webview的User-Agent 要一致。。好嘛。。胜利的曙光貌似在眼前闪耀。

    在接口请求头信息加上User-Agent 的信息。再设置webview的User-Agent 。接口请求头设置相关信息就不贴了。应该挺好搜的。下面是webview设置User-Agent 的代码:

    1 //webView设置UA
    2 +(void)setUserAgent:(UIWebView *)webView{
    3     
    4     NSString *userAgent=@"User-Agent message";
    5 
    6     [[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent" : userAgent, @"User-Agent" : userAgent}];
    7 
    8 }

    开始我是每次打开都给设置了一次User-Agent。。不过这个和cookie一样。都不需要重复设置。。只要在适当的时候设置一次就行了。

    然后满心欢喜的测试了一下。。还是不行。。啧啧啧。。当时真的是想砸电脑了。。

    重复检查。同事说的。User-Agent、cookie、authTime信息是不是有,是不是和接口请求一致的。。没问题啊。。怎么都没问题啊。。

    最后同事又来看了一次。。说2个cookie的域名是不一样的。。差点抽刀子了。。不早说。。不过看到成功的界面。。让我放他一条生路。。此致结束。。下面是一些辅助查看的代码:

    1 //清除全部cookie信息
    2         NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:url];  
    3         for (int i = 0; i < [cookies count]; i++) {  
    4             NSHTTPCookie *cookie = (NSHTTPCookie *)[cookies objectAtIndex:i];  
    5             [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];                
    6         }  
    1 //删除特定名称的cookie
    2     NSArray * cookArray = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[NSURL URLWithString:@"cookie的url"]];
    3     for (NSHTTPCookie*cookie in cookArray) {
    4         //需要删除的cookie名称
    5         if ([cookie.name isEqualToString:@"cookiename"]) {
    6             [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    7         }
    8     }
     1 //加载webview的时候调用的代理方法
     2 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
     3     //查看所有的cookie信息。。
     4     NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
     5     for (NSHTTPCookie *cookie in [cookieJar cookies]) {
     6         NSLog(@"cookie信息-----------%@", cookie);
     7     }
     8     //打印出请求头。可以看到User-Agent信息
     9     NSLog(@"请求头信息-----%@",request.allHTTPHeaderFields);
    10     return YES;
    11 }

    好了。。结束一个坑。其实不算坑吧,只是不懂前端的知识,如果同事好沟通的话。问题很简单。

  • 相关阅读:
    MongoDB的基本操作
    Python 进阶 之 协程
    sublime text3 3143 注册码
    git add 文档
    Corosync 配置描述
    Centos 7 设置 DNS
    2017百度春招<度度熊买帽子的问题>
    leetcode 160. Intersection of Two Linked Lists
    leetcode 155. Min Stack
    leetcode 141 142. Linked List Cycle
  • 原文地址:https://www.cnblogs.com/guanshenbao/p/6008671.html
Copyright © 2020-2023  润新知