URLNavigator路由使用

Github地址


介绍

  • URLNavigator 是 devxoul发布在github上的一个Swift 路由库
  • 它提供了通过 URL 导航到 view controller 的方式
  • 路由跳转为的是模块解耦
  • 如果APP业务庞大,尤其是有一些H5打开原生界面的情况下,路由是一个非常好的打开业务的方式。


安装

pod 'URLNavigator'


项目中使用

原始Demo中已经有详细的使用介绍。但是这里我打算做一些改动,按照业务模块解耦。

  • URLNavigator的使用大致分为几步:
    • 自定义路由URL
    • 使用Navigator注册路由,并确认各路由URL对应要打开的VC或者要处理的业务
    • 使用Navigator打开路由对应业务


1. 自定义业务路由

//首页模块路由
enum HomeModuleRoute: String {
    case homeRoute = "st://home"
    case caseRoute = "st://cate/<int:cateId>" 
    //case searchRoute = "st://search/<string:keyword>" //string:可以不写,默认都是字符串
    case searchRoute = "st://search/<keyword>"
    case commonAlert = "st://alert"
}

//用户模块路由
enum UserModuleRoute: String {
    case userHomeRoute = "st://userHome"
}


2. 定义 路由注册器需要遵循的协议

protocol NavigationModulesProtocal {
    //遵循此协议的各 路由注册器 都要实现路由注册方法
    func initRoute(navigator: Navigator)
}


3. 实现各个业务模块的路由注册器

//首页相关模块 路由注册器
struct HomeRouter: NavigationModulesProtocal {
    func initRoute(navigator: Navigator) {
        
        //注册首页
        navigator.register(HomeModuleRoute.homeRoute.rawValue) { url, values, context in
            print("url:", url)
            print("values:", values)
            print("context", context)
            
            return HomeViewCtrl()
        }
        
        navigator.register(HomeModuleRoute.caseRoute.rawValue) { url, values, context in
            print("url:", url)
            print("values:", values)
            print("context", context)
            
            return CateViewCtrl()
        }
        
        navigator.register(HomeModuleRoute.searchRoute.rawValue) { url, values, context in
            print("url:", url)
            print("values:", values)
            print("context", context)
            
            return SearchViewCtrl()
        }

        
        navigator.handle(HomeModuleRoute.commonAlert.rawValue) { url, values, context in
            print("url:", url)
            print("values:", values)
            print("context", context)
            
            //通过url传参时,可以获取参数值
            let title = url.queryParameters["title"]
            let message = url.queryParameters["message"]
            print("title:", title)
            print("message:", message)
            
            //接下来可以添加弹窗了,略...
            
            return true
        }
    }
}

//用户相关模块 路由注册器
struct UserRouter: NavigationModulesProtocal {
    func initRoute(navigator: Navigator) {
        
        //注册我的首页
        navigator.register(UserModuleRoute.userHomeRoute.rawValue) { url, values, context in
            return UserHomeViewCtrl()
        }
    }
}


4. 创建一个Nav结构体作为路由处理总部

  • Nav中创建Navigator的单例。接下来所有的路由注册都用Navigator单例
struct Nav {
    
    static let share = Navigator()
    
    //业务路由注册器都存入此数组,用于后续进行统一注册的初始化工作
    private static let modulesRouteArray : [NavigationModulesProtocal] = [
        HomeRouter.init(),
        UserRouter.init()
    ]
    
    //注册所有需要用到的业务路由
    static func initBusiness() {
        self.share.register("http://<path:_>", self.webViewControllerFactory)
        self.share.register("https://<path:_>", self.webViewControllerFactory)
        
        //这里初始化所有的模块的路由注册
        for router in modulesRouteArray {
            router.initRoute(navigator: self.share)
        }
    }
    
    //这里是复用了原始demo中的模块,就是当路由是web链接时,用webview打开
    private static func webViewControllerFactory(url: URLConvertible, values: [String: Any], context: Any?) -> UIViewController? {
        guard let url = url.urlValue else {
            return nil
        }
        return SFSafariViewController(url: url)
    }
}


5. 初始化路由

  • 可以在AppDelegate.swift中初始化
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
    Nav.initBusiness()
    return true
}


6. 可以测试了。但是这里要介绍一下通过路由打开业务的三种方式

  • URLNavigator的跳转方式有三种:pushpresentopen
  • pushpresent对应navigator.register注册的路由,用于打开VC
  • open对应navigator.handle注册的路由,用于其他功能:譬如打开弹窗等
//常规打开方式
Nav.share.push(UserModuleRouter.userHomeRouter.rawValue)
Nav.share.present(UserModuleRouter.userHomeRouter.rawValue)

//也可以通过 context 传参数。设置from从哪个界面跳转,不设置默认从当前控制器跳转
Nav.share.push(UserModuleRouter.userHomeRouter.rawValue, context: ["param1":"123"], from: nil, animated: true)
//还可以使用它的直接打开控制器的方法
func pushViewController(_ viewController: UIViewController, from: UINavigationControllerType?, animated: Bool) -> UIViewController?
//有时候需要传参,可能就要使用路由的字符串字面量了。有没有更好的办法?可以留言指点,thanks~
Nav.share.push("st://cate/1000")


//打印结果:
url: st://cate/1000
values: ["cateId": 1000]
context nil
//有时候需要传参,可能就要使用路由的字符串字面量了。有没有更好的办法?可以留言指点,thanks~
Nav.share.push("st://home?title=温馨提示&message=内容", context: ["param1":"111"])

//打印结果:
url: st://home?title=温馨提示&message=内容
values: [:]
context Optional(["param1": "111"])
title: Optional("温馨提示")
message: Optional("内容")
//使用open方式打开
Nav.share.open("st://alert?title=温馨提示&message=内容", context: ["param1":"111"])


//打印结果:
url: st://home?title=温馨提示&message=内容
values: [:]
context Optional(["param1": "111"])
title: Optional("温馨提示")
message: Optional("内容")





©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容