podRoutes2 0.1.4

podRoutes2 0.1.4

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2016年4月
SPM支持 SPM

shmily 维护。



 
依赖项
HHJLRoutes>= 0
SJFreeController>= 0
 

  • 作者
  • _Ashen

JLRoutes

是什么?

JLRoutes 是基于块的回调 API 的高级 URL 解析。它旨在使处理应用中的复杂 URL 方案变得非常简单,而无需进行任何类型的 URL 或字符串解析。

有关如何在应用的 Info.plist 中注册自定义 URL 方案的更多信息。

功能

  • 简单的 API,对现有代码库的影响最小
  • 解析 URL 中任何数量的参数
  • 支持通配符参数
  • 无缝解析查询字符串和片段参数,并将它们作为参数字典的一部分传递
  • 路由优先级
  • 方案命名空间,易于分割路由和多个方案的块处理器
  • 从处理器块中返回 NO,以便 JLRoutes 查找下一个匹配的路由
  • 可选详细日志记录
  • 美化打印整个路由表
  • 除了 Foundation 没有其他依赖项

安装

JLRoutes 可通过 CocoaPods 进行安装。

要求

  • ARC
  • iOS 5.0+ 或 OS X 10.7+
  • Foundation.framework

简单示例

// 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或其贡献者的姓名来批准或推广源自本软件的产品。

本软件由版权所有者和贡献者“按现状”提供,无论明示或暗示,包括但不限于,适销性和针对特定目的的适用性暗示保证,均予以放弃。在任何情况下,版权所有者或贡献者均不对因使用本软件而产生的任何直接、间接、偶然、特殊、示范或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或收益的丧失;或业务中断)承担责任,无论这些损害是如何产生的,以及依据何种责任理论(无论是合同、严格责任或侵权行为,包括疏忽或其他),即使被告知可能存在此类损害的风险。