1.调用方式
本地组件A在某处调用
[[CTMediator sharedInstance] performTarget:targetName action:actionName params:@{...}]
向
CTMediator
发起跨组件调用,
CTMediator
根据获得的target和action信息,通过objective-C的runtime转化生成target实例以及对应的action选择子,然后最终调用到目标业务提供的逻辑,完成需求。
在远程应用调用中,远程应用通过openURL的方式,由iOS系统根据info.plist里的scheme配置找到可以响应URL的应用(在当前我们讨论的上下文中,这就是你自己的应用),应用通过
AppDelegate
接收到URL之后,调用
CTMediator
的
openUrl:
方法将接收到的URL信息传入。当然,
CTMediator
也可以用
openUrl:options:
的方式顺便把随之而来的option也接收,这取决于你本地业务执行逻辑时的充要条件是否包含option数据。传入URL之后,
CTMediator
通过解析URL,将请求路由到对应的target和action,随后的过程就变成了上面说过的本地应用调用的过程了,最终完成响应。
2.组件化方案中的去model设计
(1)
调用方如何知道接收方需要哪些key的参数?
(2)调用方如何知道有哪些target可以被调用?
答:解决方案就是使用category
mediator这个repo维护了若干个针对mediator的category,每一个对应一个target,每个category里的方法对应了这个target下所有可能的调用场景,这样调用者在包含mediator的时候,自动获得了所有可用的target-action,无论是调用还是参数传递,都非常方便。
3.基于安全考虑
1.区分调用是来自于远程App还是本地组件,可以
action添加
native
前缀去做的,凡是带有native前缀的就都只允许本地组件调用。