這篇文章主要為大家展示了“iOS模塊化之JLRoute路由的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“iOS模塊化之JLRoute路由的示例分析”這篇文章吧。
在軹城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需求定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都營銷網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),軹城網(wǎng)站建設(shè)費(fèi)用合理。JLRoutes是一個(gè)調(diào)用極少代碼 , 可以很方便的處理不同URL schemes以及解析它們的參數(shù),并通過回調(diào)block來處理URL對應(yīng)的操作 , 可以用于處理復(fù)雜跳轉(zhuǎn)邏輯的三方庫.
1.在日常開發(fā)中 , push , present 出現(xiàn)在整個(gè)程序的各個(gè)地方 , 如果你想快速理清一個(gè)項(xiàng)目的整體邏輯 , 非常麻煩 . 大多數(shù)情況 , 你得找到代碼目錄 ,根據(jù)層級結(jié)構(gòu)分出關(guān)系 , 然后找到對應(yīng)的push位置 , 尋找下一級頁面 , 如果本身項(xiàng)目的目錄就非常亂 , 那么如果要了解一個(gè)項(xiàng)目的整體跳轉(zhuǎn)邏輯 , 非常的難.
即便可以將 UIViewController-Swizzled 庫集成到項(xiàng)目中 ,然后一頁一頁點(diǎn)擊查詢 , 但也是比較痛苦的.
如果 , 是把整個(gè)項(xiàng)目的跳轉(zhuǎn)邏輯都給抽取出來 , 單獨(dú)放在一個(gè)類 , 模塊化管理 , 那么思路就會清晰很多 , 甚至可以用XMind根據(jù)代碼畫出整個(gè)項(xiàng)目的樹狀圖
2.如果所處公司存在多個(gè)app , app之間互相推薦 , 互相跳轉(zhuǎn)是再正常不過的需求,就類似于QQ , 微信三方分享跳轉(zhuǎn)等 .如果用Appdelegate原生方法進(jìn)行攔截 , 所做的事至少得是判斷Scheme是否匹配 , 想辦法進(jìn)入需要跳到的界面 , 如果要涉及傳參 , 就更加麻煩.
3. 如果用戶是從PC端識別二維碼,或者通過鏈接想要進(jìn)入app指定頁面
基于 JLRoute 實(shí)現(xiàn)的模塊化示例,包括鏈接跳轉(zhuǎn)原生頁面、WebView頁面和ReactNative頁面
模塊化已經(jīng)成為調(diào)劑龐大項(xiàng)目結(jié)構(gòu)的一劑良藥,對項(xiàng)目的開發(fā)、維護(hù)和后續(xù)的擴(kuò)展的好處已經(jīng)不言而喻。
要求
iOS 8.0+
Xcode 7.0+
安裝方法
安裝
在 iOS, 你需要在 Podfile 中添加.
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '9.0' use_frameworks! pod 'JLRoutes', '~> 2.0.1' # 'node_modules'目錄一般位于根目錄中 # 但是如果你的結(jié)構(gòu)不同,那你就要根據(jù)實(shí)際路徑修改下面的`:path` pod 'React', :path => './node_modules/react-native', :subspecs => [ 'Core', 'RCTText', 'RCTNetwork', 'RCTWebSocket', # 這個(gè)模塊是用于調(diào)試功能的 # 在這里繼續(xù)添加你所需要的模塊 ] # 如果你的RN版本 >= 0.42.0,請加入下面這行 pod "Yoga", :path => "./node_modules/react-native/ReactCommon/yoga"
啟動 ReactNative 環(huán)境
1.修改項(xiàng)目ModuleARNPageViewController.m IP 跳轉(zhuǎn)地址
2.進(jìn)入項(xiàng)目所在目錄,運(yùn)行
npm start
JLRoutes的工作流程和原理
單一的Scheme注冊過程:
1.調(diào)用注冊方法(用戶注冊routePattern,默認(rèn)優(yōu)先級0)
復(fù)制代碼 代碼如下:
- (void)addRoute:(NSString *)routePattern handler:(BOOL (^__nullable)(NSDictionary
2.路由解析(這些解析跟我們設(shè)置路由的規(guī)則有直接關(guān)系)
(1)判斷接口URL是否設(shè)置可選性URL并將對應(yīng)的URL封裝成JLRRouteDefinition對象
(2)將JLRRouteDefinition對象裝載進(jìn)一個(gè)可變數(shù)組,內(nèi)存保留了所有的對象!!
(JLRRouteDefinition對象包括有路徑,參數(shù)解析,block等信息)
單一的Scheme調(diào)用過程:
1.調(diào)用URL
+ (BOOL)routeURL:(NSURL *)URL
2.解析URL,將參數(shù),路由信息封裝成JLRRouteRequest對象
復(fù)制代碼 代碼如下:
- (instancetype)initWithURL:(NSURL *)URL alwaysTreatsHostAsPathComponent:(BOOL)alwaysTreatsHostAsPathComponent
3.給JLrouteRequest對象和路由數(shù)組里的JLRRouteDefinition對象作比對,并且返回JLRRouteResponse 對象抽出參數(shù)和URL在數(shù)組里
復(fù)制代碼 代碼如下:
JLRRouteResponse *response = [route routeResponseForRequest:request decodePlusSymbols:shouldDecodePlusSymbols];
4.調(diào)用JLRRouteResponse 對象里面的回調(diào)方法
[route callHandlerBlockWithParameters:finalParameters];
JLRoutes的URL注冊規(guī)則:
1.普通注冊
JLRoutes *routes = [JLRoutes globalRoutes]; [routes addRoute:@"/user/view/:userID" handler:^BOOL(NSDictionary *parameters) { NSString *userID = parameters[@"userID"]; // defined in the route by specifying ":userID" // present UI for viewing user with ID 'userID' return YES; // return YES to say we have handled the route }];
URL里,分號表示這個(gè)是參數(shù)
另外一種注冊方式,下標(biāo)注冊法
JLRoutes.globalRoutes[@"/route/:param"] = ^BOOL(NSDictionary *parameters) { // ... };
如何按照以上的方式注冊,在任何時(shí)刻(包括在其它的APP)你都可以調(diào)用這個(gè)URL。
NSURL *viewUserURL = [NSURL URLWithString:@"myapp://user/view/joeldev"]; [[UIApplication sharedApplication] openURL:viewUserURL];
在這個(gè)例子中,在parmameters字典里面的userID會傳給block,它是一個(gè)鍵值對。”userID”: “joeldev”。給UI層或者任何需要它的地方用的。
字典參數(shù):
字典參數(shù)總包括至少一下3個(gè)鍵:
{ "JLRouteURL": "(the NSURL that caused this block to be fired)", "JLRoutePattern": "(the actual route pattern string)", "JLRouteScheme": "(the route scheme, defaults to JLRoutesGlobalRoutesScheme)" }
處理Block
你會發(fā)現(xiàn),每個(gè)注冊的block都會返回一個(gè)YES。這個(gè)值,如果你返回NO,JLRoutes會跳過這個(gè)匹配,然后繼續(xù)去匹配其它的。
如果你的block設(shè)置成nil,它會默認(rèn)返回YES。
2.復(fù)雜注冊
[[JLRoutes globalRoutes] addRoute:@"/:object/:action/:primaryKey" handler:^BOOL(NSDictionary *parameters) { NSString *object = parameters[@"object"]; NSString *action = parameters[@"action"]; NSString *primaryKey = parameters[@"primaryKey"]; // stuff return YES; }];
這個(gè)地址會被匹配很多URL,如/user/view/joeldev or /post/edit/123。這些URL上的是參數(shù)。
NSURL *editPost = [NSURL URLWithString:@"myapp://post/edit/123?debug=true&foo=bar"]; [[UIApplication sharedApplication] openURL:editPost];
這時(shí),pramater字典就會是以下這樣的(傳參)
{ "object": "post", "action": "edit", "primaryKey": "123", "debug": "true", "foo": "bar", "JLRouteURL": "myapp://post/edit/123?debug=true&foo=bar", "JLRoutePattern": "/:object/:action/:primaryKey", "JLRouteScheme": "JLRoutesGlobalRoutesScheme" }
3.Scheme(有沒有多態(tài)的感覺)
JLRoutes支持用指定的URL scheme來創(chuàng)建路由。相同的scheme才能被匹配。默認(rèn)地,所有的URL會設(shè)置進(jìn)global scheme。
[[JLRoutes globalRoutes] addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) { // This block is called if the scheme is not 'thing' or 'stuff' (see below) return YES; }]; [[JLRoutes routesForScheme:@"thing"] addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) { // This block is called for thing://foo return YES; }]; [[JLRoutes routesForScheme:@"stuff"] addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) { // This block is called for stuff://foo return YES; }]; 如果你調(diào)用的使用,是這樣調(diào)用的 [[JLRoutes globalRoutes] addRoute:@"/global" handler:^BOOL(NSDictionary *parameters) { return YES; }];
它只會調(diào)用global scheme的對應(yīng)的URL。不會調(diào)用ting scheme里面對應(yīng)的URL。
當(dāng)然,你可以設(shè)置,如果指定的scheme沒有這個(gè)URL,去查詢global scheme 有沒有。你需要設(shè)置一個(gè)屬性。
[JLRoutes routesForScheme:@"thing"].shouldFallbackToGlobalRoutes = YES;
3.通配符的設(shè)置URL的方式
通配符為:*
通配符符后面所有的URL上的參數(shù)都會以一個(gè)數(shù)組保存在parameters字典里面的JLRouteWildcardComponentsKey對應(yīng)的value里。
例如,如果你注冊URL如下:
[[JLRoutes globalRoutes] addRoute:@"/wildcard/*" handler:^BOOL(NSDictionary *parameters) { NSArray *pathComponents = parameters[JLRouteWildcardComponentsKey]; if ([pathComponents count] > 0 && [pathComponents[0] isEqualToString:@"joker"]) { // the route matched; do stuff return YES; } // not interested unless the joker's in it return NO; }];
如果調(diào)用的URL開始是/wildcard,這個(gè)路由就可能被觸發(fā)??!如果第一個(gè)參數(shù)是joker,就被觸發(fā),如果不是,就被拒絕觸發(fā)。。。
4.選擇性路由
如果路由地址設(shè)置樣式有括號,如:/the(/foo/:a)(/bar/:b),其實(shí)它代表的URL有如下:
/the/foo/:a/bar/:b /the/foo/:a /the/bar/:b /the
5.查詢 Routes
下面的方式,你可以查看Routes里所有注冊的URL Routes。
/// All registered routes, keyed by scheme + (NSDictionary*> *)allRoutes; /// Return all registered routes in the receiving scheme namespace. - (NSArray *)routes;
自定義路由解析 如果你想自己定制一個(gè)路由編輯,你可以繼承JLRouteDefinition并且用 addRoute:方法去添加你自定義類的對象。
以上是“iOS模塊化之JLRoute路由的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。