浅谈强大易用支持URL Rewrite的iOS路由库FFRouter
FFRouter是iOS中一个强大且易用的URL路由库,支持URLRewrite,使APP在发布之后也可以动态修改相关路由逻辑。基于匹配查找URL,效率高。集成和使用都非常简单!
Github链接:FFRouter
功能
- 具备基本的URL注册、Route、取消注册、打印Log等
- 支持使用通配符(*)注册URL
- 支持URLRewrite
- 支持Rewrite时获取原URL参数或URLComponents,并可对其进行URLEncode或Decode
- 支持通过URL获取Object
- 支持RouteURL时传递非常规对象
- 支持Route一个未注册的URL时统一回调
安装
CocoaPods target'MyApp'do pod'FFRouter' end
运行podinstall
手动安装
添加其中的FFRouter文件夹到自己项目
使用方法
首先
#import"FFRouter.h"
1、基本使用
/** 注册url @paramrouteURL要注册的URL @paramhandlerBlockURL被Route后的回调 */ +(void)registerRouteURL:(NSString*)routeURLhandler:(FFRouterHandler)handlerBlock; /** 注册URL,通过该方式注册的URL被Route后可返回一个Object @paramrouteURL要注册的URL @paramhandlerBlockURL被Route后的回调,可在回调中返回一个Object */ +(void)registerObjectRouteURL:(NSString*)routeURLhandler:(FFObjectRouterHandler)handlerBlock; /** 判断URL是否可被Route(是否已经注册) @paramURL要判断的URL @return是否可被Route */ +(BOOL)canRouteURL:(NSString*)URL; /** Route一个URL @paramURL要Router的URL */ +(void)routeURL:(NSString*)URL; /** Route一个URL,并带上额外参数 @paramURL要Router的URL @paramparameters额外参数 */ +(void)routeURL:(NSString*)URLwithParameters:(NSDictionary*)parameters; /** Route一个URL,可获得返回的Object @paramURL要Router的URL @return返回的Object */ +(id)routeObjectURL:(NSString*)URL; /** Route一个URL,并带上额外参数,可获得返回的Object @paramURL要Router的URL @paramparameters额外参数 @return返回的Object */ +(id)routeObjectURL:(NSString*)URLwithParameters:(NSDictionary *)parameters; /** Route一个未注册URL时回调 @paramhandler回调 */ +(void)routeUnregisterURLHandler:(FFRouterUnregisterURLHandler)handler; /** 取消注册某个URL @paramURL要被取消注册的URL */ +(void)unregisterRouteURL:(NSString*)URL; /** 取消注册所有URL */ +(void)unregisterAllRoutes; /** 是否显示Log,用于调试 @paramenableYESorNO,默认为NO */ +(void)setLogEnabled:(BOOL)enable;
【备注】
(1)注册URL:
[FFRouterregisterRouteURL:@"protocol://page/routerDetails/:id"handler:^(NSDictionary*routerParameters){ //Route的URL与本次注册URL匹配时的回调 }]; [FFRouterregisterRouteURL:@"wildcard://*"handler:^(NSDictionary*routerParameters){ //Route的URL与本次注册URL匹配时的回调 }]; [FFRouterregisterRouteURL:@"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*)routeURLhandler:(FFObjectRouterHandler)handlerBlock;
并在handlerBlock中返回需要返回的Object,例如:
//注册并返回必要的值 [FFRouterregisterObjectRouteURL:@"protocol://page/routerObjectDetails"handler:^id(NSDictionary*routerParameters){ NSString*str=@“根据需要返回必要的Object”; returnstr; }]; //获取返回的值 NSString*ret=[FFRouterrouteObjectURL:@"protocol://page/routerObjectDetails"];
(3)如果需要传递非常规对象作为参数,如UIImage等,可使用如下方式:
[FFRouterrouteURL:@"protocol://page/routerDetails?nickname=imlifengfeng"withParameters:@{@"img":[UIImageimageNamed:@"router_test_img"]}];
2、URLRewrite
/** 根据设置的Rules去rewrite一个URL @paramurl将被rewrite的URL @returnrewrite后的URL */ +(NSString*)rewriteURL:(NSString*)url; /** 添加一个RewriteRule @parammatchRule正则匹配规则 @paramtargetRule转换规则 */ +(void)addRewriteMatchRule:(NSString*)matchRuletargetRule:(NSString*)targetRule; /** 同时添加多个RewriteRule,格式必须为:@[@{@"matchRule":@"YourMatchRule",@"targetRule":@"YourTargetRule"},...] @paramrulesRewriteRules */ +(void)addRewriteRules:(NSArray*)rules; /** 移除一个RewriteRule @parammatchRule将被移除的matchRule */ +(void)removeRewriteMatchRule:(NSString*)matchRule; /** 移除所有RewriteRule */ +(void)removeAllRewriteRules;
【备注】
(1)可以使用正则添加一条Rewrite规则,例如:要实现打开URL:https://www.taobao.com/search/原子弹时,将其拦截,改用本地已注册的URL:protocol://page/routerDetails?product=原子弹打开。
首先添加一条Rewrite规则:
[FFRouterRewriteaddRewriteMatchRule:@"(?:https://)?www.taobao.com/search/(.*)"targetRule:@"protocol://page/routerDetails?product=$1"];
之后在打开URL:https://www.taobao.com/search/原子弹时,将会Rewrite到URL:protocol://page/routerDetails?product=原子弹。
[FFRouterrouteURL:@https://www.taobao.com/search/原子弹];
(2)可以通过以下方法同时增加多个规则:
+(void)addRewriteRules:(NSArray*)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的正则中使用圆括号取出的参数
- $:原变量的值、$$:原变量URLEncode后的值、$#:原变量URLDecode后的值
例如: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=原子弹
3、FFRouterNavigation
考虑到经常用路由配置UIViewController之间的跳转,所以增加了额外的工具FFRouterNavigation来更方便地控制UIViewController之间的跳转。具体使用方法如下:
/** push时是否自动隐藏底部TabBar @paramhide是否自动隐藏,默认为NO */ +(void)autoHidesBottomBarWhenPushed:(BOOL)hide; /** 获取当前ViewController @return当前ViewController */ +(UIViewController*)currentViewController; /** 获取当前NavigationViewController @returnreturn当前NavigationViewController */ +(nullableUINavigationController*)currentNavigationViewController; /** PushViewController @paramviewController被Push的ViewController @paramanimated是否使用动画 */ +(void)pushViewController:(UIViewController*)viewControlleranimated:(BOOL)animated; /** PushViewController,可设置当前ViewController是否还保留 @paramviewController被Push的ViewController @paramreplace当前ViewController是否还保留 @paramanimated是否使用动画 */ +(void)pushViewController:(UIViewController*)viewControllerreplace:(BOOL)replaceanimated:(BOOL)animated; /** Push多个ViewController @paramviewControllersViewControllerArray @paramanimated是否使用动画 */ +(void)pushViewControllerArray:(NSArray*)viewControllersanimated:(BOOL)animated; /** presentViewController @paramviewController被present的ViewController @paramanimated是否使用动画 @paramcompletion回调 */ +(void)presentViewController:(UIViewController*)viewControlleranimated:(BOOL)animatedcompletion:(void(^__nullable)(void))completion; /** 关闭当前ViewController,push、present方式通用 @paramanimated是否使用动画 */ +(void)closeViewControllerAnimated:(BOOL)animated;
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。