您的位置:首页 > 移动开发 > IOS开发

iOS路由跳转(三)之JKRouter基础教程1

2017-03-21 08:14 881 查看
  接上篇《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单例初始化时,执行全局配置的操作.

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

好了,今天就写到这里吧,大家想看demo源码的话可以点击JKRouter下载地址

如果想直接集成到项目中的话,可以使用
pod "JKRouter"


下一篇,我将为大家分享如何实现json文件解析,以及权限等级的判断处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息