WKWebview 如何設(shè)置其UserAgent和Cookie
介紹這些之前我們需要先了解一下什么是UserAgent和Cookie.
UserAgent:這個(gè)值一般是瀏覽器用來標(biāo)志自己身份的一個(gè)值,不同的瀏覽器有不同的值.例如Safari上面值為Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.1 Safari/605.1.15
Cookie:作用是為了維持用戶狀態(tài)的,它被定義為了一個(gè)HTTP的頭部字段,服務(wù)端通過響應(yīng)頭部返回Set-Cookie可以指示客戶端保存這個(gè)值,客戶端可以通過請(qǐng)求頭部設(shè)置Cookie字段告訴服務(wù)端這個(gè)字段的值,來維持客戶端和服務(wù)端的會(huì)話狀態(tài)
一般開發(fā)中我們可能會(huì)涉及到這個(gè)兩個(gè)的值得設(shè)置,這兩個(gè)值在WebView中比較好設(shè)置,但是在WKWebView中就比較的麻煩了.
WKWebView設(shè)置UserAgent:
iOS9之后系統(tǒng)提供了一個(gè)customUserAgentAPI可以直接設(shè)置,但是iOS8系統(tǒng)沒有提供相應(yīng)的API.不過我們可以通過別的方式設(shè)置
[WKWebView setValue:@"lsh token " forKey:@"applicationNameForUserAgent"];//KVC設(shè)置
//當(dāng)然還有另一種方式可以全局設(shè)置
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString*newUserAgent = [userAgentstringByAppendingString:@" origin/sfddjapp"];
newUserAgent = [newUserAgentstringByAppendingString:[NSStringstringWithFormat:@" token/%@",@"xxx -- xxx"]];
NSDictionary*dictionary = [NSDictionarydictionaryWithObjectsAndKeys:newUserAgent,@"UserAgent",nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
[[NSUserDefaults standardUserDefaults] synchronize];
PS:設(shè)置UserAgent的時(shí)候盡量跟瀏覽器的格式保持一致
WKWebView設(shè)置Cookie
Cookie這個(gè)問題是個(gè)很重要的問題,APP內(nèi)webView與原生的同步登陸狀態(tài)等等,好多都用到Cookie.可惜WKWebView對(duì)CooKie的支持實(shí)在是不好.
iOS11之后系統(tǒng)增加了設(shè)置Cookie的API
//configuration 的websiteDataStore.httpCookieStore可以設(shè)置
[WKWebViewConfiguration.websiteDataStore.httpCookieStore setCookie:NSHTTPCookie completionHandler:^{
}];
iOS11之前改如何設(shè)置呢,一般來說我們的Cookie都會(huì)被服務(wù)端設(shè)置為HTTPOnly.這個(gè)字段的意思就是Cookie只允許請(qǐng)求中發(fā)送是不允許前端通過document.cookie獲取的(Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; HttpOnly)
如果我們不需要前端獲取Cookie那我們就可以直接在請(qǐng)求的Header中注入Cookie字段就可以了
[request addValue:@"TeskCookieKey1=TeskCookieValue1;TeskCookieKey2=TeskCookieValue2;" forHTTPHeaderField:@"Cookie"];
假如我們需要前端也獲取到CooKie的話我們可以通過在前端頁面剛開始加載的時(shí)候注入腳本,給document.cookie賦值
WKUserScript * cookieScript = [[WKUserScript alloc]
initWithSource: @"document.cookie = 'TeskCookieKey1=TeskCookieValue1';document.cookie = 'TeskCookieKey2=TeskCookieValue2';"
injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
PS:盡量不要讓前端獲取Cookie,因?yàn)槿绻?a target="_blank" rel="nofollow">XSS攻擊可能讓攻擊者獲取到Cookie,從而可以訪問一些需要Cookie的頁面