iOS中UIWebView的Javascript与Objective-C通信

在iOS开发中经常要用到UIWebView,想让Html页面和native本身结合的更好,难免需要让Objective-C和Javascript通信。

那么如何让他们直接能通信呢?大部分用过UIWebView的朋友都知道stringByEvaluatingJavaScriptFromString:,使用这个消息,可以让UIWebView执行Objective-C发来的JS语句。这样Obj-C --> JS的问题解决了。

接下来,如何实现JS --> Obj-C呢?UIWebViewDelegate中有个webView:shouldStartLoadWithRequest:navigationType:。当UIWebView请求某个url之前都会调用这个消息,这个消息的返回值决定着UIWebView是否要加载这个url。我测试了一下改变JS中的location.href也可以触发这个消息。有了这条路子我们就有办法实现JS --> Obj-C

经过几番折腾就有了我的开源项目TGJSBridge,这个项目主要实现了JS与Obj-C之间的项目通信。JS可以向Obj-C发送JSON对象,Obj-C将收到相应的NSDictionary。反过来也一样,TGJSBridge会自动转换数据结构。JS通过bind订阅消息,Obj-C通过委托接收消息。

特点

  • 在页面DOM未加载好之前,TGJSBridge会缓存所有消息,待DOM加载好之后TGJSBridge会向JS依次发出消息。
  • JS向Obj-C发消息时,消息数据不通过url传递。url只传递消息id,消息数据通过stringByEvaluatingJavaScriptFromString:提取。
  • JS部分的TGJSBridge经过封装,不会污染全局命名空间。

最后附上项目地址:
https://github.com/ohsc/TGJSBridge