簡介
UIWebView
源于iOS2
,WKWebView
從iOS8
才有,毫無疑問WKWebView
將逐步取代笨重的UIWebView
。WKWebView
只能用代碼創(chuàng)建,而且自身就支持了右滑返回手勢allowsBackForwardNavigationGestures
和加載進度estimatedProgress
等一些UIWebView
不具備卻非常好用的屬性被去。通過簡單的測試即可發(fā)現(xiàn)UIWebView占用過多內(nèi)存,且內(nèi)存峰值更是夸張奖唯。WKWebView
網(wǎng)頁加載速度也有提升惨缆,但是并不像內(nèi)存那樣提升那么多。
下面列舉一些其它的優(yōu)勢:
- 在性能臭埋、穩(wěn)定性踪央、功能方面有很大提升(最直觀的體現(xiàn)就是加載網(wǎng)頁是占用的內(nèi)存,模擬器加載百度與開源中國網(wǎng)站時瓢阴,
WKWebView
占用23M
畅蹂,而UIWebView
占用85M
); - 更多的支持
HTML5
的特性 - 官方宣稱的高達
60fps
的滾動刷新率以及內(nèi)置手勢
Safari
相同的JavaScript
引擎 - 將
UIWebViewDelegate
與UIWebView
拆分成了14類與3個協(xié)議(官方文檔說明) - 另外用的比較多的荣恐,增加加載進度屬性:
estimatedProgress
WKWebView的用法
- 加載網(wǎng)頁方法與UIWebView相同:
// 網(wǎng)頁url
NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
// 網(wǎng)絡(luò)請求
NSURLRequest *request =[NSURLRequest requestWithURL:url];
// 加載網(wǎng)頁
[self.webview loadRequest:request];
- 加載文件
// 創(chuàng)建url(可以隨便從桌面拉張圖片)
NSURL *url = [NSURL fileURLWithPath:@"/Users/ios/Desktop/圖片/xxx.jpg"];
// 加載文件
[webView loadFileURL:url allowingReadAccessToURL:url];
- 其余加載方法
-(WKNavigation *)loadRequest:(NSURLRequest *)request
-(WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
-(WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL;
- 網(wǎng)頁刷新相關(guān)方法
@property (nonatomic, readonly) BOOL canGoBack;
@property (nonatomic, readonly) BOOL canGoForward;
-(WKNavigation *)goBack;
-(WKNavigation *)goForward;
-(WKNavigation *)reload;
-(WKNavigation *)reloadFromOrigin; // 增加的函數(shù)
-(WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item; // 增加的函數(shù)
-(void)stopLoading;
reloadFromOrigin
會比較網(wǎng)絡(luò)數(shù)據(jù)是否有變化液斜,沒有變化則使用緩存,否則從新請求叠穆。
goToBackForwardListItem
:比向前向后更強大少漆,可以跳轉(zhuǎn)到某個指定歷史頁面
常用屬性
allowsBackForwardNavigationGestures:BOOL類型,是否允許左右劃手勢導(dǎo)航硼被,默認不允許
estimatedProgress:加載進度示损,取值范圍0~1
title:頁面title
scrollView.scrollEnabled:是否允許上下滾動,默認允許
backForwardList:WKBackForwardList類型嚷硫,訪問歷史列表检访,可以通過前進后退按鈕訪問,或者通過goToBackForwardListItem函數(shù)跳到指定頁面
相關(guān)代理協(xié)議
幾個常用代理協(xié)議:
(1)WKNavigationDelegate
最常用仔掸,和UIWebViewDelegate
功能類似脆贵,追蹤加載過程,有是否允許加載起暮、開始加載卖氨、加載完成、加載失敗负懦。下面會對方法做簡單的說明筒捺,并用數(shù)字標出調(diào)用的先后次序:
// 接收到服務(wù)器跳轉(zhuǎn)請求之后調(diào)用 (服務(wù)器端redirect),不一定調(diào)用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
// 3 在收到服務(wù)器的響應(yīng)頭纸厉,根據(jù)response相關(guān)信息系吭,決定是否跳轉(zhuǎn)。decisionHandler必須調(diào)用残腌,來決定是否跳轉(zhuǎn)村斟,參數(shù)WKNavigationActionPolicyCancel取消跳轉(zhuǎn)贫导,WKNavigationActionPolicyAllow允許跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
// 1 在發(fā)送請求之前,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
追蹤加載過程方法:
// 2 頁面開始加載
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// 4 開始獲取到網(wǎng)頁內(nèi)容時返回
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
// 5 頁面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// 頁面加載失敗時調(diào)用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;
(2)WKUIDelegate
UI界面相關(guān)蟆盹,原生控件支持孩灯,三種提示框:輸入、確認逾滥、警告峰档。首先將web提示框攔截然后再做處理。
// 創(chuàng)建一個新的WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
// 輸入框
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler;
// 確認框
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
// 警告框
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
與JS交互
- (1)WKWebView加載JS
//JS文件路徑
NSString *jsPath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];
//讀取JS文件內(nèi)容
NSString *jsContent = [NSString stringWithContentsOfFile:jsPath encoding:NSUTF8StringEncoding error:nil];
//創(chuàng)建用戶腳本對象寨昙,
//WKUserScriptInjectionTimeAtDocumentStart :HTML文檔創(chuàng)建后讥巡,完成加載前注入,類似于<head>中
//WKUserScriptInjectionTimeAtDocumentEnd :HTML文件完成加載后注入,類似于<body>中
WKUserScript *script = [[WKUserScript alloc] initWithSource:jsContent injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
//添加用戶腳本
[webView.configuration.userContentController addUserScript:script];
- (2)WKWebView執(zhí)行JS方法
//執(zhí)行JS方法
[webView evaluateJavaScript:@"test()" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
//result為執(zhí)行js方法的返回值
if(error){
NSLog(@"Success");
}else{
NSLog(@"Fail");
}
}];