使用WKWebView
問題描述:iOS 通過WKWebView加載H5頁面,H5頁面中發(fā)送了post請求數(shù)據(jù)(此請求服務(wù)器會(huì)驗(yàn)證是否登錄,判斷cookie中是否存在sessionID),由于登錄信息也就是sessionID沒有傳到H5頁面(H5頁面獲取不到此sessionID,cookie為空),所以服務(wù)器判斷該用戶未登錄,會(huì)重定向到登錄界面,iOS會(huì)攔截該請求,所以導(dǎo)致請求出錯(cuò)。安卓這丫的沒這問題。
請求302


跨目錄獲取不到cookie

解決方法:iOS通過注入JS代碼到H5頁面,把sessionID賦值到H5頁面的cookie中。記得cookie要設(shè)置path路徑到根目錄下—document.cookie=name+'='+value+';path=/;expires='+oDate;不然其他目錄下的請求訪問cookie。
document.cookie=name+'='+value+';path=/;expires='+oDate;
代碼可寫在下面方法中:
// 導(dǎo)航完成時(shí)
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation {
或者一開始配置的時(shí)候就注冊js代碼
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config.userContentController addUserScript:[[WKUserScript alloc] initWithSource:[self setCookieToJS] injectionTime:(WKUserScriptInjectionTimeAtDocumentStart) forMainFrameOnly:YES]]
//為wkwebview 的H5代碼注入js代碼賦值cookie
-(NSString *)setCookieToJS{ ? ?
????//取出cookie ? ?
????NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; ?
?????for (NSHTTPCookie *cookie in cookieStorage.cookies) { ? ? ? ?
????????????NSLog(@"name = %@ value = %@",cookie.name,cookie.value); ? ?
????} ? ?
????//js函數(shù) ? ?
????NSString *JSFuncString = ? ? @"function setCookie(name,value,expires)\ ? ?
????{\ ? ? var oDate=new Date();\ ? ?
????oDate.setDate(oDate.getDate()+expires);\ ? ?
????document.cookie=name+'='+value+';path=/;expires='+oDate;\ ? ?
????}\ ? ?
????function getCookie(name)\ ? ?
????{\ ? ?
????var arr = document.cookie.match(new RegExp('(^| )'+name+'=([^;]*)(;|$)'));\ ? ?
????if(arr != null) return unescape(arr[2]); return null;\ ? ?
????}\ ? ?
????function delCookie(name)\ ? ?
????{\ ? ?
????var exp = new Date();\ ? ?
????exp.setTime(exp.getTime() - 1);\ ? ?
????var cval=getCookie(name);\ ? ?
????if(cval!=null) document.cookie= name + '='+cval+';expires='+exp.toGMTString();\ ? ?
????}";
????//拼湊js字符串? ??
????NSMutableString *JSCookieString = JSFuncString.mutableCopy; ? ?
????for (NSHTTPCookie *cookie in cookieStorage.cookies) { ? ? ? ?
????????//判斷此cookie屬于當(dāng)前url ? ? ? ?
????????if([cookie.name isEqualToString:@"JSESSIONID"] && [_urlString containsString:cookie.domain] ){ ? ? ? ? ? ?
????????????NSString *excuteJSString = [NSString stringWithFormat:@"setCookie('%@', '%@', 1);", cookie.name, cookie.value]; ? ? ? ? ? ?
????????????[JSCookieString appendString:excuteJSString]; ? ? ? ?
????????} ? ?
????} ? ?
????return JSCookieString;
}
創(chuàng)建WKWebView的時(shí)候要配置cookie,傳cookie
NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary]; ? ?
NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""]; ? ?
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];? ? ? ?
? // cookie重復(fù),先放到字典進(jìn)行去重,再進(jìn)行拼接 ? ?
for (NSString *key in cookieDic) { ? ? ? ?
????NSString *appendString = [NSString stringWithFormat:@"%@=%@", key, [cookieDic valueForKey:key]]; ? ? ? ? [cookieValue appendString:appendString]; ? ?
} ?? ? ? ?
NSURL *url = [NSURL URLWithString:_urlString]; ? ?
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; ? ?
[request addValue:cookieValue forHTTPHeaderField:@"Cookie"]; ? ?
[request addValue:@"app" forHTTPHeaderField:@"requestType"]; ?? ? ? ?
[self.webView loadRequest:request]; ? ?
self.webView.navigationDelegate = self; ? ?
self.webView.UIDelegate = self;