澳门威利斯人_威利斯人娱乐「手机版」

来自 威利斯人娱乐 2020-05-08 17:15 的文章
当前位置: 澳门威利斯人 > 威利斯人娱乐 > 正文

JLRoutes路由跳转,基于自定义url实现万能导航的探

NSULX570L是一个相比较常用的类,平日用二个已知的字符串来初阶化,举例用@"" 来起始化:

介绍 :

NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];

JLRoutes是贰个调用极少代码 , 能够很方便的管理不相同UKoleosL schemes以至深入分析它们的参数,并经过回调block来管理ULANDL对应的操作 , 能够用于拍卖复杂跳转逻辑的三方库.

日常这几个字符串对象会蕴藏url访谈的财富路线以致相关参数。那么自定义url也会服从相应的平整,举个例子自定义url,字符串为

1.在平日支付中 , push , present 出今后全方位程序的次第地点 , 假若你想急速理清多少个品类的欧洲经济共同体逻辑 , 特别劳碌 . 大好些个景观 , 你得找到代码目录 ,依照层级构造分出关系 , 然后找到相应的push地方 , 搜索下顶尖页面 , 若是自己项指标目录就非常乱 , 那么一旦要询问叁个连串的总体跳转逻辑 , 特别的难.

@"navigateApp://action?navigationKey=personalcenter"。

即使能够将 UIViewController-Swizzled 库集成到花色中 ,然后一页一页点击查询 , 但也是比较伤心的.

前天要讲的明明不是怎么着初始化NSUSportageL对象和自定义NSUSportageL,不过明日要讲的的确基于NSUGL450L的多个属性值的,贰个是NSUHavalL.scheme,另八个是NSUPRADOL.query。如上字符串的scheme=@"navigateApp",query=@"navigationKey=personalcenter"。那样大家就很驾驭的看来了,scheme定义了大家要拍卖的url的档期的顺序,query满含了参数配置,我们得以因此一定的法子把query拆解分析成NSDictionary对象,更方便人民群众大家的应用。我们讲NSUEvoqueL.query作为参数字传送入如下方法,就可以得到最后的NSDictionary *param = @{@"navigationKey":@"perosnalcenter"};

设若 , 是把一切项目标跳转逻辑都给收取出来 , 单独放在贰个类 , 模块化管理, 那么思路就能够清楚超多 , 以致足以用XMind依照代码画出总体项指标树状图

  (NSMutableDictionary *)dictionaryWithQuery:(NSString *)query{ if(query.length == 0){ return nil; } NSArray *arrKeyValue = [query componentsSeparatedByString:@"&"]; if(!arrKeyValue ||!arrKeyValue.count){ return nil; } NSMutableDictionary *dicKeyValue = [[NSMutableDictionary alloc] initWithCapacity:5]; for(NSInteger loop = 0; loop < arrKeyValue.count; loop  ){ NSString *keyValue = [arrKeyValue objectAtIndex:loop]; if(keyValue.length == 0){ continue; } NSArray *arr_KeyValue = [keyValue componentsSeparatedByString:@"="]; if(!arr_KeyValue || arr_KeyValue.count != 2){ continue; } NSString *key = [arr_KeyValue objectAtIndex:0]; NSString *value = [arr_KeyValue objectAtIndex:1]; if(key.length > 0 && value.length > 0){ [dicKeyValue setObject:[value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] forKey:key]; } } return dicKeyValue;}

2.举个例子所处集团存在四个app , app之间相互推荐 , 相互跳转是再不奇怪可是的要求,就像于QQ , Wechat三方分享跳转等 .假诺用Appdelegate原生方法举办拦截 , 所做的事起码得是决断Scheme是还是不是匹配, 想方法步入需求跳到的分界面 , 假使要提到传参 , 就特别麻烦.

澳门威斯尼人6613·com,大家曾经获得url的参数,那样是或不是很巧妙啊?No,No,No。仅仅知道了那么些,并不可能揭橥url的效果与利益。要想发挥自定义url的意义大家必要使用的情况并且定义url的平整。

  1. 要是顾客是从PC端识别二维码,大概经过链接想要步入app钦命页面

