開發(fā)個新項目娱俺,全部用web端稍味,就原生的幾個tabbar,于是選擇了WKWebView
荠卷,把遇到的問題總結(jié)下模庐。
WKWebView手勢返回
/*! @abstract A Boolean value indicating whether horizontal swipe gestures
will trigger back-forward list navigations.
@discussion The default value is NO.
*/
@property (nonatomic) BOOL allowsBackForwardNavigationGestures;
(自定義wkweb).allowsBackForwardNavigationGestures=YES;(UIWebview 沒這個方法)
NSHTTPCookieStorage和NSHttpCookie
NSHTTPCookieStorage 實現(xiàn)管理cookie的單利,每個cookie都是NSHTTPCookie類的實例僵朗,做為一個規(guī)則,cookie在所有應(yīng)用 之間共享并在不同進(jìn)程之間保持同步屑彻。Session cookie(一個isSessionOnly方法返回YES的cookie)只能在單一進(jìn)程中使用验庙。
WKWebView Cookie
NSURLCache和NSHTTPCookieStroage無法操作(WKWebView)WebCore進(jìn)程的緩存和Cookie
WKWebView實例將會忽略任何的默認(rèn)網(wǎng)絡(luò)存儲器(NSURLCache, NSHTTPCookieStorage, NSCredentialStorage) 和一些標(biāo)準(zhǔn)的自定義網(wǎng)絡(luò)請求類(NSURLProtocol,等等.).
WKWebView實例不會把Cookie存入到App標(biāo)準(zhǔn)的的Cookie容器(NSHTTPCookieStorage)中,因為 NSURLSession/NSURLConnection等網(wǎng)絡(luò)請求使用NSHTTPCookieStorage進(jìn)行訪問Cookie,所以不能訪問WKWebView的Cookie,現(xiàn)象就是WKWebView存了Cookie,其他的網(wǎng)絡(luò)類如NSURLSession/NSURLConnection卻看不到
與Cookie相同的情況就是WKWebView的緩存,憑據(jù)等。WKWebView都擁有自己的私有存儲,因此和標(biāo)準(zhǔn)cocoa網(wǎng)絡(luò)類兼容的不是那么好
你也不能自定義requests(增加自己的http header,更改已經(jīng)存在的header)使用自定義的 URL schemes等等,因為NSURLProtocol也是不支持WKWebView的
同一個WKWebView 的Cookie是共享的社牲,但是同一個應(yīng)用中創(chuàng)建多個WKWebView
時粪薛,想要登錄等信息同步,就需要共享Cookie搏恤,這是一個辦法违寿。
WKWebView Cookie 讀取
找不到貼代碼的格式
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
if (![ToolData sharedToolData].cookieArr) {
NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;
NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL];
//讀取wkwebview中的cookie 方法 存儲起來? 等待注入時用
for (NSHTTPCookie *cookie in cookies) {
DLog(@"wkwebview中的cookie:%@", cookie);
NSArray *cookieArr = [NSArray arrayWithObjects:cookie.name, cookie.value,cookie.domain,cookie.path,nil];
[_cookieMutaArr addObject:cookieArr];
}
[ToolData sharedToolData].cookieArr = [_cookieMutaArr copy];
}
decisionHandler(WKNavigationResponsePolicyAllow);
}
WKWebView Cookie 寫入
JS 注入
WKUserContentController* userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: @"document.cookie ='TeskCookieKey1=TeskCookieValue1';document.cookie = 'TeskCookieKey2=TeskCookieValue2';"injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
WKWebViewConfiguration* webViewConfig = WKWebViewConfiguration.new;
webViewConfig.userContentController = userContentController;
WKWebView * webView = [[WKWebView alloc] initWithFrame:CGRectMake(/*set your values*/) configuration:webViewConfig];
其中js的寫法問題,有可能有多個寫法是cookie之間用熟空;隔開藤巢。 NSString *jscontext = [NSString stringWithFormat:@"document.cookie ='%@=%@;domain=%@;path=%@;';",[ToolData sharedToolData].cookieArr[i][0],[ToolData sharedToolData].cookieArr[i][1],[ToolData sharedToolData].cookieArr[i][2],[ToolData sharedToolData].cookieArr[i][3]];
當(dāng)自己看不到時,可以打印息罗,也可以用抓包工具查看注入的cookie掂咒。其實上面的js注入方法,是在上圖的? Response Headers上面注入的迈喉,所以說 后期會有些問題绍刮,一般不建議這樣注入解決問題。會慢一拍挨摸。以下寫入請求頭解決這個問題
WKWebView Cookie 寫入到請求頭
NSMutableURLRequest *requset = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:_urlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20];
[requset addValue:_badyhead forHTTPHeaderField:@"Cookie"];
[self.wkbaseweb loadRequest:requset];
//以下是獲取Cookie 放到請求頭孩革,但要注意把 value值中的“;“去掉得运,否則沒有效果膝蜈,親試
{
_badyhead =[NSMutableString string];
for (int i = 0; i<[ToolData sharedToolData].cookieArr.count; i++) {
NSString *bady = [NSString stringWithFormat:@"%@=%@;",[ToolData sharedToolData].cookieArr[i][0],[ToolData sharedToolData].cookieArr[i][1]];
[_badyhead appendFormat:@"%@",bady];
}
[_badyhead deleteCharactersInRange:NSMakeRange(_badyhead.length - 1, 1)];
}