测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最新发布 | 2016年4月 |
SPM支持 SPM | ✗ |
由 shmily 维护。
依赖项 | |
HHJLRoutes | >= 0 |
SJFreeController | >= 0 |
JLRoutes 是基于块的回调 API 的高级 URL 解析。它旨在使处理应用中的复杂 URL 方案变得非常简单,而无需进行任何类型的 URL 或字符串解析。
有关如何在应用的 Info.plist 中注册自定义 URL 方案的更多信息。
JLRoutes 可通过 CocoaPods 进行安装。
// in your app delegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ...
[JLRoutes addRoute:@"/user/view/:userID" handler:^BOOL(NSDictionary *parameters) {
NSString *userID = parameters[@"userID"]; // defined in the route by specifying ":userID"
// present UI for viewing user with ID 'userID'
return YES; // return YES to say we have handled the route
}];
// ...
return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [JLRoutes routeURL:url];
}
在设置好该路由后,任何时刻(包括其他应用)都可以调用此方法以触发处理器块。
NSURL *viewUserURL = [NSURL URLWithString:@"myapp://user/view/joeldev"];
[[UIApplication sharedApplication] openURL:viewUserURL];
在这个示例中,传给块的参数字典中的 userID 对象将具有键值对 "userID": "joeldev"
,然后可以用它来显示 UI 或执行其他所需的操作。
参数字典始终至少包含以下三个键
{
"JLRouteURL": "(the NSURL that caused this block to be fired)",
"JLRoutePattern": "(the actual route pattern string)",
"JLRouteNamespace": "(the route namespace, defaults to JLRoutesGlobalNamespace)"
}
JLRouteNamespace 键引用匹配的路由所在的命名空间。 更多信息关于命名空间。
这些键在 JLRoutes.h 中定义为常量,便于使用。
static NSString *const kJLRoutePatternKey = @"JLRoutePattern";
static NSString *const kJLRouteURLKey = @"JLRouteURL";
static NSString *const kJLRouteNamespaceKey = @"JLRouteNamespace";
您可能已经注意到,处理程序块应该返回一个布尔值,表示它是否已处理路线。如果该块返回NO
,JLRoutes会将该路线视为不匹配,并继续寻找匹配项。只有当模式字符串匹配并且该块返回YES
时,才认为路线是匹配的。
值得注意的是,如果您为处理程序块传入nil,则会创建一个内部处理程序块,该块仅返回YES
。
[JLRoutes addRoute:@"/:object/:action/:primaryKey" handler:^BOOL(NSDictionary *parameters) {
NSString *object = parameters[@"object"];
NSString *action = parameters[@"action"];
NSString *primaryKey = parameters[@"primaryKey"];
// stuff
return YES;
}];
此路线将匹配类似于/user/view/joeldev
或/post/edit/123
的URL。假设您已使用一些URL参数调用/post/edit/123
。
NSURL *editPost = [NSURL URLWithString:@"myapp://post/edit/123?debug=true&foo=bar"];
[[UIApplication sharedApplication] openURL:editPost];
处理程序块接收的参数字典将包含以下键值对
{
"object": "post",
"action": "edit",
"primaryKey": "123",
"debug": "true",
"foo": "bar",
"JLRouteURL": "myapp://post/edit/123?debug=true&foo=bar",
"JLRoutePattern": "/:object/:action/:primaryKey",
"JLRouteNamespace": "JLRoutesGlobalNamespace"
}
JLRoutes支持在给定的URL方案命名空间内设置路线。在单个方案命名空间内设置的路线只能由使用相同方案的URL匹配。默认情况下,所有路线都包含在全局方案中。当前的+addRoute方法将使用此方案,且没有不同的功能。
但是,如果您决定确实需要处理多个方案,其中包含不同功能的集合,以下是如何做的示例:
[JLRoutes addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) {
// This block is called if the scheme is not 'thing' or 'stuff' (see below)
return YES;
}];
[[JLRoutes routesForScheme:@"thing"] addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) {
// This block is called for thing://foo
return YES;
}];
[[JLRoutes routesForScheme:@"stuff"] addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) {
// This block is called for stuff://foo
return YES;
}];
此示例表明您可以在不同的方案中声明相同的路线,并且可以基于每个方案使用不同的回叫处理它们。
在这个例子中继续,如果您要把以下路线添加到上面的集合中
[JLRoutes addRoute:@"/global" handler:^BOOL(NSDictionary *parameters) {
return YES;
}];
然后尝试使用URLthing://global
进行路由,它不会匹配,因为该路由尚未在thing
命名空间中声明,而是在全局命名空间中声明(我们假设这是开发人员想要的方式)。但是,您可以很容易地通过将该属性设置为YES
来更改此行为。
[JLRoutes routesForScheme:@"thing"].shouldFallbackToGlobalRoutes = YES;
这告诉JLRoutes,如果无法在thing
命名空间内路由URL(即,以thing:
开头,但没有在命名空间中找到合适的路线),尝试通过在全局路线命名空间中查找匹配的路线来恢复。将此属性设置为YES
后,URL‘thing://global’会被路由到/global块。
JLRoutes支持设置将匹配路由URL末尾任意数量的路径组件的路由。包含额外路径组件的数组将添加到参数字典中,键为kJLRouteWildcardComponentsKey
。
例如,以下路线将在任何以/wildcard/
开头的URL上触发,但如果下一个组件不是joker
,则会由处理程序拒绝。
[JLRoutes addRoute:@"/wildcard/*" handler:^BOOL(NSDictionary *parameters) {
NSArray *pathComponents = parameters[kJLRouteWildcardComponentsKey];
if ([pathComponents count] > 0 && [pathComponents[0] isEqualToString:@"joker"]) {
// the route matched; do stuff
return YES;
}
// not interested unless the joker's in it
return NO;
}];
JLRoutes支持设置带有可选参数的路由。在路由注册时,JLRoute会登记多个路线,包括带有和没有可选参数的路由的所有组合。例如,对于路线/user/:userId(/post/:postId)(/reply/:replyId)
,它将注册以下路线:
/user/:userId/post/:postId/reply/:replyId
/user/:userId/post/:postId/
/user/:userId
BSD 3-Clause License
版权所有© 2015,Joel Levin。保留所有权利。
在满足以下条件的情况下,允许以源代码和/或二进制形式分发和/或修改
- 源代码的再分发必须保留上述版权声明、本许可证条件和以下免责声明。
- 二进制形式的重新分发必须复制上述版权声明、本许可清单和以下免责声明在随分销提供的文档和/或其他材料中。
- 未经事先书面许可,不得使用JLRoutes或其贡献者的姓名来批准或推广源自本软件的产品。
本软件由版权所有者和贡献者“按现状”提供,无论明示或暗示,包括但不限于,适销性和针对特定目的的适用性暗示保证,均予以放弃。在任何情况下,版权所有者或贡献者均不对因使用本软件而产生的任何直接、间接、偶然、特殊、示范或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或收益的丧失;或业务中断)承担责任,无论这些损害是如何产生的,以及依据何种责任理论(无论是合同、严格责任或侵权行为,包括疏忽或其他),即使被告知可能存在此类损害的风险。