正如大家定义一种url的利用情状及url的概念法规:大家因而url来做应用内导航调控器的领航:通过url的navigationKey的value明显导航到对应的UIView Controller,通过别的的参数来向该调节器的实例传值。假设大家处理的url是以@"navigateApp://action?“初阶的,那么在query部分navigationKey将改成必需节点,别的传值的节点依据调控器的外部公开的品质来定义。

JLRoutes原理:

倘若大家要促成如下url的跳转.提议写在工具类的.h中

JLRoutes本质得以知晓为:保存一个大局的Map,key是url,value是对应寄放block的数组,url和block都会常驻在内部存储器中,当张开三个UWranglerL时,JLRoutes就足以遍历 , 这一个大局的map,通过url来进行相应的block。

澳门威斯尼人6613·com 1图片发自简书App

村办通晓原理 :

先是个,通过该url导航到村办宗旨.第4个,通过该url导航到id= _ordereid的订单详细的情况页面,原则上跳转到的调整器要领悟定义orderid属性,以便外界赋值。

  1. routeControllersMap 是全局的单例词典 , 你能够伪变成二个大的盒子 .

率先大家来看HKWHNavigator.h文件的连锁方法注解。他的接纳单例方式,外界久公开了八个办法,很简短。

2 . 这么些盒子里装了不菲的字典 , 而字典的key值对应 二个标志 , 源码中称之为 scheme ,为了不混淆 , 大家就叫其为JLRoutes对象标志 . 那么些标记对应的value值 为JLRoutes类的指标 .

#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>@interface HKWHNavigator : NSObject  (HKWHNavigator *)center;- canNavigateInApp:url;//能不能跳转- nivigateInApp:url;//跳转,并返回能不能跳转。@end
  1. JLRoutes对象有数不清属性 , 常用的有四个 , 四个是 scheme 也便是是上述所说的JLRoutes对象标志 , 也正是说 , 此value值记录了协和的key值 . 别的四个性子为 routes数组 , 此数组中存放了 JLRAV4RouteDefinition 对象 .

  2. JLPRADORouteDefinition对象为尾声的切切实实模型 , 也正是说 你注册的跳转逻辑的有所信息 , 都存在于这几个模型中 ,包罗要实施操作的block代码块 , JLRoutes对象标记 , 取url内容值的标志

对应HKWHNavigator.m文件的相干措施达成如下

预热

