项目中在集成推送的时候,总会希望我们在点击后台发来的推送内容的时候,跳入指定的界面。按照以前的开发习惯,总是每来一个需求,app里便接入一个对应的代码块,用来跳入对应的不同界面。那么能不能通过路由跳转的方式,app里代码不用更改,根据后台指定不同界面跳不同界面,甚至给对应界面传递需要的参数呢?
在研究了网上的很多方案后,最终决定使用组件化的模块来完成这块内容的开发。组件化的好处在于将与业务耦合性的内容抽了出来,以后对于不同项目或者不同业务场景可以在组件里进行完善和维护。
1.创建私有库
创建私有库的过程不知道请看这里通过gitlab私有库的方式进行模块化和组件化
创建个名为ZYMediator的组件,资源路径使用默认路径,也就是保留那个Classes文件夹,创建完成后,在podfile文件中,导入pod 'CTMediator'
2.创建执行文件
在自己工程里创建响应组件的类文件,文件名以Target_
开头,在这里我创建的是swift类型的文件,名字为Target_ZYMediatorHandle.swift
,继承NSObject。
在该类下定义响应方法,方法名称以Action_
开头,我这里定义了一个名称为Action_NativeVC
的方法,用来跳转工程里的原生界面,具体代码如下:
1 | import UIKit |
该方法是根据参数中的pushVCIOS
对应的vc名字,返回具体的工程中的vc视图控制器。
3.组件中响应工程中的执行文件
在组件项目中创建CTMediator的分类,如下:
1 | #import "CTMediator+NJSPCompany.h" |
其中,GovGardenApp
代表即将引用该组件调用的vc是哪个工程名下的,比如我自己的工程名是GovGardenApp,在该工程里有个CVC,需要跳转到这个CVC,而且我项目里的执行文件是swift类型,所以这里要存个工程名。
ZYMediatorHandle
的target名对应上面执行文件名称target_后面的名字,而NativeVC
对应的action则是执行文件里方法名Action_后面的名字。
4.调用
1 | UIViewController *vc = [[CTMediator sharedInstance] A_DetailViewControllerWithParams:[userInfo mutableCopy]]; |
在appdelegate中,用UIViewController对应的vc接收返回的控制器视图,然后push还是pop看你自己了。
5.属性赋值
如果要跳转的vc需要传对应的属性呢?在这里我们用runtime的方式进行属性赋值,需要注意的是传过来的参数名要和控制器里定义的属性名称一致。
定义工具类如下
1 | + (void)paramToVc:(UIViewController *) v param:(NSDictionary<NSString *,NSString *> *)parameters{ |
appdelegate中调用代码如下
1 | UIViewController *vc = [[CTMediator sharedInstance] A_DetailViewControllerWithParams:[userInfo mutableCopy]]; |
6.Test
后台这时候返回参数中pushVCIOS对应的vc名为CVC,通过CTMediator
单例调用A_DetailViewControllerWithParams方法,会最终返回CVC对应的实例。
7.拓展
业务需求可以在私有库中添加CTMediator
的分类,或者在当前分类中添加新的方法。如果是不同项目建议创建新的分类。
如上,一套代码基本上可以囊括了大部分的业务跳转了,当然了,需求是千万的,以后碰到不适用的,可以具体在完善。