目前iOS常用路由框架是JLRouter、HHRouter、MGJRouter。

但是这些路由库都各有不足,首先是JLRouter,用不到的功能繁多,而且基于遍历查找URL,效率低下。HHRouter耦合程度太高,过度依赖ViewController。MGJRouter功能太过简单。

今天介绍一个新发现的iOS路由框架,FFRouter:

FFRouter 是 iOS 中一个强大且易用的 URL 路由框架,支持 URL Rewrite,使 APP 在发布之后也可以动态修改相关路由逻辑。基于匹配查找 URL,效率高。集成和使用都非常简单!

Github链接:FFRouter

功能

  • 具备基本的 URL 注册、Route、取消注册、打印 Log 等
  • 支持使用通配符(*)注册 URL
  • 支持 URL Rewrite
  • 支持 Rewrite 时获取原 URL 参数或 URLComponents,并可对其进行URL Encode或 Decode
  • 支持通过 URL 获取 Object
  • 支持 Route URL 时传递非常规对象
  • 支持 Route 一个未注册的 URL 时统一回调

安装

CocoaPods

target 'MyApp' do
pod 'FFRouter'
end

运行 pod install

手动安装

添加其中的 FFRouter 文件夹到自己项目

使用方法

首先

#import "FFRouter.h"
1、基本使用
/**
注册 url @param routeURL 要注册的 URL
@param handlerBlock URL 被 Route 后的回调
*/
+ (void)registerRouteURL:(NSString *)routeURL handler:(FFRouterHandler)handlerBlock; /**
注册 URL,通过该方式注册的 URL 被 Route 后可返回一个 Object @param routeURL 要注册的 URL
@param handlerBlock URL 被 Route 后的回调,可在回调中返回一个 Object
*/
+ (void)registerObjectRouteURL:(NSString *)routeURL handler:(FFObjectRouterHandler)handlerBlock; /**
判断 URL 是否可被 Route(是否已经注册) @param URL 要判断的 URL
@return 是否可被 Route
*/
+ (BOOL)canRouteURL:(NSString *)URL; /**
Route 一个 URL @param URL 要 Router 的 URL
*/
+ (void)routeURL:(NSString *)URL; /**
Route 一个 URL,并带上额外参数 @param URL 要 Router 的 URL
@param parameters 额外参数
*/
+ (void)routeURL:(NSString *)URL withParameters:(NSDictionary<NSString *, id> *)parameters; /**
Route 一个 URL,可获得返回的 Object @param URL 要 Router 的 URL
@return 返回的 Object
*/
+ (id)routeObjectURL:(NSString *)URL; /**
Route 一个 URL,并带上额外参数,可获得返回的 Object @param URL 要 Router 的 URL
@param parameters 额外参数
@return 返回的 Object
*/
+ (id)routeObjectURL:(NSString *)URL withParameters:(NSDictionary<NSString *, id> *)parameters; /**
Route 一个未注册 URL 时回调 @param handler 回调
*/
+ (void)routeUnregisterURLHandler:(FFRouterUnregisterURLHandler)handler; /**
取消注册某个 URL @param URL 要被取消注册的 URL
*/
+ (void)unregisterRouteURL:(NSString *)URL; /**
取消注册所有 URL
*/
+ (void)unregisterAllRoutes; /**
是否显示 Log,用于调试 @param enable YES or NO,默认为 NO
*/
+ (void)setLogEnabled:(BOOL)enable;
【备注】

(1)注册 URL:

[FFRouter registerRouteURL:@"protocol://page/routerDetails/:id" handler:^(NSDictionary *routerParameters) {
//Route的URL与本次注册URL匹配时的回调
}]; [FFRouter registerRouteURL:@"wildcard://*" handler:^(NSDictionary *routerParameters) {
//Route的URL与本次注册URL匹配时的回调
}]; [FFRouter registerRouteURL:@"protocol://page/routerObjectDetails" handler:^(NSDictionary *routerParameters) {
//Route的URL与本次注册URL匹配时的回调
}];

可通过routerParameters获取 URL 中的参数,routerParameters[FFRouterParameterURLKey]为完整的URL.



(2)当需要通过以下方法:

+ (id)routeObjectURL:(NSString *)URL;

Route 一个 URL 并获取返回值时,需要使用如下方法注册 URL:

+ (void)registerObjectRouteURL:(NSString *)routeURL handler:(FFObjectRouterHandler)handlerBlock;

并在 handlerBlock 中返回需要返回的 Object,例如:

//注册并返回必要的值
[FFRouter registerObjectRouteURL:@"protocol://page/routerObjectDetails" handler:^id(NSDictionary *routerParameters) {
NSString *str = @“根据需要返回必要的Object”;
return str;
}]; //获取返回的值
NSString *ret = [FFRouter routeObjectURL:@"protocol://page/routerObjectDetails"];

(3)如果需要传递非常规对象作为参数,如UIImage等,可使用如下方式:

