Xcode8發布之后Apple推出了新控件 WKWebView,WKWebView 存在很多優勢支持更多的HTML5的特性、高達60fps滾動刷新頻率與內置手勢、與Safari相容的JavaScript引擎、在性能、穩定性方面有很大提升占用內存更少 協議方法及功能都更細致、可獲取加載進度等。最主要的是大大降低了內存消耗。首先需要導入#import<WebKit/WebKit.h>
實現代理:WKNavigationDelegate,WKScriptMessageHandler,WKUIDelegate。
主要代碼:
WKWebViewConfiguration?*config?=?[[WKWebViewConfiguration?alloc]init];//交互用到的類庫
WKWebView?*webView?=?[[WKWebView?alloc]initWithFrame:self.view.bounds?configuration:config];
NSURLRequest?*request?=?[[NSURLRequest?alloc]initWithURL:[NSURL?URLWithString:@"Your URL"]];
[request addValue:[USERDEFALE objectForKey:@"Token"] forHTTPHeaderField:@"token"];//添加頭部信息
[webView?loadRequest:request];
[self.view?addSubview:webView];
實現的主要協議:
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// WKNavigationDelegate 頁面開始加載時調用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// WKNavigationDelegate 當內容開始返回時調用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error;
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
WKWebView可以直接添加對約定的ScriptMessage(直譯為 腳本信息,本文暫定為JS事件)的監聽,即可實現JS調用OC。所有的操作都是通過WKUserContentController來處理的
JS調用OC
首先在JS代碼中加入對事先約定好的 ScriptMessage(JS事件)的調用:window.webkit.messageHandlers.<事件名>.postMessage(需要傳遞的數據)
同時OC端則需要加入對此JS事件的監聽:window.webkit.messageHandlers.事件名.postMessage()
//主要方法,在這里處理交互信息
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
if ([message.name isEqualToString:@"closeWindow"]) {
//做處理 do something ,message.body 為此 ScriptMessage 傳遞的消息內容
? ? ? ? NSLog(@"JS交互得到的message %@",message.body);
}}
移除對一個名為 @”事件名” 的JS事件的監聽:[conntentController?removeScriptMessageHandlerForName:@"事件名"];
OC調用JS
在-?(void)evaluateJavaScript:(NSString?*)javaScriptString?completionHandler:(void?(^?_Nullable)(_Nullable?id,?NSError?*?_Nullable?error))completionHandler;操作通知知JS端的方法名和對應操作的key值 :[self.webView?evaluateJavaScript:@"JS方法名('action')"?completionHandler:nil];