iOSモジュール化のJLRouteルーティング例

8273 ワード

JLRoutesは、非常に簡単に異なるURL schemesを処理し、それらのパラメータを解析することができます。また、Blockをリセットすることにより、URLに対応する動作を処理します。
1.日常開発において、push、presentはプログラム全体のところに現れています。プロジェクト全体の論理を早く整理したいなら、面倒くさいです。ほとんどの場合、コードディレクトリを見つけて、階層構造によって関係を分けて、次のページを探して、自分のプロジェクトのディレクトリが非常に乱れているなら、では、プロジェクト全体のジャンプロジックを知るには、非常に難しいです。
UICView Controller-Swizledライブラリをプロジェクトに統合しても、ページをクリックして検索しても、比較的に苦しいです。
もし、プロジェクト全体のジャンプロジックを抽出して、単独で一つのクラスに置いて、モジュール化管理すれば、考えがはっきりします。XMindでコードに基づいてプロジェクト全体のツリーを描くこともできます。
2.会社に複数のアプリが存在する場合、アプリ間で推奨され、お互いにジャンプするのが正常ではないかという需要は、QQ、WeChatの三者がジャンプを共有するなどと同じです。Appdelegate原生方法でブロックすると、少なくともSchemeが合致するかどうかを判断し、何とかスキップするインターフェースに入ります。
3.ユーザーがPCからQRコードを識別する場合、またはリンクを通じてap指定ページに入りたい場合
JLRouteによるモジュール化の例としては、リンクを含めて元のページ、WebViewページ、React Nativeページにジャンプします。
モジュール化は既に膨大なプロジェクト構造を調整する一服の良薬となっており、プロジェクトの開発、保守、その後の拡張のメリットは言うまでもない。
要求
  • 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'          
    #           ,               `: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"
    
    
    React Native環境を起動します。
    1.プロジェクトModuleARNPage View Controller.m IPジャンプ先を修正する

    2.プロジェクトの所在リストに入り、実行する
    
    npm start
    JLRoutesのワークフローと原理
    単一のScheme登録プロセス:

    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オブジェクトとを照合し、JLRRouteResonseオブジェクトに戻ってパラメータとURLを抽出して配列にあります。

    JLRRouteResponse *response = [route routeResponseForRequest:request decodePlusSymbols:shouldDecodePlusSymbols];
    4.JLRROteResonseオブジェクト内のコールバック方法
    
    [route callHandlerBlockWithParameters:finalParameters];
    JLRoutesのURL登録規則:

    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":"jeldev"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)"
    }
    
    処理ブロック
    登録されたブロックごとに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"];
    // stuff
    return YES;
    }];
    このアドレスは多くのURLにマッチします。例えば/user/view/jeldev or/post/edit/123。これらのURLはパラメータです。
    
    NSURL *editPost = [NSURL URLWithString:@"myapp://post/edit/123?debug=true&foo=bar"];
    [[UIApplication sharedApplication] openURL:editPost];
    この時、pramter辞書は以下のようになります。
    
    {
    "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://foo
    return YES;
    }];
    [[JLRoutes routesForScheme:@"stuff"] addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) {
    // This block is called for stuff://foo
    return 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のパラメータはいずれもパルメテックス辞書の中のJLRoute Wild cardComponents Keyに対応する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;
    }];
    
    もし呼出されたURLが開始されたら/wildcard、このルートがトリガされます!最初のパラメータがジョーカーであればトリガされますが、そうでなければトリガを拒否されます。
    4.選択ルート
    ルートアドレスの設定パターンに括弧がある場合、例えば:/the(/foo/:a)(/bar/b)というように、その代表URLは以下の通りです。
    
    /the/foo/:a/bar/:b
    /the/foo/:a
    /the/bar/:b
    /the
    5.Routesを問い合わせる
    以下の方法では、Routesに登録されているURLを全部確認してください。
    
    /// All registered routes, keyed by scheme
    + (NSDictionary <NSString *, NSArray <JLRRouteDefinition *> *> *)allRoutes;
    /// Return all registered routes in the receiving scheme namespace.
    - (NSArray <JLRRouteDefinition *> *)routes;
    
    カスタムルート解析を自分でルート編集をカスタマイズしたいなら、JLRoute Definitionを引き継ぎ、addRouteを使うことができます。この方法でカスタムクラスのオブジェクトを追加します。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。