麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > iOS > 正文

iOS 模塊化之JLRoute路由示例

2019-10-21 18:41:42
字體:
來源:轉載
供稿:網友

JLRoutes是一個調用極少代碼 , 可以很方便的處理不同URL schemes以及解析它們的參數,并通過回調block來處理URL對應的操作 , 可以用于處理復雜跳轉邏輯的三方庫.

1.在日常開發中 , push , present 出現在整個程序的各個地方 , 如果你想快速理清一個項目的整體邏輯 , 非常麻煩 . 大多數情況 , 你得找到代碼目錄 ,根據層級結構分出關系 , 然后找到對應的push位置 , 尋找下一級頁面 , 如果本身項目的目錄就非常亂 , 那么如果要了解一個項目的整體跳轉邏輯 , 非常的難.

即便可以將 UIViewController-Swizzled 庫集成到項目中 ,然后一頁一頁點擊查詢 , 但也是比較痛苦的.

如果 , 是把整個項目的跳轉邏輯都給抽取出來 , 單獨放在一個類 , 模塊化管理 , 那么思路就會清晰很多 , 甚至可以用XMind根據代碼畫出整個項目的樹狀圖

2.如果所處公司存在多個app , app之間互相推薦 , 互相跳轉是再正常不過的需求,就類似于QQ , 微信三方分享跳轉等 .如果用Appdelegate原生方法進行攔截 , 所做的事至少得是判斷Scheme是否匹配 , 想辦法進入需要跳到的界面 , 如果要涉及傳參 , 就更加麻煩.

3. 如果用戶是從PC端識別二維碼,或者通過鏈接想要進入app指定頁面

基于 JLRoute 實現的模塊化示例,包括鏈接跳轉原生頁面、WebView頁面和ReactNative頁面

模塊化已經成為調劑龐大項目結構的一劑良藥,對項目的開發、維護和后續的擴展的好處已經不言而喻。

要求

  1. iOS 8.0+
  2. 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'目錄一般位于根目錄中# 但是如果你的結構不同,那你就要根據實際路徑修改下面的`:path`pod 'React', :path => './node_modules/react-native', :subspecs => [  'Core',  'RCTText',  'RCTNetwork',  'RCTWebSocket', # 這個模塊是用于調試功能的  # 在這里繼續添加你所需要的模塊]# 如果你的RN版本 >= 0.42.0,請加入下面這行pod "Yoga", :path => "./node_modules/react-native/ReactCommon/yoga"

啟動 ReactNative 環境

1.修改項目ModuleARNPageViewController.m IP 跳轉地址

iOS,JLRoute路由,JLRoute

2.進入項目所在目錄,運行

npm start

JLRoutes的工作流程和原理

單一的Scheme注冊過程:

iOS,JLRoute路由,JLRoute

1.調用注冊方法(用戶注冊routePattern,默認優先級0)

 

復制代碼 代碼如下:

- (void)addRoute:(NSString *)routePattern handler:(BOOL (^__nullable)(NSDictionary<NSString *, id> *parameters))handlerBlock;

 

2.路由解析(這些解析跟我們設置路由的規則有直接關系)

(1)判斷接口URL是否設置可選性URL并將對應的URL封裝成JLRRouteDefinition對象

(2)將JLRRouteDefinition對象裝載進一個可變數組,內存保留了所有的對象!!

(JLRRouteDefinition對象包括有路徑,參數解析,block等信息)

單一的Scheme調用過程:

1.調用URL

+ (BOOL)routeURL:(NSURL *)URL

2.解析URL,將參數,路由信息封裝成JLRRouteRequest對象

 

復制代碼 代碼如下:

- (instancetype)initWithURL:(NSURL *)URL alwaysTreatsHostAsPathComponent:(BOOL)alwaysTreatsHostAsPathComponent

 

3.給JLrouteRequest對象和路由數組里的JLRRouteDefinition對象作比對,并且返回JLRRouteResponse 對象抽出參數和URL在數組里

 

復制代碼 代碼如下:

JLRRouteResponse *response = [route routeResponseForRequest:request decodePlusSymbols:shouldDecodePlusSymbols];

 

4.調用JLRRouteResponse 對象里面的回調方法

[route callHandlerBlockWithParameters:finalParameters];

JLRoutes的URL注冊規則:

iOS,JLRoute路由,JLRoute

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里,分號表示這個是參數

另外一種注冊方式,下標注冊法

