FFRouter 是 iOS 中一个强大且易用的 URL 路由库,支持 URL Rewrite,使 APP 在发布之后也可以动态修改相关路由逻辑。基于匹配查找 URL,效率高。集成和使用都非常简单!
具备基本的 URL 注册、Route、取消注册、打印 Log 等
支持使用通配符(*)注册 URL
支持 URL Rewrite
支持 Rewrite 时获取原 URL 参数或 URLComponents,并可对其进行URL Encode或 Decode
支持通过 URL 获取 Object
支持 Route URL 时传递非常规对象
支持 Route 一个未注册的 URL 时统一回调
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;
FFRouter
实现方案参考了以下文章,在此表示感谢!
FFRouter 是 iOS 中一个强大且易用的 URL 路由框架,支持 URL Rewrite,使 APP 在发布之后也可以动态修改相关路由逻辑。基于匹配查找 URL,效率高。集成和使用都非常简单! Github链接:FFRouter 功能 具备基本的 URL 注册、Route、取消注册、打印 Log 等 支持使用通配符(*)注册 URL 支持 URL Rewrite 支持 Rewrite 时获
目前iOS常用路由框架是JLRouter、HHRouter、MGJRouter。 但是这些路由库都各有不足,首先是JLRouter,用不到的功能繁多,而且基于遍历查找URL,效率低下。HHRouter耦合程度太高,过度依赖ViewController。MGJRouter功能太过简单。 今天介绍一个新发现的iOS路由框架,FFRouter: FFRouter 是 iOS 中一个强大且易用的 URL
简介 Apache ShardingSphere 使用 ThreadLocal 管理分片键值进行强制路由。 可以通过编程的方式向 HintManager 中添加分片值,该分片值仅在当前线程内生效。 Hint 的主要使用场景: 分片字段不存在 SQL 和数据库表结构中,而存在于外部业务逻辑。 强制在主库进行某些数据操作。 使用方法 使用 Hint 分片 规则配置 Hint 分片算法需要用户实现 or
实现动机 通过解析 SQL 语句提取分片键列与值并进行分片是 Apache ShardingSphere 对 SQL 零侵入的实现方式。若 SQL 语句中没有分片条件,则无法进行分片,需要全路由。 在一些应用场景中,分片条件并不存在于 SQL,而存在于外部业务逻辑。因此需要提供一种通过外部指定分片结果的方式,在 Apache ShardingSphere 中叫做 Hint。 实现机制 Apache
为了定义辅助路由,我们必须首先添加一个命名的路由出口,其中要呈现辅助路由的内容。 接下来,我们必须定义到应用程序的辅助路由的链接,以导航和呈现内容。 每个辅助路由是独立的路由,可以拥有: 自己的辅助路由 自己的浏览器历史记录栈
将路由链接到参数 显示特定产品详细信息的组件的路由需要该产品ID的路由参数。我们可以使用以下实现: 注意:product-details路由的路径中的 ,它将参数放在路径中。例如,要查看ID为5的产品的产品详细信息页面,必须使用以下URL:localhost:3000/product-details/5 注意,指令传递一个数组,该数组指定路径和路由参数。或者,我们可以使用JS跳转: Product
问题内容: 我还没有找到一个简单的答案,这使我相信这确实非常简单。无论哪种方式,我都走了。 $ routeProvider中的所有调用都可以正常工作,但是区分大小写。这是一个代码示例: 我需要添加什么,以便“ / Foo”,“ / fOO”,“ / FoO”等都重定向到同一路径? 问题答案: 您可以传递给$ routeProvider一个选项来区分大小写:
我正在我的nodejs应用程序中创建restendpoint,如下所示: 在我的服务器上。我有以下代码: 我还尝试了下面的代码,而不是像在潜在重复问题上建议的那样使用express.json和expres.urlencoded。 在我的APIRoutes文件中,我有以下代码: 我尝试了不同的组合和订单来设置更高的限制。但是目前每次我发送2kb的有效载荷,我都会得到一个413“(有效载荷太大)”的错