為了解決UIWebView加載速度慢、占用內(nèi)存大的問題聘裁,蘋果在iOS8.0之后推出了WKWebView以替代之,在使用WKWebView前先引入<WebKit/WebKit.h>框架我注。
WKWebView屬性
WKWebView在原有基礎上額外添加了幾個屬性如下:
// 瀏覽器配置;
@property (nonatomic, readonly, copy) WKWebViewConfiguration *configuration;
// 歷史訪問列表;
@property (nonatomic, readonly, strong) WKBackForwardList *backForwardList;
// 網(wǎng)頁加載進度;
@property (nonatomic, readonly) double estimatedProgress;
WKWebView代理
WKWebView可以同時設置WKNavigationDelegate和WKUIDelegate兩個代理握恳,代理方法也有所改變?nèi)缦拢?/p>
#pragma mark - WKNavigationDelegate
// 在發(fā)送請求前的操作;
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {}
// 在收到響應后的操作;
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {}
// 在頁面重指向時的操作;
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation {}
// 頁面準備加載;
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {}
// 頁面開始加載;
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {}
// 頁面完成加載;
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {}
// 頁面加載失敗;
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {}
// 頁面跳轉(zhuǎn)失敗;
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error {}
#pragma mark - WKUIDelegate
// 創(chuàng)建新的WebView;
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {}
// 攔截警告框
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {}
// 攔截確認框
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {}
// 攔截提示框
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler {}
此外WKWebView新增了根據(jù)文件加載WebView的方法:
- (nullable WKNavigation *)loadFileURL:(NSURL *)URL allowingReadAccessToURL:(NSURL *)readAccessURL NS_AVAILABLE(10_11, 9_0);
WebViewJavascriptBridge實現(xiàn)交互
在項目中使用WebViewJavascriptBridge先添加OC代碼如下:
WKWebView* webView = [[NSClassFromString(@"WKWebView") alloc] initWithFrame:self.view.bounds];
webView.navigationDelegate = self;
[self.view addSubview:webView];
// 設置允許橋接
[WKWebViewJavascriptBridge enableLogging];
// 初始化橋接對象并設置代理
_bridge = [WKWebViewJavascriptBridge bridgeForWebView:webView];
[_bridge setWebViewDelegate:self];
// 注冊函數(shù)testObjcCallback引用JS
[_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"testObjcCallback called: %@", data);
responseCallback(@"Response from testObjcCallback");
}];
// 回調(diào)函數(shù)testJavascriptHandler供JS引用
[_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];
[self renderButtons:webView];
[self loadExamplePage:webView];
然后在HTML文件中添加js代碼如下:
function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
OC引用JS
OC中注冊函數(shù):
[_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"testObjcCallback called: %@", data);
responseCallback(@"Response from testObjcCallback");
}];
JS中實現(xiàn)回調(diào)函數(shù):
setupWebViewJavascriptBridge(function(bridge) {
bridge.callHandler('testObjcCallback', {'foo': 'bar'}, function(response) {
// 該函數(shù)為js中聲明的函數(shù);
log('JS got response', response)
})
})
JS引用OC
JS中注冊函數(shù):
bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
log('ObjC called testJavascriptHandler with', data)
var responseData = { 'Javascript Says':'Right back atcha!' }
log('JS responding with', responseData)
responseCallback(responseData)
})
OC中實現(xiàn)回調(diào)并傳值:
[_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];
以上就是WebViewJavascriptBridge與WKWebView的基本交互使用挖帘。