[FFRouter routeURL:@"protocol://page/routerDetails?nickname=imlifengfeng" withParameters:@{@"img":[UIImage imageNamed:@"router_test_img"]}];
2、URL Rewrite
/**
根据设置的 Rules 去 rewrite 一个 URL @param url 将被 rewrite 的 URL
@return rewrite 后的 URL
*/
+ (NSString *)rewriteURL:(NSString *)url; /**
添加一个 RewriteRule @param matchRule 正则匹配规则
@param targetRule 转换规则
*/
+ (void)addRewriteMatchRule:(NSString *)matchRule targetRule:(NSString *)targetRule; /**
同时添加多个 RewriteRule,格式必须为:@[@{@"matchRule":@"YourMatchRule",@"targetRule":@"YourTargetRule"},...] @param rules RewriteRules
*/
+ (void)addRewriteRules:(NSArray<NSDictionary *> *)rules; /**
移除一个 RewriteRule @param matchRule 将被移除的 matchRule
*/
+ (void)removeRewriteMatchRule:(NSString *)matchRule; /**
移除所有 RewriteRule
*/
+ (void)removeAllRewriteRules;
【备注】

(1)可以使用正则添加一条 Rewrite 规则,例如:

要实现打开 URL:https://www.taobao.com/search/原子弹时,将其拦截,改用本地已注册的 URL:protocol://page/routerDetails?product=原子弹打开。

首先添加一条 Rewrite 规则:

[FFRouterRewrite addRewriteMatchRule:@"(?:https://)?www.taobao.com/search/(.*)" targetRule:@"protocol://page/routerDetails?product=$1"];

之后在打开URL:https://www.taobao.com/search/原子弹时,将会 Rewrite 到URL:protocol://page/routerDetails?product=原子弹

[FFRouter routeURL:@"https://www.taobao.com/search/原子弹"];

(2)可以通过以下方法同时增加多个规则:

+ (void)addRewriteRules:(NSArray<NSDictionary *> *)rules;

其中 rules 格式必须为以下格式:

@[@{@"matchRule":@"YourMatchRule1",@"targetRule":@"YourTargetRule1"},
@{@"matchRule":@"YourMatchRule2",@"targetRule":@"YourTargetRule2"},
@{@"matchRule":@"YourMatchRule3",@"targetRule":@"YourTargetRule3"},]

(3)Rewrite 规则中的保留字:

  • 通过 $scheme$host$port$path$query$fragment 获取标准 URL 中的相应部分。通过$url获取完整 URL
  • 通过 $1$2$3...获取matchRule的正则中使用圆括号取出的参数
  • $:原变量的值、$$:原变量URL Encode后的值、$#:原变量URL Decode后的值

例如:

https://www.taobao.com/search/原子弹对于Rewrite 规则(?:https://)?www.taobao.com/search/(.*)

$1=原子弹
$$1=%e5%8e%9f%e5%ad%90%e5%bc%b9

同样,https://www.taobao.com/search/%e5%8e%9f%e5%ad%90%e5%bc%b9对于Rewrite 规则(?:https://)?www.taobao.com/search/(.*)

$1=%e5%8e%9f%e5%ad%90%e5%bc%b9
$#1=原子弹
2、FFRouterNavigation

考虑到经常用路由配置UIViewController之间的跳转,所以增加了额外的工具FFRouterNavigation来更方便地控制UIViewController之间的跳转。具体使用方法如下:

