ZPRouter
接入路由组件ZPRouter只需2个配置,就可以使用路由组件
// 注册scheme协议头
+ (void)registerScheme:(NSString *)scheme;
// 添加路由规则表
+ (void)addRouteWithPlistPath:(NSString *)path;
路由协议
在接入路由之前,需要先了解一下路由的协议规则,ZPRouter与绝大部分路由协议一样,使用:
scheme://host/path?k=v&k2=v2&k3=v3
不同点在于,ZPRouter优化了复杂的query数据情况,增加用于统一处理业务数据的
k=v
scheme://host/path?k=v&k2=v2&data={"k":"v","k2":"v2"}
- k=v、k2=v2为协议本身数据,
- data={"k1":"v1"} 为此url的业务数据,因为url跳转需要的业务数据更加复杂,
常常伴随着内嵌的url等特殊情况,所以有必要对业务数据存放一个独立的k-v。
如下,是一个跳转简历详情的跳转url
bangjob://zcmclient/resumeDetailView?rf=1&data={
"from": 1,
"resumedata": {
"userid": "123",
"isdate": 0,
"phone": "xxx",
"url": "https://www.baidu.com",
"sid": "483209478123",
"resumeid": "4534u253u125retest**",
"phoneProtected": 1
}
}
注意:需要对业务数据进行encode,因为它是一个json串.
页面规则制定
ZPRouter的页面规则制定,不是传统的由代码进行注册,而是交给路由规则表进行配置。
{
"schemename":{
"main":{
"home":{
"_extend":"扩展参数",
"_class":"HomeContoller",
"_description":"首页"
}
},
"module_a":{
"home":{
"_extend":"扩展参数",
"_class":"ModuleHomeContoller",
"_description":"业务线A的home页面"
},
"detail":{
"_extend":"扩展参数",
"_description":"业务线A的详情页页面",
"_hold":{
"_class":"DetailHold"
}
}
}
}
}
路由表遵循 scheme://host/path 的协议规则,此处规则表对于关系scheme协议为:
schemename://main/home 主App的首页,页面=HomeContoller
schemename://module_a/home 业务线A的首页,页面=ModuleHomeContoller
schemename://module_a/detail 业务线A的详情页,拦截处理类=DetailHold
main 和 module_a 代表不同的业务线模块,如果不需要区分业务线,可以统一命名。
接入ZPRouter
了解完上面的路由协议和规则配置,接下来只需要简单的对组件进行基础配置即可。
一、注册协议命名规则
// 注册scheme命名 (必须)
[ZPRouteConfig registerScheme:@"routerdemo"];
// 注册host命名, (非必须,不区分业务线默认叫client)
[ZPRouteConfig setModule:@"main"]
// 注册query中存放业务数据的key命名 (非必须)
[ZPRouteConfig registerModule:@"data"]
// 此处代码URI为: routerdemo://main/xxx?data=xxx
二、添加规则数据
// 添加一个规则配置表
[ZPRouteConfig addRouteWithPlistPath:@"xxx.plist"];
// or 添加多个规则配置表
[ZPRouteConfig addRouteWithPlistPaths:@[
@"xxx.plist",
@"xxx.plist",
@"xxx.plist"
]];
// or 添加服务端下发的规则配置数据
[ZPRouteConfig addRouteDictionary:dict];
三、回调函数
// 未登录下是否允许跳转,默认YES, 设置NO后需要等待登录成功后自动跳转
+ (BOOL)routeAllowJumpNotLogin;
// URL即将跳转
+ (void)routeWillJump:(NSString *)url scheme:(ZPRouteScheme *)scheme customInfo:(NSDictionary *)customInfo;
// URL跳转失败
+ (void)routeFailed:(NSString *)url scheme:(ZPRouteScheme *)scheme fromPage:(UIViewController *)controller;
// URL跳转成功
+ (void)routeSuccess:(NSString *)url scheme:(ZPRouteScheme *)scheme fromPage:(UIViewController *)controller;
// 跳转规则不满足
+ (void)routeError:(NSString *)url scheme:(ZPRouteScheme *)scheme fromPage:(UIViewController *)controller;
// 外部唤起未登录情况下,跳转被拦截
+ (void)routeToNotLogin:(NSString *)url fromPage:(UIViewController *)controller from:(URLRouteFromType)from;
使用方法
普通跳转
[self openRouteURLString:@"demo://module_a/home" parameter:nil options:nil];
url含有参数跳转
// 发起跳转页
NSString *url = @"demo://module_a/home?data={\"name\":\"张三\",\"age\":\"20\"}";
[self openRouteURLString:url parameter:nil options:nil];
// 1、目的页Controller接收数据
- (void)routeWillPushControllerWithResult:(ZPRouteResultModel *)result {
NSDictionary *dataParams = result.data;
NSLog(@"姓名:%@ 年龄:%@",dataParams[@"name"],dataParams[@"age"]);
}
// 2、如果跳转被拦截,则由拦截类接收数据
// return yes-业务能正常跳转, no-业务不能正常跳转。 用于收集跳转失败的数据。
- (BOOL)holdWithParameters:(ZPRouteResultModel *)result
{
NSDictionary *data = result.data;
if ([data[@"age"] intValue] < 18) {
// 18岁以下禁入
// push error page
return NO;
}
// 18岁以上 go
// push right page
return YES;
}
跳转含有自定义参数
[self openRouteURLString:@"demo://module_a/home" parameter:@{@"customInfo":@"自定义数据"} options:nil];
跳转完成回调
[self openRouteURLString:@"demo://module_a/pageTwo" parameter:nil options:nil completion:^{
NSLog(@"跳转完成回调");
} callParams:nil];
跳转回传数据
// 发起跳转页接收回传数据
[self openRouteURLString:@"demo://module_a/pageTwo" parameter:nil options:nil completion:nil callParams:^(NSDictionary * _Nonnull params) {
NSLog(@"------收到回传参数");
if (params[@"vip"] && params[@"age"] > 18) {
// 会员18岁了,可以开放功能
}
}];
// 目的页回传数据
- (void)routeWillPushControllerWithResult:(ZPRouteResultModel *)result {
if (self.callParams) {
self.callParams(@{@"vip":@"yes",@"age":@"20"});
}
}
Present跳转
// kURLRouteOpenAnimatedTransition 跳转类型push还是present
// kURLRouteOpenAnimated 跳转是否需要动画
NSDictionary *options = @{kURLRouteOpenAnimatedTransition:@(URLRouteOpenAnimatedPresent),
kURLRouteOpenAnimated:@(YES)
};
[self openRouteURLString:@"demo://module_a/pageThree" parameter:nil options:options];
跳转普通的H5页面
// 需要对https或者http配置响应的scheme跳转规则,具体参考demo
[self openRouteURLString:@"https://www.baidu.com" parameter:nil options:nil];
复杂情况跳转到H5页面
// 跳转到H5页面,也可以配置统一的规则进行跳转,这种方式可以添加更多的数据进行页面配置。
[self openRouteURLString:@"demo://mainClient/web?data={\"url\":\"https://www.baidu.com\",\"title\":\"web标题\"}" parameter:nil options:nil];
未登录拦截,登录后继续跳转
// app在登录成功时调用此函数,
+ (void)sendLoginStatus:(BOOL)isLogin;
安全性和动态更新规则
路由配置表推荐使用本地plist文件进行存储配置,如果考虑到安全性或需要动态更新跳转规则,可以由接口下发数据。
接口获取的配置数据需要在app启动时去获取,避免外部唤起时配置数据未更新完成无法跳转,具体需要接入方去实现请求和跳转的时机。
github: https://github.com/LYKit/LYURLRoute.git