OC路由实现

通过路由可以实现模块间的通信以及解耦合。

可以通过URL实现路由。

URL

基本格式:

scheme://host:port/path?query#fragment

参数的使用。

一些宏定义:

NSString *const LHRURLHostJumpViewController = @"jump.vc.lhrouter"; /// vc跳转
NSString *const LHRURLHostJumpViewController = @"call.service.lhrouter"; ///服务通信
NSString *const LHRURLFragmentViewControlerEnterModePush = @"push";
NSString *const LHRURLFragmentViewControlerEnterModeModal = @"modal";
NSString *const LHRURLJumpViewControllerAnimatedYES = @"YES";
NSString *const LHRURLJumpViewControllerAnimatedNO= @"NO";
  • host:代表模块。

    模块注册时可分为不同类型注册, 决定路由类型跳转或者服务通信,可以通过host做标识,我在这里用特定的host标示跳转和通信。

    • 默认jump.vc.lhrouter标示为vc跳转,统一跳转,需要外部注册模块和安卓保持统一

    • 默认call.service.lhrouter应用内部service通信。

    • host 也支持外部注册:通过LHRouterConfig配置

  • path
    • 例:lh://main/towViewPage/?#push"

      • main为外部注册host,hostd代表业务模块,默认类型为push。towViewPage为key,根据key找到注册的控制器。key为了保持安卓iOS双端统一。
    • 例:lh://call.service.lhrouter/LHTestService/sum:b:

      • host为call.service.lhrouter调用相关服务的方法 , 路由传递传递服务类名和方法。
      • 用于和内部服务通信
  • query传值

  • fragment跳转类型 push or modal

外部注册host:

 @interface LHRouterConfig : NSObject
 + (instancetype)shareInstance;
 /// 注册跳转host 不同的业务模块需要注册
 - (void)registerJumpHost:(NSString *)host;
 /// 注册服务通信host
 - (void)registerServiceHost:(NSString *)host;
 /// 注销host
 - (void)unregisterHost:(NSString *)host;
 ///获取路由类型
 - (LHRouterHostType)getRouterHostType:(NSString *)host;
 @end

路由方法调用:

+ (void)openURL:(NSURL *)URL;
+ (void)openURL:(NSURL *)URL
     withParams:(NSDictionary<NSString *, id> *)params;
+ (void)openURL:(NSURL *)URL
     withParams:(NSDictionary<NSString *, id> *)params
       callBack:(void(^)(NSString *pathComponentKey, id obj, id returnValue))callBack; // callBack 可以获取服务的返回值,或者在路由跳转后做操作

传值

可以通过字典传参,如果url的query也有传参,最中把参数整合在一个字典里面。

demo以及集成

Demo地址

集成: pod 'LHRoutes'