JLRoutes使用
JLRoutes 地址:https://github.com/joeldev/JLRoutes
JLRoutes原理:
- 它是通过url scheme来实现app内部,web到app,app与app之间跳转的第三方库
- JLRoutes是个单例:有个字典routeControllersMap,然后字典是以scheme为key,routes(NSArray)为value,每次调用addRoute方法会将注册的url转换为JLRRouteDefinition类型,存在key为scheme的routes里。openurl时查找route,找到即回调block,具体的跳转我们可以在block里实现
- JLRoutes 本质可以理解为:保存一个全局的字典,key 是 URL,value 是对应存放 block 的数组,URL 和 block 都会常驻在内存中,当打开一个 URL 时,JLRoutes 就可以遍历这个全局的字典,通过 URL 来执行对应的 block。
1.先 pod 'JLRoutes' 。或者直接拖入文件。
2.导入文件。#import "JLRoutes.h"
3.打开项目的info.plist文件,增加URL Types,在其中添加自定的URL Scheme, 且URL Scheme要具有唯一性。比如此处URL Scheme添加URLSchemeOne。
- 从浏览器通过URL Scheme跳转应用
运行项目,当app安装到设备上时,URL Scheme将会自动注册 ,打开Safari在地址栏输入URLSchemeOne://(你刚刚在URL schemes中定义的Scheme),回车调整转,Safari会提示你『在URLSchemeDemo中打开连接吗?,点击确认,你会发现跳转到了你的应用中,并且后台也打印了相应的处理内容。
这个打印是在 AppDelegate.m 中要处理接收到的URL Scheme
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation {
NSLog(@"从哪个app跳转而来 Bundle ID: %@", sourceApplication);
NSLog(@"URL scheme:%@", [url scheme]);returnYES;
}
- 从另一个应用跳转到本应用
新建一个项目TestDemo,添加一个按钮,按钮添加一个点击事件,代码如下:
- (IBAction)buttonAction:(UIButton *)sender {
NSString *customURL = @"URLSchemeDemo://";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
}
运行项目,点击按钮,你会发现从TestDemo跳转到之前的应用了。
如果在跳转过去之后还要执行某些具体的操作,打开某些具体的页面,这时候我们要传递一些参数。比如我们现在就要解析URLSchemeDemo://UserViewController,希望使用这个URLScheme直接可以打开URLSchemeDemo应用中的UserViewController。
TestDemo里面代码:
- (void)buttonAction{
NSString *customURL = @"URLSchemeDemo://UserViewController";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[JLRoutes globalRoutes] addRoute:@"/:controller" handler:^BOOL(NSDictionary *parameters) {
NSString *controller = parameters[@"controller"];
[self.window.rootViewController presentViewController:[[NSClassFromString(controller) alloc] init] animated:YES completion:^{
}];
return YES;
}];
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return [JLRoutes routeURL:url];
}
如果要添加多个参数,则是:
addRoute:@"/:handle/:type/:matchId" 这样子添加的。此外,如果添加多个跳转,还可以给每个跳转设置优先级。如果不设置优先级,所有的注册优先级都为 0。
例如:
[[JLRoutes globalRoutes] addRoute:@"/:object/:action/:primaryKey" handler:^BOOL(NSDictionary *parameters) {
NSString *object = parameters[@"object"];
NSString *action = parameters[@"action"];
NSString *primaryKey = parameters[@"primaryKey"];
// stuff
return YES;
}];
- app内部跳转
类似于从另一个应用跳转到本应用。
比如跳登录页面。
[Utils showMessage:@"token值已失效,请重新登录" sureTitle:@"确定" buttonClick:^{
NSString *customURL = @"URLSchemeDemo://LoginViewController";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
}];
[[JLRoutes globalRoutes] addRoute:@"/:controller" handler:^BOOL(NSDictionary *parameters) {
NSString *controller = parameters[@"controller"];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:[[NSClassFromString(controller) alloc] init]];
[self.window.rootViewController presentViewController:nav animated:YES completion:^{
}];
return YES;
}];

浙公网安备 33010602011771号