FFRouter路由
為啥路由
最近進(jìn)入項(xiàng)目維護(hù)階段,發(fā)現(xiàn)維護(hù)非常吃力,整個(gè)App 到處都是商品列表莺治,購(gòu)物車,下單,商品詳情尽爆,這些頁(yè)面之間相互跳轉(zhuǎn),相互傳值读慎,各種回調(diào)漱贱, 造成了互相依賴并且高度耦合。如下圖(盜來(lái)的??):已經(jīng)到了必須實(shí)現(xiàn)路由功能的時(shí)候夭委,看了很多大神實(shí)現(xiàn)路由的方式(非常感謝??)幅狮,尤其是YINRoute 的實(shí)現(xiàn) ,再結(jié)合自身項(xiàng)目需求,就產(chǎn)生了FFRouter
FFRouter實(shí)際不單單只是一個(gè)iOS內(nèi)部解耦的路由株灸,他還包含了JS下發(fā)功能崇摄,通信。如實(shí)現(xiàn) Banner打開(kāi)native某些頁(yè)面或者功能慌烧。(不需要發(fā)版就是實(shí)現(xiàn)額外功能??)
FFRouter的原理
最核心的方法
- (void)openUrl:(NSString *)urlString withData:(NSDictionary *)data {
NSURL *url = [NSURL URLWithString:urlString];
// 1內(nèi)部路由 FFRouterDemo://open/...
if ([@"FFApp" isEqual: url.scheme]) {
//打開(kāi)對(duì)應(yīng)的頁(yè)面
} else if ([@"http" isEqual: url.scheme] || [@"https" isEqual: url.scheme]) {
NSString *scheme = url.scheme;
if ([scheme hasPrefix:@"item"]) {
//打開(kāi)外部連接
} else {
//打開(kāi)本地WebView
}
} else if ([@"FFhttp" isEqual: url.scheme] || [@"FFhttps" isEqual: url.scheme]) {
//打開(kāi)h5下發(fā)的路由配置
}
}
openUrl 方法中會(huì)驗(yàn)證URL是否正確逐抑,如果不正確,將無(wú)法打開(kāi)對(duì)應(yīng)頁(yè)面屹蚊, 如需要打開(kāi)內(nèi)部跳轉(zhuǎn)厕氨,url格式必須如下: FFApp://open 可以根據(jù)項(xiàng)目自行修改
url = @"FFApp://open/detail"
打開(kāi)JS下發(fā)的路由:
url = @"FFhttp://open/test/second"
路由實(shí)現(xiàn)后进每,后期只需要維護(hù)2張表即可 ,1)本地FFRouteList.plist 2)JS下發(fā)功能表 如下
FFhttp://open/hzbank/homepage
FFhttp://open/hzbank/recharge
FFhttp://open/hzbank/withdrawal
.....
然后就是按需求跳轉(zhuǎn)到對(duì)應(yīng)業(yè)務(wù)頁(yè)面就是了...
FFRouter 的使用
1 初始化路由
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[FFRouter start];
return YES;
}
start方法配置整個(gè)項(xiàng)目的路由列表FFRouteList.plist命斧, 也可以通過(guò)調(diào)用FFURLPath的方法 添加或者刪除配置
+ (void)load{
[[FFURLPath shared] registClass:NSStringFromClass(self.class) withPath:@"second"];
}
2. Native內(nèi)部跳轉(zhuǎn)
比如打開(kāi)詳情頁(yè)面包含參數(shù)和回調(diào)
id block = ^(NSString *str){
NSLog(@"返回====%@",str);
};
NSDictionary *dic = @{
@"name":@"我的名字叫‘大神’",
@"callBack":block
};
[[FFRouter shared] openUrl:@"FFApp://open/detail" withData:dic];
3. JS打開(kāi)本地VC
比如banner 想打開(kāi)native SecondVC
id block = ^(NSString *str){
NSLog(@"返回====%@",str);
};
NSDictionary *dic = @{
@"contentString":@"h5叫我打開(kāi)這個(gè)頁(yè)面的田晚,‘大神’ ",
@"callBack":block
};
[[FFRouter shared] openUrl:@"FFhttp://open/test/second" withData:dic];
4. 內(nèi)部WebView
[[FFRouter shared] openUrl:@"http://www.baidu.com" withData:nil];
再次感謝眾多大神??