移动开发 \ iOS \ JKRouter路由跳转中文使用手册

JKRouter路由跳转中文使用手册

总点击37
简介:  JKRouter经历多次迭代版本终于稳定了,为了方便大家接入使用,我特意写了这篇文章。之前没有了解过JKRouter的小伙伴可以先看看这连篇博客《iOS路由跳转(二)之需求分析》《JKRouter路由跳转解决了哪些问题》。

  JKRouter经历多次迭代版本终于稳定了,为了方便大家接入使用,我特意写了这篇文章。之前没有了解过JKRouter的小伙伴可以先看看这连篇博客《iOS路由跳转(二)之需求分析》《JKRouter路由跳转解决了哪些问题》。

1,JKRouter接入

在项目中创建podfile文件,将pod "JKRouter"复制到podfile中,然后执行pod install就可以了。注:(建议从ios8之后的小伙伴使用哦,iOS 7有些功能可能会不支持)。

2,JKRouter支持的rootViewController配置

在如下方法内配置JKRouter

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

这里有两种配置方案,具体如下。

1)方案一

self.rootTabBarController = [[RootTabbarViewController alloc] init];

UINavigationController *naVC = [[UINavigationController alloc] initWithRootViewController: self.rootTabBarController];

self.window.rootViewController = naVC;

[JKRouter router].windowRootVCStyle = RouterWindowRootVCStyleDefault;

或者:

UIViewController *vc = [UIViewController new];

UINavigationController *naVC = [[UINavigationController alloc] initWithRootViewController:vc];

self.window.rootViewController = naVC;

[JKRouter router].windowRootVCStyle = RouterWindowRootVCStyleDefault;

2)方案二

UIViewController *vc1 = [UIViewController new];

UINavigationController *naVC = [[UINavigationController alloc] initWithRootViewController:vc1];

UIViewController *vc2 = [UIViewController new];

UINavigationController *naVC1 = [[UINavigationController alloc] initWithRootViewController:vc2];

UIViewController *vc3 = [UIViewController new];

UINavigationController *naVC2 = [[UINavigationController alloc] initWithRootViewController:vc3];

UITabBarController *tabBarVC3 = [UITabBarController new];

tabBarVC.viewControllers = @[naVC1,naVC2,naVC3];

self.window.rootViewController = tabBarVC.viewControllers;

[JKRouter router].windowRootVCStyle = RouterWindowRootVCStyleCustom;

3,JKRouter配置路由信息文件。

[JKRouter configWithRouterFiles:@[@"modules.json",@"modules123.json"]];

//这里之所以支持以数组的形式配置json文件,主要是在实际的开发过程中,可能存在native小伙伴的路由配置,和h5小伙伴的路由配置文件。为了便于维护,双方给自维护自己的路由表文件

如果写的有路由文件下发接口的,可以使用下面这个方法,进行配置。

/**

更新路由信息

@param filePath 路由配置信息的文件在沙盒中的路径

*/

+ (void)updateRouterInfoWithFilePath:(NSString*)filePath;

注:更新后,router的路由配置信息以网络下载的json文件信息为准,app目录下的json文件失效。具体的逻辑开发的小伙伴可以做一下相关的逻辑处理,什么时候使用app目录下的json文件,什么时候使用网络下载的json文件。

4,配置JKJSONHandler

通过创建JKJSONHandler的category文件对路由文件进行自定义解析,代码如下:

+ (NSString *)getHomePathWithModuleID:(NSString *)moduleID{

NSString *vcClassName = nil;

for (NSDictionary *module in [JKRouter router].modules) {

NSString *tempModuleID =[NSString stringWithFormat:@"%@",module[@"moduleID"]];

if ([tempModuleID isEqualToString:moduleID]) {

vcClassName = module[@"targetVC"];

break;

}

}

return vcClassName;

}

+ (NSString *)getTypeWithModuleID:(NSString *)moduleID{

NSString *type = nil;

for (NSDictionary *module in [JKRouter router].modules) {

NSString *tempModuleID =[NSString stringWithFormat:@"%@",module[@"moduleID"]];

if ([tempModuleID isEqualToString:moduleID]) {

type = module[@"type"];

break;

}

}

return type;

}

示例json文件配置如下:

[

{

"moduleID":"user_profile",

"type":"ViewController",

"targetVC":"JKBViewController",

"desc":"用户主页"

},

{

"moduleID":"apply_invite_code",

"targetVC":"JKDViewController",

"desc":"邀请码"

},

{

"moduleID":"wallet",

"targetVC":"JKWebViewController",

"desc":"钱包流水 无参数"

}

]

