iOS 组件化思考

84 阅读2分钟

如何解耦

基于前端和后端的交互模式,去Model使用字符串传参,基于URL实现方法调用。

每个模块作为调用方的时候相当于一个客户端,作为被调用方的时候相当于一个服务端。

路由器

客户端如何通过URL和参数调用服务端的方法?我们可以通过路由器来实现。通过在路由器中注册对应的 path 和 实现类之间的映射关系。比如 fy://native/module/action。虽然不注册也可以调用(通过module名拿到类,通过action拿到方法,调用objc_msgSend)。如何去注册对应关系,可以通过让所有的服务实现类去继承一个类,如 XXXModule 通过运行时去获取XXXModule 的所有子类去注册。方法如何注册?这个可以参考Weex的实现。

服务发现

我想知道当前有哪些服务可以调用,要如何实现呢?去路由器里查看注册了哪些服务。方法注册基于Weex的实现稍微改造一下。我们就能够生成一个类似于Swagger文档一样的文档。当前有哪些服务、哪些方法、传什么参数,都可以找到。

其他App如何调用我们的服务

由于我们是使用路由方式实现的。可以很容易借助 URLSchemeuniversallink 实现通过其他应用调用我们的服务。参数回传 也可以通过 调用对方的 URLSchemeuniversallink 实现。

Flutter如何调用服务

可以写一个插件,在Native侧集成路由器,在Flutter侧把对应的 URL 和参数 封装成方法。在flutter模块引入这个插件,调用方法传参。

H5如何调用服务

写一个JSSDK,把服务对应的URL和参数封装一下,提供接口给业务方调用。在H5容器里,Native获取到JS传过来的参数通过路由器去调用对应的实现。