资讯专栏INFORMATION COLUMN

iOS 解耦和组件化开发新姿势—— FFRouter

Donald / 1646人阅读

摘要:是中一个强大且易用的路由框架,支持,使在发布之后也可以动态修改相关路由逻辑。首先添加一条规则之后在打开原子弹时,将会到原子弹。

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 *)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 *)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 *)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 *)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实现方案参考了以下文章,在此表示感谢!

天猫解耦神器 —— 统跳协议和Rewrite引擎

蘑菇街 App 的组件化之路

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17147.html

相关文章

  • 聊聊Vue.js组件间通信的几种姿势

    摘要:子组件向父组件通信方法一使用事件父组件向子组件传递事件方法,子组件通过触发事件,回调给父组件。非父子组件兄弟组件之间的数据传递非父子组件通信,官方推荐使用一个实例作为中央事件总线。 写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出。 文章的原地址:https://github.com/answ...

    Profeel 评论0 收藏0
  • 上课程推荐:《React Hooks 案例详解(React 进阶必备)》

    摘要:课程制作和案例制作都经过精心编排。对于开发者意义重大,希望对有需要的开发者有所帮助。是从提案转为正式加入的新特性。并不需要用继承,而是推荐用嵌套。大型项目中模块化与功能解耦困难。从而更加易于复用和独立测试。但使用会减少这种几率。 showImg(https://segmentfault.com/img/bVbpNRZ?w=1920&h=1080); 讲师简介 曾任职中软军队事业部,参与...

    Lin_YT 评论0 收藏0
  • ZStack源码剖析:如何在百万行代码中快速迭代

    摘要:本文将对核心引擎的源码进行剖析。在笔者看来,能够快速迭代的原因首先是来自于每位工程师的辛勤付出。在中,还有一类很有意思的代码,一般称之为。笔者有机会将会在之后的系列文章分析其中的典型案例以及在代码中使用极其频繁的核心工具。 本文首发于泊浮目的专栏:https://segmentfault.com/blog... 前言 ZStack是下一代开源的云计算IaaS(基础架构即服务)软件。它...

    liujs 评论0 收藏0
  • ZStack源码剖析:如何在百万行代码中快速迭代

    摘要:本文将对核心引擎的源码进行剖析。在笔者看来,能够快速迭代的原因首先是来自于每位工程师的辛勤付出。在中,还有一类很有意思的代码,一般称之为。笔者有机会将会在之后的系列文章分析其中的典型案例以及在代码中使用极其频繁的核心工具。 本文首发于泊浮目的专栏:https://segmentfault.com/blog... 前言 ZStack是下一代开源的云计算IaaS(基础架构即服务)软件。它...

    aikin 评论0 收藏0
  • ZStack源码剖析:如何在百万行代码中快速迭代

    摘要:本文将对核心引擎的源码进行剖析。在笔者看来,能够快速迭代的原因首先是来自于每位工程师的辛勤付出。在中,还有一类很有意思的代码,一般称之为。笔者有机会将会在之后的系列文章分析其中的典型案例以及在代码中使用极其频繁的核心工具。 本文首发于泊浮目的专栏:https://segmentfault.com/blog... 前言 ZStack是下一代开源的云计算IaaS(基础架构即服务)软件。它...

    stackvoid 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<