接上篇《iOS路由跳转(二)之需求分析》 这一篇文章主要对JKRouter的实现一 一说明。

JKRouter的结构如下:

ios 路由意图控制 ios 路由跳转_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单例初始化时,执行全局配置的操作.

  1. 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开发的过程中虽然不多,但也有的。