PS 感谢大家的关注,由于我本想开源4个库,除了router, 另外三个分别是native dispatcher, web dispatcher 和 react dispatcher , 所以router 对native dispatcher 有了库依赖,为了共同学习,我把router单独分离成pod,再次感谢大家的关注,欢迎叫router更完善。best regards.

如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter


@author Jou Email Weibo or Github


预热 - 我要解决的问题

首先我还是要推荐Gaosboy的这篇文章解耦神器 —— 统跳协议和Rewrite引擎
文章中,介绍了天猫app,基于文件配置和uri的页面跳转。这大大增加了app端的灵活性, 而这种实现很类似今天的前端或后端开发中的 静态路由 和 动态路由协议。
除了天猫,在很多的客户端架构的文章中,路由解耦的案例并不不少见,如携程移动App架构优化之旅
蘑菇街App的组件化之路
原生路由协议, 其实两年前就有了类似的实现。比如900+Star的HHRouter,而作者是当时还在布丁动画工作的Light。2015年我有幸见到本人,人很nice,并真是全栈。
DarwinNativeRouter 在接口设计上,很大程度上的参考了现有的react路由协议 react router。并且对原生跳转方式保留很大的可扩展性。所以我的初衷 DarwinNativeRouter 是一个足够轻量级的框架。Light & Flexible。

全局路由协议能解决的问题

错中复杂的Controller的跳转依赖

在iOS的世界里,传统的Controller跳转方式, A 跳转 B, 则 A 必须持有 B 的对象。 而在app长大的过程中, 势必会造成 A -> B , B -> C, A -> C D, E, F...
从而产生复杂的依赖链。全局的Router 使 A 不必依赖于 特定的 Controller 便可以实现跳转。

如下面跳转:

We Always Do:

1   UIViewController *personal = [UIViewController new];
2   personal.userId = @"10238372";
3   [self.navigationController pushViewController:personal animated:YES];

Router Code:
 1 [[DNRouter router]open:@"./user/10238372/profile"]; 

又比如我们要在navigationController根路径跳转

We Always Do:

1   [self.navigationController popToRootViewControllerAnimated:NO];
2   UIViewController *personal = [UIViewController new];
3   personal.userId = @"10238372";
4   [self.navigationController pushViewController:personal animated:YES];

Router Code:
      [[DNRouter router]open:@"/user/10238372/profile"];

推送通知,点击打开指定页面

对于这种需求, 相信,目前最多的实现应该是两种, 一种的传参的Url, 而另一种,是传递int类型,并通过类似switch case对参数值的硬编码,实现跳转逻辑。
我是很反感第二种的跳转方式, 1. int毫无疑义, 只能硬解释。 2. 跳转的页面有限。 当然如果url采用硬编码, 也是跳转有限的。
而有了router,一切不一样。

  1. 从didFinishLaunchingWithOptions 和 didReceiveRemoteNotification捕获payload

  2. 跳用Router

Somethings we may do:

 1 switch (type) {
 2   case 1001:
 3     //jumping code
 4     break;
 5
 6   case 1002:
 7     //jumping code
 8     break;
 9   case 1003:
10     //jumping code
11     break;
12   case 1004:
13     //jumping code
14     break;
15
16   default:
17     break;
18   }

Now we need do:

 1 if([[DNRouter router]canOpen:url.absoluteString]) [[DNRouter router]open:url.absoluteString]; app间通讯 及 deeplink

Router 可以轻松handle deeplink。 deeplink 即: 从safari打开app的指定页面。 这方面做得比较好的, 如新浪微博的app, 在点击对应的新浪微博热点 条目时, 就发生了跳转,并跳到了条目详情。
Router, 同样可以被用作 app 间通讯, 和 deeplink 的原理相同。uri的通讯方式,被认为是最简单的app间通讯。 如我们常常使用的微信分享,配置的 scheme 就是用来做跳转和通讯的。