5,url安全校验

  JKRouter路由跳转的url安全校验,主要通过几个方面进行校验。

1)配置url的scheme

通过创建JKRouterExtension的category文件对urlSchemes

+ (NSArray *)urlSchemes{

return @[@"http",

@"https",

@"file",

@"itms-apps"];

}

进行重写添加app支持的协议,其他协议的url就会被禁止跳转。

2)对url内容进行安全性校验

通过对JKRouterExtension中下面这个函数

+ (BOOL)safeValidateURL:(NSString *)url{

//默认都是通过安全性校验的

return YES;

}

的重写,对url的内容进行安全性校验,我们可以限制url的长度,url中是否有特殊字符。验证的规则很多,具体可以根据实际需求。

6,配置web容器

在app的开发过程中,我们经常会用一个公共的webViewController来打开常见的url,在这里JKRouter配置如下:

1)配置web容器的类名

/**

配置web容器从外部获取url的property的字段名

@return property的字段名

*/

+ (NSString *)jkWebURLKey;

/**

配置webVC的className,使用的时候可以通过category重写方法配置

@return webVC的className

*/

+ (NSString *)jkWebVCClassName;

+ (NSString *)jkWebURLKey{

return @"jkurl";

}

+ (NSString *)jkWebVCClassName{

return @"";

}

通过重写这两个方法设置jkWebURLKey和jkWebVCClassName后,就可以使用用户自己自定义歌的webViewController了

2)配置url的打开方式

JKRouter中url打开方式有两种一种是通过JKRouter配置的webViewController打开,另一种是通过safari打开。我们可以通过对JKRouterExtension中如下方法进行重写

/**

在url参数后设置 JKRouterHttpOpenStyleKey=1 时通过appweb容器打开网页,其余情况通过safari打开网页

@return key default is @"jkRouterAppOpen"

*/

+ (NSString *)JKRouterHttpOpenStyleKey;

+ (NSString *)JKRouterHttpOpenStyleKey{

return @"jkRouterAppOpen";

}

7,viewController的初始化以及赋值操作。

/**

初始化viewController对象,可以重写该方法的实现,进行viewController的初始化。默认返回不为空

@return 初始化后的viewController对象

*/

+ (instancetype)jkRouterViewController;

/**

初始化viewController对象,默认返回为空,可以重写该方法实现初始化。赋值操作可以通过YYModel,或者别的工具类在内部实现。该方法主要用于h5和native交互跳转时,需要传输大量参数赋值时调用,或者后台接口返回的数据实现页面跳转时使用。

@param dic json对象。纯数据的,内部不含OC对象

@return 初始化后,赋值完成的viewController对象

*/

+ (instancetype)jkRouterViewControllerWithJSON:(NSDictionary *)dic;

+ (instancetype)jkRouterViewController{

return [[[self class] alloc] init];

}

+ (instancetype)jkRouterViewControllerWithJSON:(NSDictionary *)dic{

return nil;

}

具体在开发的过程中可以对这两个方法进行重写,尤其是第二个方法可以结合YYModel进行赋值操作。示例代码如下:

+ (instancetype)jkRouterViewControllerWithJSON:(NSDictionary *)dic{

WWBaseViewController *vc = [self yy_modelWithJSON:dic];//使用YYModel的代码

if (![self jkIsTabBarItemVC]) {

vc.hidesBottomBarWhenPushed =YES;

}else{

vc.hidesBottomBarWhenPushed =NO;

}

return vc;

}

+ (instancetype)jkRouterViewController{

WWBaseViewController *vc = [[[self class] alloc] init];

if (![self jkIsTabBarItemVC]) {

vc.hidesBottomBarWhenPushed =YES;

}else{

vc.hidesBottomBarWhenPushed =NO;

}

return vc;

}

8,权限等级的判定处理

对于页面打开权限等级的判定处理,这里UIViewController+JKRouter中有两个方法,一个是判定权限的,一个是权限不够时的异常处理。代码如下:

+ (BOOL)validateTheAccessToOpenWithOptions:(RouterOptions *)options{

return YES;

}

+ (void)handleNoAccessToOpenWithOptions:(RouterOptions *)options{

}

具体在开发过程中,可以根据实际情况对上面两个方法进行重写。

9,实现自定义转场动画

- (void)jkRouterSpecialTransformWithNaVC:(UINavigationController *)naVC{

}

- (RouterTransformVCStyle)jkRouterTransformStyle{

return RouterTransformVCStyleOther;

}

要实现自定义的转场动画,我们可以设置jkRouterTransformStyle 为RouterTransformVCStyleOther

