iOS 「請在微信客戶端打開連接」 UIWebview加載H5頁面攜帶session、cookie、User-Agent信息 設置cookie、清除cookie、設置User-Agent

公司新開的一個項目。。內容基本上是加載H5頁面顯示。。當時以爲挺簡單的。。後來發現本身掉坑裏了。。一些心理歷程就不說了。。說這個項目主要用到的知識點吧。。也是本身踩得坑。前端

首先說說。。這個項目上的內容是公司微信公衆號的內容。因此加載的H5的頁面也是公衆號的頁面。。只是爲了有個APP的殼吧。。web

而後呢。在一些頁面是須要登陸信息的,若是沒有登陸則會跳到申請微信登陸受權的界面。這個界面是公衆號申請的。這就是坑的所在。。由於APP打開這些頁面會提示「請在微信客戶端打開連接」。微信

因爲是H5頁面跳轉的。可是小弟我不懂前端的知識。不明白爲何會跳轉。合做的同事讓我本身去找緣由。。我真的以爲鬱悶到家了。不過學到這方面的知識吧。雖然問題的解決方案不是我本身找的。。汗。仍是他告訴我信息才知道。。他告訴我。前端那邊判斷用戶有沒有成立需不須要跳轉是有打開web頁面的時候。攜帶的cookie信息來判斷的。。咱們這裏須要的是一個sessionid與cookie的信息和另外一個時間的cookie聯合判斷。具體判斷規則我就不明白了。。就說說iOS這邊作的處理吧。cookie

既然須要設置cookie。。那麼我就找設置cookie的代碼咯:session

 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 }

。。嘖嘖嘖。。竟然有插入代碼這個功能。以前不會用。。個人鍋。。dom

由於登陸註冊是原生的,因此這邊須要在全部的接口的請求頭加入sessionid的信息。。用來做爲在web頁面的帳號憑據。測試

因此在接口都加了請求頭。。按理說。應該沒問題了。。可是仍是顯示「請在微信客戶端打開連接」。我就奇怪了。。確實不懂這些道道。。虛心的問同事。前端是怎麼判斷的。。結果他說我不會告訴你的。本身找緣由。不會H5是不行。。我這暴脾氣。當場就。。。乖乖回去找資料了。。url

後來發現是否是域名錯了呢。又去問問他域名的規則。。他看了下說。。域名是不能帶「http://」的。。好吧。。這座坑過了。。結果仍是不行。spa

沒辦法,只能繼續埋頭苦幹。。。同事估計以爲我弄得有點久了。過來緬懷一下。發現多是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 }

好了。。結束一個坑。其實不算坑吧,只是不懂前端的知識,若是同事好溝通的話。問題很簡單。

相關文章
相關標籤/搜索