iOS 모듈 화 된 JLRoute 경로 예제

8935 단어 iOSJLRoute
JLRoutes 는 호출 이 매우 적은 코드 로 서로 다른 URL schemes 를 편리 하 게 처리 하고 그들의 인 자 를 분석 할 수 있 으 며,리 셋 block 을 통 해 URL 에 대응 하 는 조작 을 처리 하여 복잡 한 점프 논 리 를 처리 하 는 3 자 라 이브 러 리 에 사용 할 수 있 습 니 다.
1.일상적인 개발 에서 push,present 는 전체 프로그램의 여러 곳 에 나타 납 니 다.한 프로젝트 의 전체적인 논 리 를 신속하게 정리 하려 면 매우 번 거 롭 습 니 다.대부분의 경우 코드 디 렉 터 리 를 찾 아 등급 구조 에 따라 관 계 를 나 눈 다음 에 해당 하 는 push 위 치 를 찾 아 다음 단계 페이지 를 찾 아야 합 니 다.만약 에 자체 프로젝트 의 디 렉 터 리 가 매우 복잡 하 다 면.그렇다면 한 종목 의 전체적인 점프 논 리 를 이해 하기 란 매우 어렵다.
UIViewController-Swizzled 라 이브 러 리 를 프로젝트 에 통합 한 후 한 페이지 한 페이지 조회 할 수 있 지만 고 통 스 럽 습 니 다.
만약 에 전체 프로젝트 의 전환 논 리 를 모두 추출 하여 하나의 유형 에 따로 놓 고 모듈 화 관 리 를 한다 면 생각 이 뚜렷 해 지고 심지어 Xmind 로 코드 에 따라 전체 프로젝트 의 트 리 그림 을 그 릴 수 있 습 니 다.
2.만약 에 회사 에 여러 개의 app 이 존재 한다 면 app 간 에 서로 추천 하고 서로 이동 하 는 것 이 정상 적 인 수요 라면 QQ,위 챗 3 자 공유 점프 등 과 유사 합 니 다.만약 에 Appdelegate 원생 방법 으로 차단 하면 하 는 일 은 적어도 Scheme 이 일치 하 는 지 판단 하고 뛰 어야 할 인터페이스 에 들 어 가 는 방법 을 생각해 야 합 니 다.만약 에 전달 과 관련 되 려 면 더욱 번 거 롭 습 니 다.
3.사용자 가 PC 에서 QR 코드 를 식별 하거나 링크 를 통 해 app 지정 페이지 에 들 어 가 려 면
JLRoute 를 기반 으로 하 는 모듈 화 예제 로 링크 가 원생 페이지 로 이동 하 는 것,WebView 페이지 와 ReactNative 페이지 를 포함한다.
모듈 화 는 이미 거대 한 프로젝트 구 조 를 조절 하 는 좋 은 약이 되 었 고 프로젝트 의 개발,유지 와 후속 적 인 확장 에 대한 장점 은 이미 말 하지 않 아 도 안다.
요구 하 다.
  • 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"
    
    
    ReactNative 환경 시작
    1.프로젝트 모듈 ARNPageViewController.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)JLRRoute Definition 대상 을 가 변 배열 에 불 러 옵 니 다.메모리 에 모든 대상 이 남아 있 습 니 다!!
    (JLRRoute Definition 대상 은 경로,파라미터 분석,block 등 정 보 를 포함한다)
    단일 Scheme 호출 과정:
    1.URL 호출
    
    + (BOOL)routeURL:(NSURL *)URL
    2.URL 을 분석 하고 인자,루트 정 보 를 JLRRouteRequest 대상 으로 봉인

    - (instancetype)initWithURL:(NSURL *)URL alwaysTreatsHostAsPathComponent:(BOOL)alwaysTreatsHostAsPathComponent
    3.JLRouteRequest 대상 과 루트 그룹 에 있 는 JLRRoute Definition 대상 을 비교 하고 JLRRoute Response 대상 에 게 인자 와 URL 을 추출 하여 그룹 에 되 돌려 줍 니 다

    JLRRouteResponse *response = [route routeResponseForRequest:request decodePlusSymbols:shouldDecodePlusSymbols];
    4.JLRRoute Response 대상 의 리 셋 방법 호출
    
    [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) {
    // ...
    };
    이상 의 방식 으로 등록 하 는 방법 은 언제든지(다른 앱 포함)이 URL 을 호출 할 수 있 습 니 다.
    
    NSURL *viewUserURL = [NSURL URLWithString:@"myapp://user/view/joeldev"];
    [[UIApplication sharedApplication] openURL:viewUserURL];
    "이 예 에서 parmameters 사전 에 있 는 userID 는 block 에 전 달 됩 니 다.키 값 이 맞습니다."userID”: “joeldev”。UI 층 이나 필요 한 곳 에 사용 합 니 다.
    사전 매개 변수:
    사전 매개 변 수 는 최소 세 개의 키 를 포함 합 니 다.
    
    {
    "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 는 이 일치 하 는 것 을 건 너 뛰 고 다른 것 과 계속 일치 합 니 다.
    블록 을 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;
    }];
    이 주 소 는/user/view/joeldev or/post/edit/123 과 같은 많은 URL 과 일치 합 니 다.이 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://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 의 인 자 는 하나의 배열 로 parameters 사전 에 있 는 JLRoute Wildcard ComponentsKey 에 대응 하 는 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 로 시작 하면 이 경로 가 실 행 될 수 있 습 니 다!!첫 번 째 인자 가 joker 라면 트리거 됩 니 다.그렇지 않 으 면 트리거 를 거부 합 니 다.
    4.선택 적 루트
    만약 에 경로 설정 스타일 에 괄호 가 있다 면:/the(/foo/:a)(/bar/:b)는 다음 과 같 습 니 다.
    
    /the/foo/:a/bar/:b
    /the/foo/:a
    /the/bar/:b
    /the
    5.조회 루트
    다음 방식 으로 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;
    
    사용자 정의 루트 분석 사용자 정의 루트 편집 을 원한 다 면 JLRoute Definition 을 계승 하고 addRoute:방법 으로 사용자 정의 클래스 의 대상 을 추가 할 수 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기