#import "HKWHNavigator.h"//引入了要跳转到的控制器的头文件。#import "HKPersonalCenterViewController.h"#import "HKOrderDetailViewController.h"//要定义外部赋值的属性或变量@interface HKWHNavigator()@property (nonatomic, retain) NSArray *arrNavigator;- (UINavigationController *)naviController;@end@implementation HKWHNavigator  (HKWHNavigator *)center{ static dispatch_once_t predicate; static HKWHNavigator *sharedInstance = nil; dispatch_once(&predicate, ^{ sharedInstance = [[HKWHNavigator alloc] init]; }); return sharedInstance;}- (instancetype)init{ if(self = [super init]){ //表明我们只处理@“navigateApp://"开头的自定义url. self.arrNavigator = @[@"navigateApp"]; } return self;}- canNavigateInApp:url{ if([_arrNavigator containsObject:url.scheme]){ return YES; } return NO;}- nivigateInApp:url{ if([[HKWHNavigator center] canNavigateInApp:url]){ NSDictionary *dicAttach = [HKWHNavigator dictionaryWithQuery:url.query]; NSString * navigationKey = [dicAttach objectForKey:@"navigationKey"]; if([navigationKey isEqualToString:@"personal"]){ //导航到个人中心页面(ps:无需外部传参) HKPersonalCenterViewController *nextViewController = [[HKPersonalCenterViewController alloc] init]; [self.naviController pushViewController:nextViewController animated:YES]; } else if([navigationKey isEqualToString:@"orderdetail"]){ //导航到订单详情页面(ps:需要外部传参) //通过引入的控制器头文件来实例化,并导航。 HKOrderDetailViewController *nextViewController = [[HKOrderDetailViewController alloc] init]; nextViewController. orderid = [dicAttach objectForKey:@"orderid"]; [self.naviController pushViewController:nextViewController animated:YES]; //也可以通过NSClassFromString方法和KVC做到传参,并导航。 //这种方式不需要在该类中引入目标类的头文件。 Class uiviewcontroller_class = NSClassFromString(@"HKOrderDetailViewController"); id nextViewController = [[uiviewcontroller_class alloc] init]; [nextViewController setValue:[dicAttach objectForKey:@"orderid"] forKey:@"orderid"]; [self.naviController pushViewController:nextViewController animated:YES]; } return YES; } return NO;}//获取当前导航控制器。- (UINavigationController *)naviController{ UINavigationController *sharedController = nil; UIWindow *window = [UIApplication sharedApplication].keyWindow; UIViewController *rootViewController = window.rootViewController; //找到当前的UINavigationController。 //这会根据你App的结构不同而有所差异,这需要你分析自己应用的结构找到当前控制器。 if([rootViewController isKindOfClass:[UITabBarController class]]){ sharedController = (UINavigationController *)[(UITabBarController *)rootViewController selectedViewController]; } else if([rootViewController isKindOfClass:[UINavigationController class]]){ sharedController = (UINavigationController *)rootViewController; } return sharedController;}//解析url.query部分,返回NSDictionary格式。(按照如上的场景和规则,该返回值必然含有navigationKey节点)  (NSMutableDictionary *)dictionaryWithQuery:(NSString *)query{ if(query.length == 0){ return nil; } NSArray *arrKeyValue = [query componentsSeparatedByString:@"&"]; if(!arrKeyValue ||!arrKeyValue.count){ return nil; } NSMutableDictionary *dicKeyValue = [[NSMutableDictionary alloc] initWithCapacity:5]; for(NSInteger loop = 0; loop < arrKeyValue.count; loop  ){ NSString *keyValue = [arrKeyValue objectAtIndex:loop]; if(keyValue.length == 0){ continue; } NSArray *arr_KeyValue = [keyValue componentsSeparatedByString:@"="]; if(!arr_KeyValue || arr_KeyValue.count != 2){ continue; } NSString *key = [arr_KeyValue objectAtIndex:0]; NSString *value = [arr_KeyValue objectAtIndex:1]; if(key.length > 0 && value.length > 0){ [dicKeyValue setObject:[value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] forKey:key]; } } return dicKeyValue;}@end

率先领悟 , 怎么样通过设置app UEnclaveL Scheme由外界跳转到app ?

如此那般内部导航的建制基本贯彻了,那么外界又该怎么调用呢?上边请看

先是 , 配置info.plist —>增添UPRADOL types字段 , 你会意识其为三个数组 –>然后我们在item 0 处在加三个ULANDL Schemes , 又是叁个数组 .这里表达了二个标题 , 四个app能够对应多少个scheme —>配置scheme , URAV4L identifier 最棒设置复杂些 , 保险其独一性

//导航到个人中心//这种有可变参数的考验是用宏来定义,更方便。[[HKWHNavigator center] nivigateInApp: KNavigate_PersonalCenter];//导航到订单号为2015032688的订单性情页面[[HKWHNavigator center] nivigateInApp: KNavigate_OrderDetail(@"2015032688")];

澳门威斯尼人6613·com 2

大概有人要问了,你那样做有何收益吗?笔者导航到对应的调控器,小编得以在急需导航的地点直接实例化且跳转过去就好了哟,干嘛要这么麻烦?

现在 , 咱们在safari中输入scheme JLRoutesOne://

当一些成效页面有数不胜数进口都得以进来的时候,大家能够动用那样的点子实行导航,幸免了多个类的头文件被援引到多少个类中,产生烂援用。从另八个角度来讲也确定保障了代码的整洁性。

澳门威斯尼人6613·com 3

当二个分界面包车型大巴的大队人马输入都以服务器动态调节的场所下,顾客端能够节约依照对应的入口标志决断跳转到的页面包车型大巴劳动,也可防止去传参数的麻烦。只要服务端和客商端协定好自定义url的气象和法规,提前写好相应的落到实处,仅需一行代码,就可以轻便解决。从另二个角度来讲正是为ViewController消脂。

