DZURLRoute 1.0.1

DZURLRoute 1.0.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最新发布2018年5月

ImageView维护。



 
依赖
DZViewControllerLifeCircleAction>= 0
NSString-UrlEncode>= 0
 

  • yishuiliunian

DZURLRoute

CI Status Version License Platform

是什么

DZURLRoute是一种支持基于标准URL进行本地页面间跳转的Objective-C实现。它方便您构建页面之间高内聚低耦合的开发模式。其核心思想是把每一个页面视为一个资源,通过标准的URL协议(统一资源定位符)来定位到每一个可触达的页面(资源)。

在设计这个类库时,进行了多次抽象。最后突然灵感闪现,首先应该设计的应该是页面间的规则。当我们把页面看作一种资源,把页面间的调用看作资源寻址和调用时,很容易联想到URL的方式。通过简单的规则(URL)来定义页面之间的关系。没有太多复杂的机制,只是一个规则,简单而美丽。一旦有了这个规则,剩下的就是如何去实现了。而DZURLRoute只是其中的一种实现,相信其他人还会有更好的实现版本,欢迎分享。

下一步是扩展成一个IOC的基础类库

功能

URL唤起任意见面

使用标准的正则表达式匹配URL,通过URL来定位每一个资源,调用页面只需要拼接好需要跳转的URL,通过DZURLRoute进行转发即可。

[[DZURLRoute defaultRoute] routeURL:[NSURL URLWithString:@"scheme://host/path?query=xx"]];

页面处理时,每个返回的页面都会绑定一个 SourceURL,您可以通过该 SourceURL 做些事情

例如,使用 NavigationController 返回指定页面

    [self.navigationController popToPage:DZURLRouteQueryLink(kDZRoutePatternExampleViewController, @{})];

这是新增的超级强大的功能!!!

采用标准通配符进行URL匹配,并使用block方式处理请求,扩展性好。

注册匹配规则的地方接受带有通配符的规则,内部通过正则表达式进行匹配。方便您将一类URL统一定位到一个资源。同时,采用通配符匹配而非字符串对比也是考虑到未来的可扩展性。

@interface YHActionGroupDetailElement : UIViewController
@end

@implementation YHActionGroupDetailElement
+ (void) load
{
    [[DZURLRoute defaultRoute] addRoutePattern:@"scheme://host/path" handler:^BOOL(DZURLRouteRequest *request) {
        ActionGroup* profile = [request.paramters protobuffInstanceForKey:kYHURLQueryParamterProfile kindOf:[ActionGroup class]];
        YHActionGroupDetailElement* vcx = [[YHActionGroupDetailViewController alloc] initWithprofile:profile];
        [request.topNavigationController pushViewController:vcx animated:YES];
        return YES;
    }];
}
您可以在block中自定义行为,例如类似304跳转的行为。

携带页面跳转所需的上下文环境。

@interface DZURLRouteRequest : NSObject
......
@property (nonatomic, strong, readonly) NSArray* viewControllerStack;
@property (nonatomic, strong, readonly) UIViewController* topViewController;
@property (nonatomic, strong, readonly) UINavigationController* topNavigationController;
......
@end

在iOS中,加载页面有几种标准方式:

  1. UINavigationController push
  2. UIViewController present

这两种方式都需要从发起页面开始调用,这也是之前页面之间耦合性很高的原因。在调用位置需要知道被调用页面的类和初始化方法,才能正确创建和初始化被调用方的变量。在DZURLRoute中,通过维护全局的可展示UI栈。可以把整个用户界面显示中的UIViewController的上下文情况得到。并通过DZURLRequest传递给处理函数。在处理函数内部可以直接通过该上下文来唤起当前界面。推荐在+load方法中注册当前类的通配符规则,这样可以保持较好的封闭性(该类的处理,在该类内部完成)。例如在之前的特性中展示的代码。

这个功能还能实现携带UI栈上下文,得益于另一个库DZUIViewControllerLifeCircleAction,它提供了对UIViewController进行AOP编程的基础。

支持标准的URL协议

scheme://host/path?query

会自动解析URL中相关的属性,同时将其他相关数据传递处理

名称 含义 备注
originURL 原始跳转URL
scheme scheme
模块 URL的host
method URL中Path部分的第一层
parameters 以字典形式提供的query中的Key-Value对
@interface DZURLRouteRequest : NSObject
.......
@property (nonatomic, strong, readonly) NSURL* originURL;
@property (nonatomic, strong, readonly) NSString* scheme;
@property (nonatomic, strong, readonly) NSString* module;
@property (nonatomic, strong, readonly) NSString* method;
@property (nonatomic, strong, readonly) NSDictionary* paramters;
......

支持降级策略

支持类似HTTP 404错误的处理方式,在本地不支持某个URL处理的时候,将请求转发到统一的404处理页面。在该页面内部,用户可以自己编写处理逻辑,将原始URL带到服务器后端,服务器设置降级策略将Native请求跳转到H5页面。

支持外部scheme跳转

由于支持标准URL处理,如果需要处理外部URL跳转,只需要在appdelgate中进行路由转发即可。

  • (BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [[NSURLRoute defaultRoute] routeURL:url] }

ABTest等扩展需求支持

对于某些具有ABTest方案的特定业务,也具有良好的支持。只需要在URL中携带相关ABTest参数即可。在该方案设计中,每个类在其+load方法中注册自己的唤醒方法,包括实例初始化、必要参数传递和页面跳转。因此,在注册唤醒定位方向时,可以将ABTest的实验数据通过URL查询传递,在初始化过程中传递。并根据不同的实验条件进行实验。

Example

要运行示例项目,首先需要克隆存储库,然后从示例目录中运行pod install

Requirements

s.dependency  'DZViewControllerLifeCircleAction'
s.dependency 'NSString-UrlEncode'

Installation

DZURLRoute通过CocoaPods提供。要安装它,只需在Podfile中添加以下行:

pod "DZURLRoute"

Author

yishuiliunian, [email protected]

许可

DZURLRoute库使用MIT许可证。更多信息请参阅LICENSE文件。

版权所有(c)2016 yishuiliunian [email protected]

任何获得此软件及其相关文档副本(“软件”)的人,在此 免费授予不经限制地处理软件的权利,包括但不仅限于使用、复制、修改、合并、出版、分发、再许可和/或出售软件副本的权利,并允许获得软件的人为此目的 doing so,但须遵守以下条件

上述版权声明和许可声明应包含在软件的所有副本或实质性部分中。

软件按“原样”提供,不提供任何形式的保证,明示或暗示,包括但不限于适销性、适用于特定目的和侵权担保。在任何情况下,作者或版权所有者不应对任何索赔、损害或其他责任负责,无论是在合同行为、侵权或其他情况下因软件或软件的使用或其它方式引起。