在iOS开发中,H5的嵌入可以通过UIWebView或者WKWebView。这两个都是继承UIView,来加载web数据的类。WKWebView是在iOS8苹果新推出的,加载速度快,占用内存较少,优点明显。但考虑到需要兼容iOS7以上版本,所以本篇主要说UIWebView的交互开发,后续会研究WKWebView和JavaScriptCore 的使用。
iOS平台JS与Native的交互需要遵循一定的协议,JS可以调用Native方法,其中方法可以是有参数的。Native也可以调用JS的方法,也是可以带参数的。
本文主要讲利用 WebViewJavascriptBridge 实现交互操作的解决方案,从易用性,社区热度,可维护性方面考虑,都是非常具有优势,它能帮助我们优雅的实现OC与JS的交互, 非常方便简洁。
WebViewJavascriptBridge顾名思义,就相当于一座桥梁,两端连接了Obj-C和JavaScript。它提供了OC和JS互调的方法接口,方法在互调之前,我们需要向对方注册我们的方法列表。下面就开始实际操作
JS调用Native:
什么是js调用native?
简单来说就是通过js调用本地代码,举个例子来说就是在网页中有一个登录按钮,点击登录按钮,,具体的登录功能是由OC端实现的,即登录功能实现需要我们在工程里有一个类似loginMethod的函数去具体操作。
原理是在UIWebView的代理方法中截取网页重定向字符串,字符串如果符合特定的格式(可以利用正则表达式去检查),就解析字符串,获取方法以及参数,然后再调用Native的方法。
下面是 WebViewJavascriptBridge 的使用 :
|
添加JS 要调用的 Native 功能,注册的 handler 是供 JS调用 Native 使用的,在JS中调用了 bridge.callHandler('scanClick')
方法将数据传给OC端,它将触发OC端 bridge registerHandler:@"scanClick"
方法中的回调,如下:
|
|
Native调用JS:
和JS调用OC的流程大致一样,还是需要与网页编写人员约定出一个事件名,然后在网页里面先注册这样一个事件并把实现体写好,等到我们OC去触发这个事件(比如点击按钮)就会去网页里面找到这个事件的实现体并执行。
iOS可以通过stringByEvaluatingJavaScriptFromString:方法直接调用html的JS方法。
下面是 WebViewJavascriptBridge 的使用 ,在OC端调用callHandler:@"testJSFunction"
将数据传给JS,它将触发JS端注册的bridge.registerHandler('testJSFunction')
方法中的回调
|
OC端调用
|
注:对于以上使用的监听方法名要和JS开发的人员约定好,必须保持一致。
模板替换
在加载html时替换模版中的特殊字符串,截取一部分模板文件代码如下:
|
替换模板文件中的 然后插入 body 位置
|
以上就是使用 WebViewJavascriptBridge
进行UIWebView与JS的交互的实际例子。