JLRoutes.globalRoutes[@"/route/:param"] = ^BOOL(NSDictionary *parameters) {// ...};

如何按照以上的方式注冊,在任何時刻(包括在其它的APP)你都可以調用這個URL。

NSURL *viewUserURL = [NSURL URLWithString:@"myapp://user/view/joeldev"];[[UIApplication sharedApplication] openURL:viewUserURL];

在這個例子中,在parmameters字典里面的userID會傳給block,它是一個鍵值對。”userID”: “joeldev”。給UI層或者任何需要它的地方用的。

字典參數:

字典參數總包括至少一下3個鍵:

{"JLRouteURL": "(the NSURL that caused this block to be fired)","JLRoutePattern": "(the actual route pattern string)","JLRouteScheme": "(the route scheme, defaults to JLRoutesGlobalRoutesScheme)"}

處理Block

你會發現,每個注冊的block都會返回一個YES。這個值,如果你返回NO,JLRoutes會跳過這個匹配,然后繼續去匹配其它的。

如果你的block設置成nil,它會默認返回YES。

2.復雜注冊

[[JLRoutes globalRoutes] addRoute:@"/:object/:action/:primaryKey" handler:^BOOL(NSDictionary *parameters) {NSString *object = parameters[@"object"];NSString *action = parameters[@"action"];NSString *primaryKey = parameters[@"primaryKey"];// stuffreturn YES;}];

這個地址會被匹配很多URL,如/user/view/joeldev or /post/edit/123。這些URL上的是參數。

NSURL *editPost = [NSURL URLWithString:@"myapp://post/edit/123?debug=true&foo=bar"];[[UIApplication sharedApplication] openURL:editPost];

這時,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(有沒有多態的感覺)

JLRoutes支持用指定的URL scheme來創建路由。相同的scheme才能被匹配。默認地,所有的URL會設置進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://fooreturn YES;}];[[JLRoutes routesForScheme:@"stuff"] addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) {// This block is called for stuff://fooreturn YES;}];如果你調用的使用,是這樣調用的[[JLRoutes globalRoutes] addRoute:@"/global" handler:^BOOL(NSDictionary *parameters) {return YES;}];

它只會調用global scheme的對應的URL。不會調用ting scheme里面對應的URL。

當然,你可以設置,如果指定的scheme沒有這個URL,去查詢global scheme 有沒有。你需要設置一個屬性。

[JLRoutes routesForScheme:@"thing"].shouldFallbackToGlobalRoutes = YES;

3.通配符的設置URL的方式

通配符為:*

通配符符后面所有的URL上的參數都會以一個數組保存在parameters字典里面的JLRouteWildcardComponentsKey對應的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 stuffreturn YES;}// not interested unless the joker's in itreturn NO;}];

如果調用的URL開始是/wildcard,這個路由就可能被觸發!!如果第一個參數是joker,就被觸發,如果不是,就被拒絕觸發。。。

4.選擇性路由

如果路由地址設置樣式有括號,如:/the(/foo/:a)(/bar/:b),其實它代表的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 <NSString *, NSArray <JLRRouteDefinition *> *> *)allRoutes;/// Return all registered routes in the receiving scheme namespace.- (NSArray <JLRRouteDefinition *> *)routes;

自定義路由解析 如果你想自己定制一個路由編輯,你可以繼承JLRouteDefinition并且用 addRoute:方法去添加你自定義類的對象。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 97视频| 精品午夜影院 | 午夜视频在线免费观看 | 亚洲成人福利在线 | 一本色道久久综合狠狠躁篇适合什么人看 | 欧美成人一区二区视频 | 国产麻豆交换夫妇 | 极品销魂一区二区三区 | 精品69人人人人 | 日产精品久久久一区二区福利 | 成人福利在线播放 | 国产精品久久久久久久久久久久午夜 | 怦然心动50免费完整版 | 91精品国产综合久久久欧美 | 亚洲国产精品一区二区精品 | 日本成人一区 | 国产精品一区99 | 日本一区二区视频在线观看 | 国产免费观看视频 | 一级看片免费视频 | 国产在线精品91 | 黑人一区二区三区四区五区 | h视频在线播放 | 538任你躁在线精品视频网站 | 少妇一级淫片高潮流水电影 | 国产羞羞视频在线观看 | 国产精品99久久久久久久vr | 成人免费av在线播放 | 在线高清中文字幕 | 日本中文字幕久久 | 成人18网站 | 久久久久久久久久久av | 国产无遮挡一区二区三区毛片日本 | 在线播放亚洲 | 欧美精品在线视频观看 | 国产九色在线观看 | 国产毛片视频 | 91羞羞| 免费一级在线视频 | 牛牛a级毛片在线播放 | 国产老师做www爽爽爽视频 |