Router Code

1 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
2 {
3   if([[DNRouter router]canOpen:url.absoluteString])
4   {
5     [[DNRouter router]open:url.absoluteString];
6     return YES;
7   }
8   return NO;
9 }

一致的行为处理, Hybrid & React Native

有了Router, 你可以使这些跳转 有一致的行为。

DarwinNativeRouter 特性

静态路由 /user

 1 [DNRouter routerWithName:@"profile" path:@"/user"
 2     navigationController:(UINavigationController *)self.window.rootViewController
 3               controller:^__kindof UIViewController *{
 4
 5   UIViewController *controller = [[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@"kMainBoard"];
 6   return controller;
 7
 8 } action:^(__kindof UIViewController *controller) {
 9
10   [DNDispatcher dispatcher].defaultNavigationController.animation(NO).pushViewController(controller);
11 // 希望大家注意下动画的设置,若animation设为YES, 容易造成animation system的混乱,需要保证最后一个push的前的所有controller的动画为NO.
12
13 }];

动态路由 /user/:id
 1 [DNRouter routerWithName:@"profile" path:@"/user/:id"
 2     navigationController:(UINavigationController *)self.window.rootViewController
 3               controller:^__kindof UIViewController *{
 4
 5   UIViewController *controller = [[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@"kMainBoard"];
 6   return controller;
 7
 8 } action:^(__kindof UIViewController *controller) {
 9
10   [DNDispatcher dispatcher].defaultNavigationController.animation(NO).pushViewController(controller);
11 // 希望大家注意下动画的设置,若animation设为YES, 容易造成animation system的混乱,需要保证最后一个push的前的所有controller的动画为NO.
12 }];

更方便的跳转,名称跳转 name jumping
 1 [[DNRouter router]redirect:@"profile"]; 相对路径跳转
//跟路径
[[DNRouter router]open:@"/user"];//当前路径
[[DNRouter router]open:@"./user"];//上一级
[[DNRouter router]open:@"../user"];

易扩展, 自定义跳转 action

[DNRouter routerWithName:@"profile" path:@"/user/:id"navigationController:(UINavigationController *)self.window.rootViewControllercontroller:^__kindof UIViewController *{UIViewController *controller = [[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@"kMainBoard"];return controller;} action:^(__kindof UIViewController *controller) {[DNDispatcher dispatcher].defaultNavigationController.animation(YES).pushViewController(controller);}];

默认行为,及 异常处理,index & 404

// index page
[DNRouter defaultRouterWithController:^__kindof UIViewController *{} action:^(__kindof UIViewController *controller) {}];// 404 page
[DNRouter notFoundRouterWithController:^__kindof UIViewController *{} action:^(__kindof UIViewController *controller) {}];

后言

DarwinNativeRouter 现在还没有到1.0版本,还有很多可以想象的东西,欢迎让他更加完善,和提pr。
DarwinNativeRouter's Github

@author Jou Email Weibo or Github

转载于:https://www.cnblogs.com/fengmin/p/5377286.html

如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter相关推荐

  1. 如何优雅的实现界面跳转 之 统跳协议

    如何优雅的实现界面跳转 之 统跳协议 预热 – 我要解决的问题 首先我还是要推荐Gaosboy的这篇文章解耦神器 -- 统跳协议和Rewrite引擎 文章中,介绍了天猫app,基于文件配置和uri的页 ...

  2. java等待欢迎界面_android welcome欢迎界面3秒后自动跳转

    android welcome欢迎界面3秒钟之后自动跳转其实就是将APP的启动页面设置成我们自定义的Activity,而不是原来的MainActivity,方法很简单,如下是详细步骤. 第一步:自定义 ...

  3. 【Android】用户登录界面功能实现:登陆跳转、退出

    文章目录 用户登录界面功能实现:登陆跳转.退出 ♦ 回顾 ♦ 编写 MainActivity 实现功能 登录功能效果 退出弹框.连续点击返回退出 ♦ 设计 activity_my_tool.xml 展 ...

  4. 两种控制器的跳转与回跳

    第一种:用于任何控制器的跳转, - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: ...

  5. 快手跳转微信,快手跳转微信怎么做

    快手跳转微信,快手跳转微信怎么做?抖音/快手私信跳转微信名片使用效果#抖音卡片#抖音名片#引流方法 快手怎么绑定微信演示机型,荣耀 30S 试用系统,麦杰克 UI 三点一点一软件版本,快手 8 点一零 ...

  6. java 跳表_数据结构跳表学习并用Java实现

    前面学习很多类的源码过程中,底层基本都是数组和链表,今天学习第三种结构跳表(SkipList). 跳表解决的问题 一个有序的数组如果我们要判断一个数据是否存在可以通过二分查找法非常快速的判断出来,但是 ...

  7. 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------剑指offer系列

    题目:斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). f(n) = f(n-1) + f(n-2) 基本思路 这道题在剑指offe ...

  8. jsp超链接中怎么跳转页面跳转_JSP页面跳转方法小结

    实现JSP页面跳转,有如下几种方式: n        使用href超链接标记              (客户端跳转) n        使用JavaScript                   ...

  9. 【Android 逆向】IDA 工具使用 ( 重命名函数 | 添加注释 | 添加标签 / 跳转标签 | 代码跳转前进 / 后退 )

    文章目录 一.重命名函数 二.添加注释 三.添加标签 / 跳转标签 四.代码跳转前进 / 后退 一.重命名函数 针对一个 匿名函数 , 在分析函数时 , 可以为匿名函数进行命名 ; 右键点击 函数名 ...

最新文章

  1. 将SmartForms转换为PDF保存到本地
  2. 数字图像处理---有关特征提取的相关概念
  3. python中threading产生死锁_什么是死锁,如何避免死锁(4种方法)
  4. 【常用技巧】标准模板库(STL)
  5. 谷歌发布最新版安卓Android,谷歌正式除名华为,安卓12华为首发无望,但鸿蒙将迎难顶上!...
  6. SpringBoot2 整合Kafka组件,应用案例和流程详解
  7. 人工智能AI-模型训练思路
  8. java 判断客户端是手机端还是PC端(SSH框架)
  9. 【OpenGL学习笔记③】——着色器【GLSL Uniform 彩色三角形 变色正方形】
  10. Educational Codeforces Round 61 (Rated for Div. 2) D. Stressful Training 详解
  11. 磊科路由器信号按键_超简单的磊科路由器重置方法
  12. 多功能Python键盘记录工具Radium
  13. Oracle的表空间和sqlplus
  14. Zotero文献同步
  15. 想要的资源百度搜不到?6个只有老师傅才知道的网站,悄悄领走
  16. #10049. 「一本通 2.3 例 1」Phone List
  17. 润和软件全面参与OLA联盟智能家居专委会举办第三次联调测试活动
  18. Windchill介绍
  19. 【PySCF学习1】-分子结构之定义分子
  20. 【论文解读】Attention is All you need

热门文章

  1. Linux的vx开头的文件,linux文件系统简述
  2. mysql myisam存储引擎不能添加外键,添加后显示成功,实则失败
  3. 详解linux的initrd
  4. 手写体识别(数据挖掘入门与实践-实验11)
  5. 华为笔记本matebook13_华为MateBook 13_HUAWEI MateBook 13(i5 8265U/8GB/256GB/独显)_笔记本导购-中关村在线...
  6. 面向对象程序设计(OOP)的六大原则
  7. 深度学习:卷积神经网络(convolution neural network)
  8. SpringCloud学习(八)消息总线(Spring Cloud Bus)(Finchley版本)
  9. js 从一个函数中传递值到另一个函数
  10. UWP使用AppService向另一个UWP客户端应用程序提供服务