同个手提式有线电话机app应用之间的跳转也是如此 , 只必要调用openUrl方法 , 在别的个使用设置scheme . 比方 , A应用跳转到B应用, 那么设置B应用的scheme 为 com.mengyao_block@outlook.com:// , 在A应用中调用[[UIApplication

sharedApplication]openURL:[NSURL URLWithString:@"com.mengyao_block@outlook.com://"]]方法 , 就能够跳转到B应用 . 那么 , 借使有广大的应用都在跳转B应用 , 那么哪些区分是由哪些app跳转过来 , 跳转过来又要求推行什么样操作呢 ? 可以设置多少个scheme , 拦截openUrl方法 , 抽取url 进行拆解剖判 , 推断 . 举个例子com.mengyao_block@outlook.com:// scheme代表了实施登陆 , com.baidu.www:// scheme代表了推行授权 等等 . 那又将何以判别是由哪个应用跳转过来呢 ? 只必要附带上参数就能够 , 举例com.mengyao_block@outlook.com://JinSeJiaYuan 这就象征了是从卡其灰家园app跳转过来 , 须要实施登陆操作 …

那么 , 倘若是跳到钦点的页面呢 ? 首先一种方法是能够阻挡openUrl方法 , 然后兑现跳转 , 可是此办法跳转假使涉嫌传参 , 可能越了数不完跳转 , 会特其余紧Baba . 还会有一种方法, 正是利用JLRoutes

开班步骤 :

一 : 为程序配置U帕JeroL Schemes

平日大家所用到的第三方分享跳转 , 也是用到了那一个规律 , 通过剖判参数 , 跳转到钦定页面

八个app能够对应多少个ULX570L Scheme , 如下图 info.plist配置 , 在safari中 , 只要输入 JLRoutesOne:// 或JLRoutesTwo:// 或JLRoutesThree:// 都能够张开该app , 而U汉兰达L identifier 最佳是确定保证其独一性 , 这里大家为app设置了3个UWranglerL Schemes ,是为着后边手动深入分析URubiconL而做的预备 .

澳门威斯尼人6613·com 4

二 : 注册

率先 , 思考的难题有七个 , 一是何等时候注册跳转逻辑 , 二是 在什么地区注册

例如说多少个类型的tabbarItem有3个 , 那么那3个模块的跳转 , 并非由 三个navigationController来产生 , 所以思忖到那点 , 大家得以创立贰个分类 , 将跳转逻辑放在中间 , 在起头化tabbarController时 举行注册跳转逻辑

注册的章程有那贰个种 :

  1. 注册全局JLRoutes

