美文网首页
ZPRouter 路由组件

ZPRouter 路由组件

作者: 大良造L | 来源:发表于2020-12-05 10:58 被阅读0次

    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

    相关文章

      网友评论

          本文标题:ZPRouter 路由组件

          本文链接:https://www.haomeiwen.com/subject/vhciwktx.html