Xcode8發(fā)布之后Apple推出了新控件 WKWebView,WKWebView 存在很多優(yōu)勢支持更多的HTML5的特性、高達(dá)60fps滾動刷新頻率與內(nèi)置手勢、與Safari相容的JavaScript引擎、在性能、穩(wěn)定性方面有很大提升占用內(nèi)存更少 協(xié)議方法及功能都更細(xì)致、可獲取加載進(jìn)度等。最主要的是大大降低了內(nèi)存消耗。首先需要導(dǎo)入#import<WebKit/WebKit.h>
實現(xiàn)代理: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];
實現(xiàn)的主要協(xié)議:
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// WKNavigationDelegate 頁面開始加載時調(diào)用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// WKNavigationDelegate 當(dāng)內(nèi)容開始返回時調(diào)用
- (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事件)的監(jiān)聽,即可實現(xiàn)JS調(diào)用OC。所有的操作都是通過WKUserContentController來處理的
JS調(diào)用OC
首先在JS代碼中加入對事先約定好的 ScriptMessage(JS事件)的調(diào)用:window.webkit.messageHandlers.<事件名>.postMessage(需要傳遞的數(shù)據(jù))
同時OC端則需要加入對此JS事件的監(jiān)聽:window.webkit.messageHandlers.事件名.postMessage()
//主要方法,在這里處理交互信息
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
if ([message.name isEqualToString:@"closeWindow"]) {
//做處理 do something ,message.body 為此 ScriptMessage 傳遞的消息內(nèi)容
? ? ? ? NSLog(@"JS交互得到的message %@",message.body);
}}
移除對一個名為 @”事件名” 的JS事件的監(jiān)聽:[conntentController?removeScriptMessageHandlerForName:@"事件名"];
OC調(diào)用JS
在-?(void)evaluateJavaScript:(NSString?*)javaScriptString?completionHandler:(void?(^?_Nullable)(_Nullable?id,?NSError?*?_Nullable?error))completionHandler;操作通知知JS端的方法名和對應(yīng)操作的key值 :[self.webView?evaluateJavaScript:@"JS方法名('action')"?completionHandler:nil];