从启动过程讲述普元Mobile 8.0基座( 二 )


同时start方法里开辟了一个基于JSThread线程并且开启了线程的runloop(一直存在 , 不被内存回收) , 这个线程就是提供给JS调用OC用的 。
接着initModulesWithDispatchGroup遍历module除了内部module , 另外一部分普元Mobile8.0自己创建的很多接口类以及类中提供的非常丰富的API可供调用 。
从启动过程讲述普元Mobile 8.0基座
本文插图
利用react提供的宏定义RCT_EXPORT_MODULE注册:
RCT_EXPORT_MODULE(SecurityBridgeModule) 。
宏定义中重写了当前class的+load方法 , 所以module类被加载的时候RCTRegisterModule就调用被注册到配置表 。
从启动过程讲述普元Mobile 8.0基座
本文插图
从启动过程讲述普元Mobile 8.0基座
本文插图
这也是如果前端使用没有被注册的module类名会爆、报红的原因即配置表里找不到这个类 。 JS也有自己的bridge , 两个bridge用的配置表是一样的 。 无论是哪一方调用另一方的方法 , 实际上传递的数据只有 ModuleId、MethodId 和 Arguments, 分别对应的是类名、方法名、参数 。
利用runtime就可以使用传递的三个参数完成接口的调用过程;OC调JS某些模块的方法时 , 也是通过传递ModuleID和MethodID去调用的 , 都会走到-enqueueJSCall:args:方法把两个ID和参数传给JS的BatchedBridge.callFunctionReturnFlushedQueue , 跟JS调OC原理差不多 。
感兴趣的话可以研究下面的流程:
从启动过程讲述普元Mobile 8.0基座
本文插图
3.组件的集成
普元Mobile8.0 提供了一个组件集成的助手类PluginHelper , 利用pod 'PluginHelper',:podspec =>”仓库最新地址”即可集成 。 此类主要作用是在应用启动时调用([PluginHelper didFinishLaunchingWithOptions:launchOptions];) , 会遍历components.json中需要集成的组件类 , 并向这些组件类发消息完成初始化 。 目前提供的协议接口除了初始化组件的方法还有推送和支付相关方法 。
从启动过程讲述普元Mobile 8.0基座
本文插图
【从启动过程讲述普元Mobile 8.0基座】
组件类需要遵守协议实现协议方法 , 遍历拿到类名后利用runtime向此类发消息和对应的协议function名 。
从启动过程讲述普元Mobile 8.0基座
本文插图
利用PluginHelper可以解除每引用一个新组件时要import对应类的头文件步骤 。 只需要在应用启动方法didFinishLaunchingWithOptions手动调用初始化方法 。 降低了主结构代码冗余度避免了代码耦合 , 使组件代码更独立有利于整个项目的组件模块化进程 。
以普元Mobile8.0平台推送组件举例 , 集成组件后 , 只需在以下几个方法调用PluginHelper即可 。 所有的消息处理代码都在推送组件里 , 增强了主项目代码的可读性 。 不用考虑复杂的iOS推送接收获取过程 。 不仅如此 , 推送组件还提供了获取推送消息 , 获取设备Token注册Token , 设备绑定等等相关的RN接口非常方便调用 。
从启动过程讲述普元Mobile 8.0基座
本文插图
普通处理方法要考虑冗余的推送逻辑和接口:
从启动过程讲述普元Mobile 8.0基座
本文插图
4.模块化
程序员都知道的最基本的代码设计原则:“Don’t repeat yourself!” 。 架构的重要体现就是能够更好的共享资源同时避免代码和功能的复用 , 而架构恰恰就是围绕模块化做的 。


推荐阅读