公司新開的一個項目。。內容基本上是加載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 }
好了。。結束一個坑。其實不算坑吧,只是不懂前端的知識,如果同事好溝通的話。問題很簡單。