WKWebView 與 JS 交互實戰(zhàn)技巧

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];

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容