[[JLRoutes globalRoutes]addRoute:@"取url内容值的标志"handler:^BOOL(NSDictionary * _Nonnull parameters卡塔尔(قطر‎ {returnYES;//一旦相配 , 马上重返YES}];

//此格局对应的JLRoutes对象标志为 @”JLRoutesGlobalRoutesScheme” , 由下述源码可以预知 , 用globalRoutes方式制造的JLRoutes对象 , 无论创造多少次 , 始终对应着同叁个实例 . 也等于说 , 无论你调用上述情势某个次 , 纵然@”取url内容值的标志” 和block块内容不相近 , 最终都会实行第三回注册的内容 . 此情势和大家要得以实现的3个tabbarItem对应 3种跳转必要不合 , 因为 大家必要的是 block块中的navigationController为 3个分化的实例对象.

  1. 自定义命名空间注册

[[JLRoutes routesForScheme:@“第一模块的标志”]addRoute:@"取url内容值的标记"handler:^BOOL(NSDictionary * _Nonnull parameters){returnYES;    }];

//此注册方法 , 所得的JLRoutes对象都以独一的 ,而那才是我们确实须求的 , 如下述源码

//源码如下 , 注释不用看 , 为和谐深入分析源码的笔记——————————————————————————————————————————————————————— (instancetype卡塔尔globalRoutes{return[selfroutesForScheme:JLRoutesGlobalRoutesScheme];} (instancetype)routesForScheme:(NSString*State of Qatarscheme{//路由对象JLRoutes *routesController =nil;staticdispatch_once_tonceToken;dispatch_once(&onceToken, ^{//全局单例字典routeControllersMap = [[NSMutableDictionaryalloc] init];    }卡塔尔(قطر‎;//假若是不设有以scheme为key的辞典 , 就创办三个 , 幸免重复创制if(!routeControllersMap[scheme]) {        routesController = [[selfalloc] init];NSLog(@"---------------------%@",routesControllerState of Qatar;//路由存款和储蓄scheme (globel或自定义卡塔尔国routesController.scheme= scheme;//以scheme作为key值 --对应路由对象为value#warning  - 只要本身经过global命名空间创造了JLRoutes对象 , routeControllersMap[scheme]不畏有值的,一旦有值 , 我第一遍创制时 , 无论以如何命名空间创立 , 都会被赋上事情发生前率先个的值 . 从而,固然小编频频调用global方法创制对象 ,JLRoutes对象始终维持为率先个.那相当于解说了干吗再三注册 , 始终独有首先个登记里的block被调用的原因 . 当设置了优先级 , 插入排序使得高优先级坐落于队列前方 , 优先被寻觅出来,return掉 . 然则也只有叁个挂号能够贯彻 . 原本要达成的是 , 在开创3个navigationController时 , 分别注册六次 , 运用3个不一致的navigationController举行3个模块内跳转 , 然后始终独有首先个转移的navigationController生效 , 因为背后创制的三回都被中间给覆盖掉.//新扩张以scheme为key 对应 JLRoutes对象为键值的字典routeControllersMap[scheme] = routesController;    }//将value值赋值给当下路由对象  (注意:  这里的routeControllersMap 是全局单例 , 当自个儿用global创制的对象往往addRoutes时,所开创的Routes对象都会被赋值最伊始特别指标的值 , 如下State of QatarroutesController = routeControllersMap[scheme];#warning  --- 在大局词典中存款和储蓄一份路由的词典 , 由安装的global或然自定义scheme 为key取JLRoutes对象returnroutesController;}

3.定义优先级

//说来讲去 , 若是不设置优先级 , 全部的登记优先级都为 0 . 当标记了事情未发生前级实行挂号后 , JL纳瓦拉RouteDefinition 对象(末了模型卡塔尔(قطر‎在 JLRoutes对象的routes数组中 , 将进行排序 , 相仿于选取排序 , 当通过route对象 找出到其 routes数组后 , 将会遍历整个routes数组 , 优先级高的JL路虎极光RouteDefinition对象将会被最初匹配 , 然后return YES , 截止遍历 . 我们临时用不上这么些优先级 , 就不实行过多汇报 . 因为我们注册的3个跳转 , 每一种对应的routes数组申月素仅为1个

[[JLRoutes globalRoutes]addRoute:@"取url内容值的标志"priority:1handler:^BOOL(NSDictionary * _Nonnull parameters卡塔尔国 {//要完毕的操作returnYES;    }];

4 . 定义八个 @”取url内容值的标记” , 那么些暂且还不清楚怎么用 , 暂不解释.

[[JLRoutes globalRoutes]addRoutes:@"数组"handler:^BOOL(NSDictionary * _Nonnull parameters) {returnYES;    }];

三 : 跳转点击

// 此处 , 八个Scheme头都区别 , 不过正如 一种所讲 , 那多少个指令本人都增加进了info.plist , 所以那三种写法都可以跳转

1.率先个模块 - (void卡塔尔(قطر‎touch{NSString*url = @"JLRoutesOne://OneNextViewController";    [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:url] options:nilcompletionHandler:nil];}2.次之个模块 - (void卡塔尔国touch{NSString*url = @"JLRoutesTwo://TwoNextViewController";    [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:url] options:@{@"name":@"JLRoutesTwo"} completionHandler:nil];}3.第4个模块

本文由澳门威利斯人发布于威利斯人娱乐,转载请注明出处:JLRoutes路由跳转,基于自定义url实现万能导航的探

关键词: 澳门威利斯人 日记本 自定义 Url