接上篇《iOS路由跳转(二)之需求分析》 这一篇文章主要对JKRouter的实现一 一说明。
JKRouter的结构如下:
JKRouter里面都有啥
兵马未动,粮草先行。先给大家简单介绍下各个类的作用。JKRouter
这个类主要是定义实现了各种跳转的方法,以及一些相关配件类的声明。
- RouterOptions
@interface RouterOptions : NSObject
//普通的present,push 跳转方式
@property (nonatomic, readwrite) BOOL isModal;
//跳转时是否有动画
@property (nonatomic, readwrite) BOOL animated;
//每个页面所对应的moduleID
@property (nonatomic, copy, readonly) NSString *moduleID;
//当前状态下用户所具有的 access 权限
@property (nonatomic) JKAccessRight theAccessRight;
//跳转时传入的参数,默认为nil
@property (nonatomic,copy,readwrite) NSDictionary *defaultParams;
/**
创建默认配置的options对象
@return RouterOptions 实例对象
*/
+ (instancetype)options;
/**
创建options对象,并配置moduleID
@param moduleID 模块的ID
@return RouterOptions 实例对象
*/
+ (instancetype)optionsWithModuleID:(NSString *)moduleID;
/**
创建单独配置的options对象,其余的是默认配置
@param params 跳转时传入的参数
@return RouterOptions 实例对象
*/
+ (instancetype)optionsWithDefaultParams:(NSDictionary *)params;
/**
已经创建的option对象传入参数
@param params 跳转时传入的参数
@return RouterOptions 实例对象
*/
- (instancetype)optionsWithDefaultParams:(NSDictionary *)params;
@end
RouterOptions 这个类定义在了JKRouter.h
中方便大家看到,这个类的使用频率是非常的高的,主要用push/pop时携带各种配置信息,进行准确的跳转。
- JKouterConfig
@interface JKouterConfig : NSObject
@property (nonatomic,strong) NSString *modulesInfoFileName; // 路由配置信息的json文件名
@property (nonatomic,strong) NSString *sepcialJumpListFileName; //跳转时有特殊动画的plist文件名
@property (nonatomic,strong) NSString *webContainerName;// app中web容器的className
@property (nonatomic,strong) NSString *URLScheme;//自定义的URL协议名字
@property (nonatomic,weak) UINavigationController * navigationController; //app的导航控制器
@end
JKouterConfig
主要是用在JKRouter单例初始化时,执行全局配置的操作.
- URLScheme
在这里对整个app的协议定义一下,我这边的demo协议定义如下jkpp
,感兴趣的小伙伴也可以自己定义一个哦。
2)modulesInfoFileName
路由配置表的json文件名字,我这边的demo里就json文件的格式如下,大家可以根据需要自己调整哦:
[
{"moduleID":10001,
"targetVC":"JKAViewController"
},
{"moduleID":10002,
"targetVC":"JKBViewController"
},
{"moduleID":10003,
"targetVC":"JKDViewController",
"accessRight":1
}
]
3)sepcialJumpListFileName
这个是保存特殊跳转操作的plist文件名,特殊跳转例如:present,带有动画效果的翻转,缩小等。里面可以约定其动画样式。我这边由于没有这样的需求,目前只提供了满足present的支持。
4)webContainerName
这个是混合开发时,提供web展示交互的容器类名,大家有的话可以配置上,我这边后续会推出一个相关的容器,感兴趣的小伙伴可以持续跟进我的博客。
5)navigationController
这个是根视图导航器哦,这个一定要设置,如果不设置的话,你会发现所有的页面根本不会跳转的哦。
JKRouter如何实现跳转
前面把相关的基础给大家做了简单的介绍,下面给大家说说最重要的,如何实现跳转。
@interface JKRouter : NSObject
@property (nonatomic, copy, readonly) NSSet <NSDictionary *>* modules; ///< 存储路由,moduleID信息,权限配置信息
@property (nonatomic, copy, readonly) NSSet <NSDictionary *>* specialOptionsSet; ///< 特殊跳转的页面信息的集合
/**
初始化单例
@return JKRouter 的单例对象
*/
+ (instancetype)router;
/**
配置router信息
@param config router的配置信息
*/
+ (void)routerWithConfig:(JKouterConfig *)config;
/**
默认打开方式
一般由native调用
@param vcClassName 跳转的控制器类名
*/
+ (void)open:(NSString *)vcClassName;
/**
根据options的设置进行跳转
@param vcClassName 跳转的控制器类名
@param options 跳转的各种设置
*/
+ (void)open:(NSString *)vcClassName options:(RouterOptions *)options;
/**
根据options的设置进行跳转,并执行相关的回调操作
@param vcClassName 跳转的控制器类名
@param options 跳转的各种设置
@param callback 回调
*/
+ (void)open:(NSString *)vcClassName options:(RouterOptions *)options CallBack:(void(^)())callback;
/**
遵守用户指定协议的跳转
在外部浏览器唤醒app,H5调用相关模块时使用
适用于携带少量参数,不带参数的跳转
@param url 跳转的路由 携带参数
*/
+ (void)URLOpen:(NSString *)url;
/**
遵守用户指定协议的跳转
适用于携带大量参数的跳转,多用于H5页面跳转到native页面
@param url 跳转的路由,不携带参数
@param params 传入的参数
*/
+ (void)URLOpen:(NSString *)url params:(NSDictionary *)params;
/**
适用于访问基于http协议/https协议的路由跳转
@param url 跳转的路由,可以携带少量参数
*/
+ (void)httpOpen:(NSString *)url;
/**
默认情况下的pop,或者dismiss ,animated:YES
*/
+ (void)pop;
/**
默认情况下的pop,或者dismiss,animated:YES
@param animated 是否有动画
*/
+ (void)pop:(BOOL)animated;
/**
默认情况下的pop,或者dismiss animated
@param params 返回时携带的参数
@param animated 是否有动画
*/
+ (void)pop:(NSDictionary *)params :(BOOL)animated;
/**
pop到指定的页面
默认animated为YES,如果需要 dismiss,也会执行
@param vc 指定的vc对象
*/
+ (void)popToSpecifiedVC:(UIViewController *)vc;
/**
pop到指定的页面
如果需要 dismiss,也会执行
@param vc 指定的vc对象
@param animated 是否有动画
*/
+ (void)popToSpecifiedVC:(UIViewController *)vc animated:(BOOL)animated;
/**
根据moduleID pop回指定的模块
@param moduleID 指定要返回的moduleID
*/
+ (void)popWithSpecifiedModuleID:(NSString *)moduleID;
/**
根据moduleID pop回指定的模块
并指定动画模式
@param moduleID 指定要返回的moduleID
@param params 返回时携带的参数
@param animated 是否有动画
*/
+ (void)popWithSpecifiedModuleID:(NSString *)moduleID :(NSDictionary *)params :(BOOL)animated;
/**
通过浏览器跳转到相关的url或者唤醒相关的app
@param url 路由信息
*/
- (void)openExternal:(NSString *)url;
@end
先给大家简单说一下两个重要的属性:
1)modules 这个主要是讲json文件中的信息读取到内存中,被moudles持有,提高遍历的速度。
2)specialOptionsSet 这个主要是保存的特殊跳转的信息,也是提前读取到内存中,使用的时候可以提高遍历速度。
特别注意:JKRouter 初始化的时候,一定不能用+ (instancetype)router;
这个方法,这个方法是用来持有相关的属性,方便在别的类里面进行操作。要用+ (void)routerWithConfig:(JKouterConfig *)config;
进行初始化,并执行相关的配置操作。
这里面的跳转方法正常跳转,没有权限等级判断的方法如下:
+ (void)open:(NSString *)vcClassName;
+ (void)open:(NSString *)vcClassName options:(RouterOptions *)options;
+ (void)open:(NSString *)vcClassName options:(RouterOptions *)options CallBack:(void(^)())callback;
通过自定义URL协议进行跳转的方法有:
+ (void)URLOpen:(NSString *)url;
+ (void)URLOpen:(NSString *)url params:(NSDictionary *)params;
通过自定义URL协议进行跳转的,都可以通过路由表配置权限,动画,等配置信息,实现权限判定,特殊动画跳转等操作,另外h5交互也可以通过自定义URL跳转到我们的页面。在上面的几个方法中,大家可以看到moduleID这个字段,这里我为UIViewController写了一个category,绑定了一个属性MoudleID,这样如果有需要的话,我们可以为我们的相关页面指定moduleID来标记,方便我们通过moduleID来进行push,pop操作。
细心的朋友,可能会发现还有一个方法没有说,是的,还有一个方法如下:
+ (void)httpOpen:(NSString *)url;
这个方法,上面说的很清楚,主要是为了访问基于http,https协议的路由请求。比如展示线上的活动等等。
大家可以发现,每一个方法的详细用法我都写的很详细了,关于pop操作的,大家看看注释就一目了然了,这一块我就不多说了。
最后还有一个方法,大家要注意哦:
- (void)openExternal:(NSString *)url;
这个方法主要是在app内通过浏览器来打开相关的URL的,这种需求在app开发的过程中虽然不多,但也有的。