iOS 路由组件-HBRouter

2022-02-24 14:31:17 +08:00
 neverfall

HBRouter

[https://github.com/flywithbug/HBRouter]

路由初始化注册管理

 //方法工厂
//自定义跳转方法
 public typealias  handlerFactory = (_ router: HBRouterAction) -> Any?

 //注册自定义返回 Controller
 public typealias  viewControllerFactory = (_ router:HBRouterAction) -> UIViewController?
 
//全局单例
 public static func shared() -> HBRouter.HBRouter
 ///默认路由 host
 public var defaultRouterHost: String { get }

 /// 默认路由 scheme
 public var defaultRouterScheme: String { get }

 //默认导航控制器类(初始化时使用)
 public var wrapNavgClass: UINavigationController.Type

 @objc weak public var deleage: HBRouter.HBRouterDelegate?

 @objc public func setDefault(_ scheme: HBRouter.routerScheme, host: HBRouter.routerHost)

 @objc public private(set) var routerMapping: [HBRouter.routerURLPattern : HBRouter.HBRouterTarget] { get }

 /// 路由表注册
 /// - Parameters:
 ///   - mapping: 路由表映射关系
 ///   - bundleClass: 映射对象所在 bundleClass
 public func registRouter(_ mapping: [HBRouter.routerPath : HBRouter.routerTarget], bundleClass: AnyClass? = nil)

 public func registRouter(_ mapping: [HBRouter.routerPath : HBRouter.routerTarget], bundle: HBRouter.routerBundle? = nil)

 public func registeRouter(_ targets: [HBRouter.HBRouterTarget])

 public func openController(_ action: HBRouter.HBRouterAction) -> (viewController: UIViewController?, success: Bool)?


 自定义路由方法处理(用于处理 jsbridge 和 flutter 路由相关)
 /// 自行处理 openAction 操作
 /// - Parameters:
 ///   - urlPatterns: hb://router.com/path  hb://router.com  hb://  hb
 ///   - factory:  回调方法
 override public func registeHander(_ urlPatterns: [HBRouter.routerURLPattern], factory: @escaping HBRouter.handlerFactory)

 override public func registerHander(_ urlPattern: HBRouter.routerURLPattern, factory: @escaping HBRouter.handlerFactory)

 override public func registeViewController(_ urlPatterns: [HBRouter.routerURLPattern], factory: @escaping HBRouter.viewControllerFactory)

 override public func registerViewController(_ urlPattern: HBRouter.routerURLPattern, factory: @escaping HBRouter.viewControllerFactory)

代理协议:HBRouterDelegate

    //router 权限校验及调用生命周期
    //登录态判断及状态回调
    func loginStatus(_ action:HBRouterAction, completion: ((Bool) -> Void)?) -> Bool
    
    //路由权限校验
    func shouldOpenRouter(_ action:HBRouterAction) -> Bool
    //路由打开状态
    func willOpenRouter(_ action:HBRouterAction)
    func didOpenRouter(_ action:HBRouterAction)
    
    
    //外链判断
    func shouldOpenExternal(_ action:HBRouterAction) -> Bool
    
    //外链打开状态
    func willOpenExternal(_ action:HBRouterAction)
    func openExternal(_ action:HBRouterAction, completion: ((Bool) -> Void)?)
    func didOpenExternal(_ action:HBRouterAction)
    
    
    //未能匹配到的路由回调
    func onMatchUnhandleRouterAction(_ action:HBRouterAction)
    //路由匹配成功回调
    func onMatchRouterAction(_ action:HBRouterAction, any:Any?)

路由组件使用

//打开路由 Action
override public func openRouterAction(_ action: HBRouter.HBRouterAction) -> Any?
public func open(url: URL) -> Any?
public func open(url: URL, completion: ((HBRouter.HBRouterResponse) -> Void)? = nil, callBack: ((Any?) -> Void)? = nil) -> Any?
public func open(url: URL, params: [String : Any]) -> Any?
public func open(url: URL, params: [String : Any], completion: ((HBRouter.HBRouterResponse) -> Void)? = nil, callBack: ((Any?) -> Void)? = nil) -> Any?
public func open(_ path: HBRouter.routerPath, host: HBRouter.routerHost, scheme: HBRouter.routerScheme, params: [String : Any] = [:], completion: ((HBRouter.HBRouterResponse) -> Void)? = nil, callBack: ((Any?) -> Void)? = nil) -> Any?
public func open(urlPattern: HBRouter.routerURLPattern, completion: ((HBRouter.HBRouterResponse) -> Void)? = nil, callBack: ((Any?) -> Void)? = nil) -> Any?
public func open(urlPattern: HBRouter.routerURLPattern, params: [String : Any]) -> Any?
public func open(urlPattern: HBRouter.routerURLPattern, params: [String : Any], completion: ((HBRouter.HBRouterResponse) -> Void)? = nil, callBack: ((Any?) -> Void)? = nil) -> Any?
public func open(action: HBRouter.HBRouterAction) -> Any?
public func open(action: HBRouter.HBRouterAction, params: [String : Any]) -> Any?
public func open(path: HBRouter.routerPath) -> Any?
public func open(path: HBRouter.routerPath, params: [String : Any] = [:]) -> Any?
public func open(path: HBRouter.routerPath, params: [String : Any] = [:], completion: ((HBRouter.HBRouterResponse) -> Void)? = nil, callBack: ((Any?) -> Void)? = nil) -> Any?

//查询栈内匹配到相关页面
override public func matchPages(_ action: HBRouter.HBRouterAction) -> [UIViewController]?

//回退到栈内匹配到的页面
override public func pop2Path(_ path: HBRouter.routerPath, params: [String : Any] = [:], completion: ((Bool) -> Void)? = nil) -> [UIViewController]?
override public func pop2Action(_ action: HBRouter.HBRouterAction, completion: ((Bool) -> Void)? = nil) -> [UIViewController]?
override public func pop2URL(_ url: URL, params: [String : Any] = [:], completion: ((Bool) -> Void)? = nil) -> [UIViewController]?

/// 关闭栈内路由匹配成功的控制器,如果只有一个根控制器,则不返回
/// - Parameter path: 路由 path
/// - Returns: 被移除的控制器
override public func closePage(path: HBRouter.routerPath) -> [UIViewController]?

/// 关闭导航栈中匹配到的路由
/// - Parameter urlPattern: hb://router.com/path
/// - Returns: 返回被关闭的控制器
override public func closePage(urlPattern: HBRouter.routerURLPattern) -> [UIViewController]?

路由模型:

@objc public enum HBRouterOption : Int {

    case push = 0  //导航栈 push

    case present   // present 到新的导航栈

    case wrap_nc   // present 页面时是否添加导航控制器

    case fullScreen  // iOS13 是否强制全屏
}


//路由打开成功时返回模型对象
@objcMembers public class HBRouterResponse : NSObject {

    public private(set) var code: Int { get }

    public private(set) var msg: String { get }

    public private(set) var data: Any? { get }

    public private(set) var action: HBRouter.HBRouterAction { get }

    @objc public init(_ action: HBRouter.HBRouterAction, data: Any? = nil, msg: String = "", code: Int = 0)
}
    
//Target 对象
@objcMembers open class HBRouterTarget : NSObject {

    public var scheme: String

    public var host: String

    public var path: String

    public var target: String

    public var targetClass: AnyClass?

    public var bundle: String

    public var url: URL?

    public func routerURLPattern() -> HBRouter.routerURLPattern

    public var targetType: HBRouter.HBTargetType

    /// 规则定义
    /// - Parameters:
    ///   - scheme: hb://  & hb   &   https://  & http
    ///   - host: router.com
    ///   - path: /home/page/detail
    ///   - target: 目标类
    ///   - bundle: 目标类所在库的库名
    ///   - targetType: 目标类能力类型
    public init(scheme: String, host: String, path: String, target: String, bundle: String, targetType: HBRouter.HBTargetType = .undefined)

    public init(path: String, target: String, bundle: String)

    public init(path: String, target: String)
}


    //router 类型
    @objc public enum HBTargetType : Int {

        case undefined = 0

        case controller = 1

        case flutter = 2

        case bridge = 3
    }

UIViewController 扩展

 //router item 数据源
 @objc public private(set) var routeAction: HBRouter.HBRouterAction?
 //路由 path
 @objc public private(set) var routeURLPattern: String?

 //手动设置 action
 @objc public func setRouterAction(_ routeAction: HBRouter.HBRouterAction)  
 /// 控制器内处理 action 回调
 /// - Parameter action: action 参数
 /// - Returns: 判断是否可以打开页面 false 时,不能打开该页面
 @objc open func handleRouterAction(_ action: HBRouter.HBRouterAction) -> Bool

 @objc open class func needsLogin(_ action: HBRouter.HBRouterAction) -> Bool

 /// 栈内单例是否唯一:
 /// - Parameter
 @objc open class func isSingleton(_ action: HBRouter.HBRouterAction) -> Bool

 //是否支持侧滑返回
 @objc open func canSlideBack() -> Bool

1721 次点击
所在节点    iOS
1 条回复
sasukiki
2022-02-24 16:08:16 +08:00
支持一个

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/836158

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX