很多人的项目都会用到UIWebView或WKWebView,时常要让H5页面和原生页面交互。
常见的方法有url拦截(UIWebView,WKWebView都支持),最典型的应该是WebViewJavascriptBridge利用看不见的iframe来实现的方法。
还有就是通过JavascriptCore (UIWebView支持,WKWebView不支持)来实现。
我介绍的是一种很另类的方法,也没见过别人用过,但我试着用于生产中了,对线程和内存管理理解的好的话,这种方法会很灵活好用。
将WKWebView和JSPatch结合起来使用,从而向APP里注入代码。
这样做能让H5页面和原生页面的交互大大加强。
若要通过H5页面导入脚本,就得让WKWebView和原生层面能够交互。
关键的两句话是:
self必须得遵循【WKscriptMessageHandler】协议。
Loadscript和DoFunction就相当于消息处理者。然后会在JS脚本中被用到。
在H5中需要执行的JS代码是:
postMessage()里面的参数可以是:Number, String, Date, Array,
Dictionary, and null.和OC对应关系为:
下面是官方注释:
【WKscriptMessageHandler】协议的回调写法:
H5执行loadscript()后会执行
[JPEngine evaluatescript:script]会将脚本转换为原生代码,即把script中的方法在APP运行时注册。
H5执行doFunction后会执行:
很简单的实现了H5向原生注入代码。
1.注入的代码会曝光在浏览器中,最好使用aes加密,
可以使用我写的一个加密工具CryptoBuff.
2.是在子线程中执行的。
所以"- (void)userContentController:(WKUserContentController *)userContentController
didReceivescriptMessage:(WKscriptMessage *)message"是异步回调的。