UIWebView從 iOS2 就有,iOS8 以后,蘋果推出了新框架 WebKit,提供了替換 UIWebView 的組件 WKWebView。各種 UIWebView 的性能問題沒有了,速度更快了,占用內(nèi)存少了,體驗更好了,下面列舉一些其它的優(yōu)勢:
1、在性能、穩(wěn)定性、功能方面有很大提升(加載速度,內(nèi)存的提升誰用誰知道)
2、更多的支持 HTML5 的特性
3、官方宣稱的高達60fps的滾動刷新率以及內(nèi)置手勢
4、Safari 相同的 JavaScript 引擎
5、將 UIWebViewDelegate 與 UIWebView 拆分成了14類與3個協(xié)議,包含該更細節(jié)功能的實現(xiàn)。
相比之下,WKWebView 復(fù)雜得多,一些常用API如下:
@protocol WKNavigationDelegate <NSObject> @optional //請求之前,決定是否要跳轉(zhuǎn):用戶點擊網(wǎng)頁上的鏈接,需要打開新頁面時,將先調(diào)用這個方法。 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler; //接收到相應(yīng)數(shù)據(jù)后,決定是否跳轉(zhuǎn) - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler; //頁面開始加載時調(diào)用 - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation; // 主機地址被重定向時調(diào)用 - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation; // 頁面加載失敗時調(diào)用 - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error; // 當(dāng)內(nèi)容開始返回時調(diào)用 - (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation; // 頁面加載完畢時調(diào)用 - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation; //跳轉(zhuǎn)失敗時調(diào)用 - (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error; // 如果需要證書驗證,與使用AFN進行HTTPS證書驗證是一樣的 - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *__nullable credential))completionHandler; //9.0才能使用,web內(nèi)容處理中斷時會觸發(fā) - (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0); @end
Cookie同步
不同于UIWebView,WKWebView會忽視默認的網(wǎng)絡(luò)存儲, NSURLCache, NSHTTPCookieStorage, NSCredentialStorage。 目前是這樣的,WKWebView有自己的進程,同樣也有自己的存儲空間用來存儲cookie和cache, 其他的網(wǎng)絡(luò)類如NSURLConnection是無法訪問到的。 同時WKWebView發(fā)起的資源請求也是不經(jīng)過NSURLProtocol的,導(dǎo)致無法自定義請求。
方法1、同域名 C/S->B/S同步
如果C/S和B/S中,服務(wù)器端域名一致的話,在初始化WkWebView時同步即可
NSURL *url = [NSURL URLWithString:urlString]; NSMutableString *cookies = [NSMutableString string]; NSMutableURLRequest *requestObj = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; // 一般都只需要同步JSESSIONID,可視不同需求自己做更改 NSString * JSESSIONID; // 獲取本地所有的Cookie NSArray *tmp = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]; for (NSHTTPCookie * cookie in tmp) { if ([cookie.name isEqualToString:@"JSESSIONID"]) { JSESSIONID = cookie.value; break; } } if (JSESSIONID.length) { // 格式化Cookie [cookies appendFormat:@"JSESSIONID=%@;",JSESSIONID]; } // 注入Cookie [requestObj setValue:cookies forHTTPHeaderField:@"Cookie"]; // 加載請求 [self.wk_webView loadRequest:requestObj];
方法2、不同域名C/S->B/S
注意:我們這里實際上重新loadRequest了,正常情況下,我們應(yīng)該拷貝原來的request
NSMutableURLRequest*mutableRequest=[requestmutableCopy];//拷貝request
方法三3、B/S->C/S同步
在WkWebView接收到Response后,將Response帶的Cookies取出,然后直接放入[NSHTTPCookieStorage sharedHTTPCookieStorage] 容器中:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{ NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response; NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL]; for (NSHTTPCookie *cookie in cookies) { [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; } decisionHandler(WKNavigationResponsePolicyAllow); }
方法評價所有的同步過程中,我們發(fā)現(xiàn)使用了NSHTTPCookieStorage(當(dāng)然UIWebView也使用了此類自動同步),對于方法1而言,對于跳轉(zhuǎn)則會丟失cookie,因此實際使用中推薦2、3兩種方法。
注意:方法2給出的是個簡單例子,由于不同域名同步時,我們獲取到cookie種Domain和Path可能不同,否則,因此需要手動替換,否則同樣無法同步。
分享標(biāo)題:iOSWKWebViewCookie同步
文章出自:http://m.kartarina.com/article32/cpcisc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、靜態(tài)網(wǎng)站、網(wǎng)站排名、網(wǎng)站策劃、品牌網(wǎng)站制作、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)