在iOS中,TGJSBridge框架提供了一种obj-c与js通信的方案。使用TGJSBridge之后,js可以方便的调用native提供的原生方法来实现相应的逻辑。
TGJSBridge的使用
js端
obj-c端
所以,obj-c端会先获取到TGJSBridge.js文件并执行,然后当js端发送“setTitle”通知之后,obj-c端会有相对应的方法来处理这个通知。但是,查看TGJSBridge的源码,并没有发现有定义包含“setTitleWithUserInfo”标记名的消息定义。所以为了了解通知具体是如何通过TGJSBridge从js端传递到obj-c端的,就需要看看TGJSBridge的实现原理。
TGJSBridge的原理
TGJSBridge框架包括两部分
- TGJSBridge.js——定义JSBridge类,实现js与obj-c间互相发送通知、js绑定通知与解除绑定,以及js发送通知的具体方式
- TGJSBridge.h/TGJSBridge.m——接收来自js端的通知,解析通知参数,调用绑定这个通知的处理函数
js发送通知
通知传递是通过伪协议的方式,html与native约定一个协议,当html以这个协议发送请求时,会被native拦截。
obj-c接收通知并处理
在以上过程中,调用了一个“didReceivedNotificationName”方法。TGJSBridge中定义了一个protocol叫TGJSBridgeDelegate,didReceivedNotificationName是这个protocol的成员方法,需要具体的业务Controller来实现这个接口。
方案一这种消息实现方式,是直接获取通知名,然后做对应的处理。缺点是,必须在这个controller中来做派发,耦合比较深。
方案二利用obj-c动态绑定的特性,以函数指针的方式,获取”{通知名}WithUserInfo”格式的方法并执行。NSSelectorFromString可以在当前类包括子类查找指定的方法。这个方案可以将具体的逻辑放在子类中处理,在子类中定义”{通知名}WithUserInfo”格式的方法即可。