iOS8蘋果偏愛HTML5,重構(gòu)了UIWebVIew,給我們帶來了WKWebView,使其性能、穩(wěn)定性、功能大幅度提升,也更好的支持了HTML5的新特性。
一、WKWebView Framework
WKWebView的14個類與3個協(xié)議:
-
WKBackForwardList
: 之前訪問過的 web 頁面的列表,可以通過后退和前進(jìn)動作來訪問到。 -
WKBackForwardListItem
: webview 中后退列表里的某一個網(wǎng)頁。 -
WKFrameInfo
: 包含一個網(wǎng)頁的布局信息。 -
WKNavigation
: 包含一個網(wǎng)頁的加載進(jìn)度信息。 -
WKNavigationAction
: 包含可能讓網(wǎng)頁導(dǎo)航變化的信息,用于判斷是否做出導(dǎo)航變化。 -
WKNavigationResponse
: 包含可能讓網(wǎng)頁導(dǎo)航變化的返回內(nèi)容信息,用于判斷是否做出導(dǎo)航變化。 -
WKPreferences
: 概括一個 webview 的偏好設(shè)置。 -
WKProcessPool
: 表示一個 web 內(nèi)容加載池。 -
WKUserContentController
: 提供使用 JavaScript post 信息和注射 script 的方法。 -
WKScriptMessage
: 包含網(wǎng)頁發(fā)出的信息。 -
WKUserScript
: 表示可以被網(wǎng)頁接受的用戶腳本。 -
WKWebViewConfiguration
: 初始化 webview 的設(shè)置。 -
WKWindowFeatures
: 指定加載新網(wǎng)頁時的窗口屬性。 -
WKWebsiteDataStore
: 包含網(wǎng)頁數(shù)據(jù)存儲和查找。 -
WKNavigationDelegate
: 提供了追蹤主窗口網(wǎng)頁加載過程和判斷主窗口和子窗口是否進(jìn)行頁面加載新頁面的相關(guān)方法。 -
WKUIDelegate
: 提供用原生控件顯示網(wǎng)頁的方法回調(diào)。 -
WKScriptMessageHandler
: 提供從網(wǎng)頁中收消息的回調(diào)方法。
二、WKWebView中的三個代理方法
1. WKNavigationDelegate
該代理提供的方法,可以用來追蹤加載過程(頁面開始加載、加載完成、加載失敗)、決定是否執(zhí)行跳轉(zhuǎn)。
// 頁面開始加載時調(diào)用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// 當(dāng)內(nèi)容開始返回時調(diào)用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
// 頁面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// 頁面加載失敗時調(diào)用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;
頁面跳轉(zhuǎn)的代理方法有三種,分為(收到跳轉(zhuǎn)與決定是否跳轉(zhuǎn)兩種)
// 接收到服務(wù)器跳轉(zhuǎn)請求之后調(diào)用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
// 在收到響應(yīng)后,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
// 在發(fā)送請求之前,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
2. WKUIDelegate
創(chuàng)建一個新的WKWebView
// 創(chuàng)建一個新的WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
剩下三個代理方法全都是與界面彈出提示框相關(guān)的,針對于web界面的三種提示框(警告框、確認(rèn)框、輸入框)分別對應(yīng)三種代理方法。
// 界面彈出警告框
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler;
// 界面彈出確認(rèn)框
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
// 界面彈出輸入框
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler;
3. WKScriptMessageHandler
這個協(xié)議中包含一個必須實現(xiàn)的方法,這個方法是native與web端交互的關(guān)鍵,它可以直接將接收到的JS腳本轉(zhuǎn)為OC或Swift對象。
// 從web界面中接收到一個腳本時調(diào)用
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
三、使用WKWebView
1.創(chuàng)建
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.preferences.minimumFontSize = 18;
self.wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height/2) configuration:config];
[self.view addSubview:self.wkWebView];
//加載本地HTML
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSURL *baseURL = [[NSBundle mainBundle] bundleURL];
[self.wkWebView loadHTMLString:[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil] baseURL:baseURL];
2.js調(diào)用oc
(1)先在HTML聲明調(diào)用方法:
window.webkit.messageHandlers.showMobile.postMessage(data)
showMobile
:方法名
data
:js向oc傳的參數(shù),可為null
(2)在oc中注冊需要的方法:
WKUserContentController *userCC = config.userContentController;
//JS調(diào)用OC 添加處理腳本 方法名必須和js里的方法一樣
[userCC addScriptMessageHandler:self name:@"showMobile"];
(3)在WKScriptMessageHandler
代理中實現(xiàn)
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
if ([message.name isEqualToString:@"showMobile"])
{
// 實現(xiàn)你的需求
}
}
2.oc調(diào)用js
(1)在HTML注冊所需方法:
function alertMobile() {
}
(2)oc中調(diào)用:
[self.wkWebView evaluateJavaScript:@"alertMobile()" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
//TODO
NSLog(@"%@ %@",response,error);
}];