10,url打开弹框,actionsheet

使用JKRouter时,url如果要打开弹框,actionSheet时,需要对JKRouterExtension中

/**

除了路由跳转以外的操作

@param actionType 操作的类型

@param url url

@param extra 额外传入的参数

@param completeBlock 操作成功后的回调

*/

+ (void)otherActionsWithActionType:(NSString *)actionType URL:(NSURL *)url extra:(NSDictionary *)extra complete:(void(^)(id result,NSError *error))completeBlock

进行重写。


经过了上面种种的配置,就可以很愉快的使用JKRouter了,当然了由于JKrouter功能的强大,很多小伙伴不一定都要进行配置。有的只需要配置一部分就好了。


后面我们就可以使用下面的方法进行open和pop操作了。

/**

默认打开方式

一般由native调用

@param vcClassName 跳转的控制器类名

*/

+ (void)open:(NSString *)vcClassName;

/**

根据options的设置进行跳转

@param vcClassName 跳转的控制器类名

@param options 跳转的各种设置

*/

+ (void)open:(NSString *)vcClassName options:(RouterOptions *)options;

/**

主要是通过后台,或者H5交互是携带json参数进行跳转,对应的ViewController内部需要实现

+ (instancetype)jkRouterViewControllerWithJSON:(NSDictionary *)dic 这个方法的重写。

@param vcClassName 跳转的控制器类名

@param options 跳转的各种设置 options 的defaultParams 是json对象。内部value不能是OC的对象

*/

+ (void)open:(NSString *)vcClassName optionsWithJSON:(RouterOptions *)options;

/**

根据options和已有的vc进行跳转

@param vc 已经创建的指定的vc

@param options 跳转的各种设置

*/

+ (void)openSpecifiedVC:(UIViewController *)vc options:(RouterOptions *)options;

/**

根据options的设置进行跳转,并执行相关的回调操作

@param vcClassName 跳转的控制器类名

@param options 跳转的各种设置

@param callback 回调

*/

+ (void)open:(NSString *)vcClassName options:(RouterOptions *)options CallBack:(void(^)(void))callback;

/**

遵守用户指定协议的跳转

在外部浏览器唤醒app,H5调用相关模块时使用

适用于携带少量参数,不带参数的跳转

@param url 跳转的路由 携带参数

*/

+ (void)URLOpen:(NSString *)url;

/**

遵守用户指定协议的跳转

适用于携带大量参数的跳转,多用于H5页面跳转到native页面

@param url 跳转的路由,不携带参数

@param extra 额外传入的参数

*/

+ (void)URLOpen:(NSString *)url extra:(NSDictionary *)extra;

/**

遵守用户指定协议的跳转

适用于携带大量参数的跳转,多用于H5页面跳转到native页面

@param url 跳转的路由,不携带参数

@param extra 额外传入的参数

@param completeBlock 跳转成功后的回调

*/

+ (void)URLOpen:(NSString *)url extra:(NSDictionary *)extra complete:(void(^)(id result,NSError *error))completeBlock;

/**

适用于访问基于http协议/https协议的路由跳转

@param url 跳转的路由,可以携带少量参数

*/

+ (void)httpOpen:(NSURL *)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;

/**

根据step的值pop向前回退几个VC

如果step大于当前当前naVC.viewController.count,时返回pop to rootViewController

@param step 回退的vc的数量

*/

+ (void)popWithStep:(NSInteger)step;

/**

根据step的值pop向前回退几个VC

如果step大于当前当前naVC.viewController.count,时返回pop to rootViewController

@param step 回退的vc的数量

@param animated 是否有动画效果

*/

+ (void)popWithStep:(NSInteger)step :(BOOL)animated;

/**

根据step的值pop向前回退几个VC

如果step大于当前当前naVC.viewController.count,时返回pop to rootViewController

@param step 回退的vc的数量

@param params 返回时传递的参数

@param animated 是否有动画效果

*/

+ (void)popWithStep:(NSInteger)step params:(NSDictionary *)params animated:(BOOL)animated;

/**

通过浏览器跳转到相关的url或者唤醒相关的app

@param targetURL 路由信息

*/

+ (void)openExternal:(NSURL *)targetURL;

/**

使用targetVC替换navigattionController当前的viewController

@param targetVC 目标viewController

*/

+ (void)replaceCurrentViewControllerWithTargetVC:(UIViewController *)targetVC;

如果想看更详细的使用的话,可以下载JKRouter主页

QQ交流群:扫码入群


JKRouter路由跳转中文使用手册

更多优质文章,可以微信扫码关注:


意见反馈 常见问题 官方微信 返回顶部