MSRouter 0.2.7

MSRouter 0.2.7

yuanhsuai 维护。



MSRouter 0.2.7

  • Marshal

MSRouter

CI Status Version License Platform

为什么需要路由?

这里简要介绍了组件化开发的场景,路由作为中介组件,我单独剥离出来,提供一种解决方案思路 https://mp.weixin.qq.com/s/Lz7JbiN-ccMSg0F-afzTUg

示例

要运行示例项目,首先克隆仓库,然后从 Example 目录运行 pod install

要求

安装

MSRouter 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod 'MSRouter'

注册路由

//1.手动注册路由,如果已经被注册过,返回注册失败的路由地址
//参数key为固定参数,url:注册链接,object:路由处理对象的classString
//因swift存在命名空间,需要配置moduleName,一般为object类所在的target名称,如未配置,默认取 Bundle.main.infoDictionary?["CFBundleExecutable"]
MSRouter.addRouter(withParams: ["url":"vc1","object":"V1RouterBridge"], forModule: moduleName) { (res) in
    print("注册失败的链接:\(res)")
    
    
}
//2.通过配置文件注册路由,如果已经被注册过,返回注册失败的路由地址
//plist为数组类型,[["url":"xx","object":"xxx","module":"xxx"],["url":"xx","object":"xxx","module":"xxx"]]
//因swift存在命名空间,需要配置moduleName,一般为object类所在的target名称,如未配置,默认取 Bundle.main.infoDictionary?["CFBundleExecutable"]

let path = Bundle.main.path(forResource: "router", ofType: "plist")
MSRouter.addRouter(withPlistPath: path, forModule: moduleName) { (res) in
    print("注册失败的链接:\(res)")
}

//3.通过target-action方式注册路由
MSRouter.addRouter(withUrl: "RouterAdapter1", forObject: RouterAdapter(), completed: nil) { (request) in
    let vc = ViewController3()
    MSRouter.getNavigation()?.pushViewController(vc, animated: true)
}

访问路由

//路由链接:scheme://host?xx=aa&yy=bb,路由识别通过注册url与scheme://host进行匹配
var callBack = { (data:String) in
    print("----\(data)")
}
MSRouter.handleUrl("vc1?title=vc1&present=0", ["callback":callBack])
MSRouter.handleUrl("vc2?title=vc2", ["callback":callBack])
@IBAction func dosync(_ sender: Any) {
  let res =  MSRouter.callData("CallDataBridge", nil) as? String
    print("同步执行结果\(res ?? "")")
}
    
@IBAction func doAsync(_ sender: Any) {
    MSRouter.asyncCallData("CallDataBridge", nil) { result in
        let res = result as? String
        print("异步同步执行结果\(res ?? "")")
    }
}

//注册类的参数解析后可通过ms_routerRequest进行访问

var callBack:((String)->())?
override func viewDidLoad() {
    super.viewDidLoad()
    if let request = self.ms_routerRequest {
        if let params = request.params{
            self.navigationItem.title = params["title"] as? String
        }
        if let nativeParams = request.nativeParams,let block = nativeParams["callback"] as? ((String)->()){
            callBack = block
        }
        
    }
}

拦截路由

//通过MSRouterProtocol协议拦截路由,自定义处理逻辑,注路由拦截类必须继承自NSObject
class V1RouterBridge:NSObject {
    override func ms_handleRouter(_ request: MSRouterRequest) -> Any? {
        let res = MSRouterResponse()
        res.object = UIStoryboard(name: "Main", bundle: .main).instantiateViewController(withIdentifier: "ViewController1")
        request.presented = true
        print("拦截了路由\(String(describing: request.params))")
        if let callback = request.nativeParams?["callback"] as? (String)->(){
            callback("路由被拦截")
        }
        return res
    }
    
}

class CallDataBridge:NSObject{
    ///同步方法拦截
    override func ms_handleRouter(_ request: MSRouterRequest) -> Any? {
        return "123"
    }
    ///异步方法拦截
    override func ms_asyncHandleRouter(_ request: MSRouterRequest, callBack: ((Any?) -> (Void))?) {
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            callBack?("1234")
        }
    }
}

作者

[email protected], Marshal

许可证

MSRouter遵循MIT授权协议。更多信息请参阅LICENSE文件。