介紹
WWDC2014推出ios8巧骚,其中webkit對(duì)應(yīng)的WKWebView相對(duì)于uiwebview更加強(qiáng)大,內(nèi)存圾结、加載速度更優(yōu)瑰剃。
- 在性能、穩(wěn)定性筝野、功能方面有很大提升
- 允許JavaScript的Nitro庫(kù)加載并使用(UIWebView中限制)
- 支持了更多的HTML5特性
- 高達(dá)60fps的滾動(dòng)刷新率以及內(nèi)置手勢(shì)
- 將UIWebViewDelegate與UIWebView重構(gòu)成了14類與3個(gè)協(xié)議
環(huán)境
Mac OS X 10.10.1
Xcode 6.1.1
iOS 8.1
初始化
#import <WebKit/WebKit.h>
// 默認(rèn)初始化
- (instancetype)initWithFrame:(CGRect)frame;
// 根據(jù)對(duì)webview的相關(guān)配置晌姚,進(jìn)行初始化
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
//加載網(wǎng)頁(yè)
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:webView];
WKWebView的代理方法
WKWebView的代理方法
WKNavigationDelegate
// 頁(yè)面開(kāi)始加載時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// 當(dāng)內(nèi)容開(kāi)始返回時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
// 頁(yè)面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// 頁(yè)面加載失敗時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;
//頁(yè)面跳轉(zhuǎn)
// 接收到服務(wù)器跳轉(zhuǎn)請(qǐng)求之后調(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ā)送請(qǐng)求之前歇竟,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
執(zhí)行順序:
webView:decidePolicyForNavigationAction:decisionHandler(如果拒絕則后續(xù)無(wú)其他回調(diào))
webView:didStartProvisionalNavigation
webView:decidePolicyForNavigationResponse:decisionHandler(如果拒絕則收到error回調(diào))
webView:didCommitNavigation
webView:didFinishNavigation
2. WKUIDelegate
// 創(chuàng)建一個(gè)新的WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
//警告框挥唠、確認(rèn)框、輸入框
/**
* web界面中有彈出警告框時(shí)調(diào)用
*
* @param webView 實(shí)現(xiàn)該代理的webview
* @param message 警告框中的內(nèi)容
* @param frame 主窗口
* @param completionHandler 警告框消失調(diào)用
*/
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler;
3. WKScriptMessageHandler
提高App與web端交互, 將接收到的JS腳本轉(zhuǎn)為OC或Swift對(duì)象
// 從web界面中接收到一個(gè)腳本時(shí)調(diào)用
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
4.WKWebView加載JS
// 圖片縮放的js代碼
NSString *js = @"var count = document.images.length;for (var i = 0; i < count; i++) {var image = document.images[i];image.style.width=320;};window.alert('找到' + count + '張圖');";
// 根據(jù)JS字符串初始化WKUserScript對(duì)象
WKUserScript *script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
// 根據(jù)生成的WKUserScript對(duì)象焕议,初始化WKWebViewConfiguration
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config.userContentController addUserScript:script];
_webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
[_webView loadHTMLString:@"<head></head>![](http://upload-images.jianshu.io/upload_images/832398-a96d086fbf5dc89c.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)" baseURL:nil];
[self.view addSubview:_webView];