废话不多说了,直接讲主题...
webView和js交互,iOS调用webView调用非常简单,在这先不说了.
因为UIWebView和WKWebView的不同,WKWebView html渲染和js不在同一个进程,所以WKWebView不能捕获到当前的jsContext,而UIWebView可以,UIWebView与js交互可通过JSBridge来实现,方法还比较简单.
在这里主要讲的是WKWebView加载的webView调用iOS的方法:
config.userContentController = [WKUserContentController new];
[config.userContentController addScriptMessageHandler:self name:@"senderModel"];
众所周知的方式,但是js端调用iOS方法,window.webkit.messageHandlers.senderModel.postMessage({body: 'Alert'});
比较麻烦,同时和安卓端调用方式不统一,js端工作量可能稍微大一些,需要加判断.
在这里我给提出的解决方式是注入js使window.senderModel = window.webkit.messageHandlers.senderModel;
这样js端调用window.senderModel.postMessage(信息); 安卓同样注册一个"senderModel"的对象,写一个方法postMessage
的方法,这样就能完成统一.
代码如下,请参考:
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:@"if (typeof window.webkit != 'undefined' && typeof window.webkit.messageHandlers.senderModel != 'undefined') { window.senderModel = window.webkit.messageHandlers.senderModel;}" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
[_webView.configuration.userContentController addUserScript:userScript];
因为WKWebView的不同,只能调用postMessage,方法,这时候就苦逼了,如果多个方法呢.安卓小朋友可能问你了,毕竟人家是为了你妥协.😝, 同样我们也是有方法的,😝
window.senderModel.postMessage({method:'method1',parameter:['','']});
让js端传这样的形式. method传要执行的方法,,parameter这个里面放参数列表tuple.
这时候安卓又可能又问题,这种形式可能他们没法解析,这时候了解到他们只能解析json串和字符串,OMG,好吧,改之.
window.senderModel.postMessage({"method":"method1","parameter":["",""]});
这样对于iOS是没有任何影响的.
写完了,大体写了写,喜欢的,或者用的到的可以点个小心心哦💗💕
😝