URLNavigator路由使用

Github地址


介紹

  • URLNavigator 是 devxoul發(fā)布在github上的一個(gè)Swift 路由庫
  • 它提供了通過 URL 導(dǎo)航到 view controller 的方式
  • 路由跳轉(zhuǎn)為的是模塊解耦
  • 如果APP業(yè)務(wù)龐大厨钻,尤其是有一些H5打開原生界面的情況下贮缅,路由是一個(gè)非常好的打開業(yè)務(wù)的方式。


安裝

pod 'URLNavigator'


項(xiàng)目中使用

原始Demo中已經(jīng)有詳細(xì)的使用介紹聘芜。但是這里我打算做一些改動(dòng),按照業(yè)務(wù)模塊解耦不皆。

  • URLNavigator的使用大致分為幾步:
    • 自定義路由URL
    • 使用Navigator注冊路由蟆技,并確認(rèn)各路由URL對應(yīng)要打開的VC或者要處理的業(yè)務(wù)
    • 使用Navigator打開路由對應(yīng)業(yè)務(wù)


1. 自定義業(yè)務(wù)路由

//首頁模塊路由
enum HomeModuleRoute: String {
    case homeRoute = "st://home"
    case caseRoute = "st://cate/<int:cateId>" 
    //case searchRoute = "st://search/<string:keyword>" //string:可以不寫,默認(rèn)都是字符串
    case searchRoute = "st://search/<keyword>"
    case commonAlert = "st://alert"
}

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


2. 定義 路由注冊器需要遵循的協(xié)議

protocol NavigationModulesProtocal {
    //遵循此協(xié)議的各 路由注冊器 都要實(shí)現(xiàn)路由注冊方法
    func initRoute(navigator: Navigator)
}


3. 實(shí)現(xiàn)各個(gè)業(yè)務(wù)模塊的路由注冊器

//首頁相關(guān)模塊 路由注冊器
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傳參時(shí)沿侈,可以獲取參數(shù)值
            let title = url.queryParameters["title"]
            let message = url.queryParameters["message"]
            print("title:", title)
            print("message:", message)
            
            //接下來可以添加彈窗了闯第,略...
            
            return true
        }
    }
}

//用戶相關(guān)模塊 路由注冊器
struct UserRouter: NavigationModulesProtocal {
    func initRoute(navigator: Navigator) {
        
        //注冊我的首頁
        navigator.register(UserModuleRoute.userHomeRoute.rawValue) { url, values, context in
            return UserHomeViewCtrl()
        }
    }
}


4. 創(chuàng)建一個(gè)Nav結(jié)構(gòu)體作為路由處理總部

  • Nav中創(chuàng)建Navigator的單例。接下來所有的路由注冊都用Navigator單例
struct Nav {
    
    static let share = Navigator()
    
    //業(yè)務(wù)路由注冊器都存入此數(shù)組缀拭,用于后續(xù)進(jìn)行統(tǒng)一注冊的初始化工作
    private static let modulesRouteArray : [NavigationModulesProtocal] = [
        HomeRouter.init(),
        UserRouter.init()
    ]
    
    //注冊所有需要用到的業(yè)務(wù)路由
    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)
        }
    }
    
    //這里是復(fù)用了原始demo中的模塊咳短,就是當(dāng)路由是web鏈接時(shí)填帽,用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. 可以測試了。但是這里要介紹一下通過路由打開業(yè)務(wù)的三種方式

  • URLNavigator的跳轉(zhuǎn)方式有三種:push咙好,present篡腌,open
  • pushpresent對應(yīng)navigator.register注冊的路由,用于打開VC
  • open對應(yīng)navigator.handle注冊的路由勾效,用于其他功能:譬如打開彈窗等
//常規(guī)打開方式
Nav.share.push(UserModuleRouter.userHomeRouter.rawValue)
Nav.share.present(UserModuleRouter.userHomeRouter.rawValue)

//也可以通過 context 傳參數(shù)嘹悼。設(shè)置from從哪個(gè)界面跳轉(zhuǎn),不設(shè)置默認(rèn)從當(dāng)前控制器跳轉(zhuǎn)
Nav.share.push(UserModuleRouter.userHomeRouter.rawValue, context: ["param1":"123"], from: nil, animated: true)
//還可以使用它的直接打開控制器的方法
func pushViewController(_ viewController: UIViewController, from: UINavigationControllerType?, animated: Bool) -> UIViewController?
//有時(shí)候需要傳參层宫,可能就要使用路由的字符串字面量了杨伙。有沒有更好的辦法?可以留言指點(diǎn)萌腿,thanks~
Nav.share.push("st://cate/1000")


//打印結(jié)果:
url: st://cate/1000
values: ["cateId": 1000]
context nil
//有時(shí)候需要傳參限匣,可能就要使用路由的字符串字面量了。有沒有更好的辦法毁菱?可以留言指點(diǎn)米死,thanks~
Nav.share.push("st://home?title=溫馨提示&message=內(nèi)容", context: ["param1":"111"])

//打印結(jié)果:
url: st://home?title=溫馨提示&message=內(nèi)容
values: [:]
context Optional(["param1": "111"])
title: Optional("溫馨提示")
message: Optional("內(nèi)容")
//使用open方式打開
Nav.share.open("st://alert?title=溫馨提示&message=內(nèi)容", context: ["param1":"111"])


//打印結(jié)果:
url: st://home?title=溫馨提示&message=內(nèi)容
values: [:]
context Optional(["param1": "111"])
title: Optional("溫馨提示")
message: Optional("內(nèi)容")





?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贮庞,隨后出現(xiàn)的幾起案子峦筒,更是在濱河造成了極大的恐慌,老刑警劉巖贸伐,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勘天,死亡現(xiàn)場離奇詭異,居然都是意外死亡捉邢,警方通過查閱死者的電腦和手機(jī)脯丝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伏伐,“玉大人宠进,你說我怎么就攤上這事∶牯幔” “怎么了材蹬?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吝镣。 經(jīng)常有香客問我堤器,道長,這世上最難降的妖魔是什么末贾? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任闸溃,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辉川。我一直安慰自己表蝙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布乓旗。 她就那樣靜靜地躺著府蛇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屿愚。 梳的紋絲不亂的頭發(fā)上汇跨,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機(jī)與錄音妆距,去河邊找鬼扰法。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毅厚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浦箱,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼吸耿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酷窥?” 一聲冷哼從身側(cè)響起咽安,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蓬推,沒想到半個(gè)月后妆棒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沸伏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年糕珊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毅糟。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡红选,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姆另,到底是詐尸還是另有隱情喇肋,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布迹辐,位于F島的核電站蝶防,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏明吩。R本人自食惡果不足惜间学,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菱鸥,春花似錦宗兼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹊漠,卻和暖如春主到,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躯概。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工登钥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娶靡。 一個(gè)月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓牧牢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姿锭。 傳聞我的和親對象是個(gè)殘疾皇子塔鳍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容