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

Xcode8發(fā)布之后Apple推出了新控件 WKWebView,WKWebView 存在很多優(yōu)勢(shì)支持更多的HTML5的特性、高達(dá)60fps滾動(dòng)刷新頻率與內(nèi)置手勢(shì)、與Safari相容的JavaScript引擎、在性能、穩(wěn)定性方面有很大提升占用內(nèi)存更少 協(xié)議方法及功能都更細(xì)致、可獲取加載進(jìn)度等。最主要的是大大降低了內(nèi)存消耗。首先需要導(dǎo)入#import<WebKit/WebKit.h>

實(shí)現(xiàn)代理:WKNavigationDelegate,WKScriptMessageHandler,WKUIDelegate。

主要代碼:

WKWebViewConfiguration?*config?=?[[WKWebViewConfiguration?alloc]init];//交互用到的類(lèi)庫(kù)

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

實(shí)現(xiàn)的主要協(xié)議:

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;

// WKNavigationDelegate 頁(yè)面開(kāi)始加載時(shí)調(diào)用

- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;

// WKNavigationDelegate 當(dāng)內(nèi)容開(kāi)始返回時(shí)調(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可以直接添加對(duì)約定的ScriptMessage(直譯為 腳本信息,本文暫定為JS事件)的監(jiān)聽(tīng),即可實(shí)現(xiàn)JS調(diào)用OC。所有的操作都是通過(guò)WKUserContentController來(lái)處理的

JS調(diào)用OC

首先在JS代碼中加入對(duì)事先約定好的 ScriptMessage(JS事件)的調(diào)用:window.webkit.messageHandlers.<事件名>.postMessage(需要傳遞的數(shù)據(jù))

同時(shí)OC端則需要加入對(duì)此JS事件的監(jiān)聽(tīng):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);

}}

移除對(duì)一個(gè)名為 @”事件名” 的JS事件的監(jiān)聽(tīng):[conntentController?removeScriptMessageHandlerForName:@"事件名"];

OC調(diào)用JS

在-?(void)evaluateJavaScript:(NSString?*)javaScriptString?completionHandler:(void?(^?_Nullable)(_Nullable?id,?NSError?*?_Nullable?error))completionHandler;操作通知知JS端的方法名和對(duì)應(yīng)操作的key值 :[self.webView?evaluateJavaScript:@"JS方法名('action')"?completionHandler:nil];

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

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

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