/**
push 时是否自动隐藏底部TabBar @param hide 是否自动隐藏,默认为 NO
*/
+ (void)autoHidesBottomBarWhenPushed:(BOOL)hide; /**
获取当前 ViewController @return 当前 ViewController
*/
+ (UIViewController *)currentViewController; /**
获取当前 NavigationViewController @return return 当前 NavigationViewController
*/
+ (nullable UINavigationController *)currentNavigationViewController; /**
Push ViewController @param viewController 被 Push 的 ViewController
@param animated 是否使用动画
*/
+ (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; /**
Push ViewController,可设置当前 ViewController 是否还保留 @param viewController 被 Push 的 ViewController
@param replace 当前 ViewController 是否还保留
@param animated 是否使用动画
*/
+ (void)pushViewController:(UIViewController *)viewController replace:(BOOL)replace animated:(BOOL)animated; /**
Push 多个 ViewController @param viewControllers ViewController Array
@param animated 是否使用动画
*/
+ (void)pushViewControllerArray:(NSArray *)viewControllers animated:(BOOL)animated; /**
present ViewController @param viewController 被 present 的 ViewController
@param animated 是否使用动画
@param completion 回调
*/
+ (void)presentViewController:(UIViewController *)viewController animated:(BOOL)animated completion:(void (^ __nullable)(void))completion; /**
关闭当前 ViewController,push、present 方式通用 @param animated 是否使用动画
*/
+ (void)closeViewControllerAnimated:(BOOL)animated;

比JLRoutes更强大更好用的iOS开源路由框架—FFRouter的更多相关文章

  1. 安装更强大更美观的zsh,配置oh my zsh及插件

    安装更强大更美观的zsh,配置oh my zsh及插件 #0x0 安装zsh #0x1 安装oh my zsh #0x2 配置zshrc #0x3 配置主题 #0x4 安装插件 #0x5 小结 #0x ...

  2. Python的regex模块——更强大的正则表达式引擎

    Python自带了正则表达式引擎(内置的re模块),但是不支持一些高级特性,比如下面这几个: 固化分组    Atomic grouping 占有优先量词    Possessive quantifi ...

  3. 思维导图软件TheBrain 8全新发布 提供更强大的信息管理

    TheBrain思维导图软件是全球唯一一款动态的网状结构的思维导图软件,广泛用于学习.演讲.项目管理.会议.需求调研与分析等.其独特的信息组织方式使得用户可以创建并连接到数以万计的数字想法,为此在全球 ...

  4. cVim—Chrome上更强大的vim插件

    cVim——Chrome上更强大的vim插件 介绍 也许很多人在chrome上都用过类似Vimium, ViChrome的插件,这些插件的目的都差不多,就是在浏览器中提供一些类似vim的操作来提高效率 ...

  5. 功能更强大的格式化工具类 FormatUtils.java

    package com.util; import java.text.DecimalFormat; import java.text.ParseException; import java.text. ...

  6. 10个工具让你的 shell 脚本更强大

    10个工具让你的 shell 脚本更强大 很多人误以为shell脚本只能在命令行下使用.其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等.你可以控制最终的输出,光标位 置还有各种输 ...

  7. powerMock比easyMock和Mockito更强大(转)

    powerMock是基于easyMock或Mockito扩展出来的增强版本,所以powerMock分两种类型,如果你习惯于使用easyMock的,那你就下载基于easyMock的powerMock,反 ...

  8. 让Docker功能更强大的10个开源工具

    让Docker功能更强大的10个开源工具 更好的管理.Web前端程序.更深入地了解容器应用程序,Docker生态系统正在迅速发展,这还得归功于其充满活力的开源社区. 软件项目的成功常常根据其催生的生态 ...

  9. summerDao-比mybatis更强大无需映射配置的dao工具

    summerDao是summer框架中的一个数据库操作工具,项目地址:http://git.oschina.net/xiwa/summer. 怎么比mybatis更强大,怎么比beetlsql更简单, ...

随机推荐

  1. uva 10474 Where is the Marble?(简单题)

    我非常奇怪为什么要把它归类到回溯上,明明就是简单排序,查找就OK了.wa了两次,我还非常不解的怀疑了为什么会 wa,原来是我居然把要找的数字也排序了,当时仅仅是想着能快一点查找.所以就给他排序了,没考 ...

  2. POJ 2442 Sequence(堆的使用练习)

    题目地址:id=2442">POJ 2442 真心没想到这题的思路. .原来是从第一行逐步向下加,每次都仅仅保存前n小的数.顺便练习了下堆.. 只是感觉堆的这样的使用方法用的不太多啊. ...

  3. Java类和对象6

    按要求编写Java应用程序. (1)建立一个名叫Cat的类: 属性:姓名.毛色.年龄 行为:显示姓名.喊叫 (2)编写主类: 创建一个对象猫,姓名为“妮妮”,毛色为“灰色”,年龄为2岁,在屏幕上输出该 ...

  4. Java hashCode(), equals()

    转自:http://blog.csdn.net/fenglibing/article/details/8905007冯立彬的博客 以下是关于HashCode的官方文档定义: hashcode方法返回该 ...

  5. 洛谷P2408 不同子串个数 后缀数组 + Height数组

    ## 题目描述: 给你一个长为 $N$ $(N<=10^5)$ 的字符串,求不同的子串的个数我们定义两个子串不同,当且仅当有这两个子串长度不一样 或者长度一样且有任意一位不一样.子串的定义:原字 ...

  6. 洛谷2850 【Usaco2006 Dec】虫洞Wormholes SPFA

    问题描述 John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N (从1..N ...

  7. luoguP1462通往奥格瑞玛的道路(二分答案+spfa)

    题意 给出n个点m条边的无向图. 每条边有两个权值a,b; 问在保证从1到n的路径a权值和小于x时,路径上b权值最大值最小为多少. (n≤10000,m≤50000,x≤1000000000) 题解 ...

  8. python 爬虫简介

    初识Python爬虫 互联网 简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现 ...

  9. 【转】C#中RSA加密解密和签名与验证的实现

    [转]C#中RSA加密解密和签名与验证的实现 RSA加密算法是一种非对称加密算法.在公钥加密标准和电子商业中RSA被广泛使用.RSA是1977年由罗纳德•李维斯特(Ron Rivest).阿迪•萨莫尔 ...

  10. mysql生成随机时间

    mysql> update test set create_time=concat('2013-10-01 ', floor(10+rand()*10),':',floor(10+rand()* ...