iOS 모듈 화 된 JLRoute 경로 예제
1.일상적인 개발 에서 push,present 는 전체 프로그램의 여러 곳 에 나타 납 니 다.한 프로젝트 의 전체적인 논 리 를 신속하게 정리 하려 면 매우 번 거 롭 습 니 다.대부분의 경우 코드 디 렉 터 리 를 찾 아 등급 구조 에 따라 관 계 를 나 눈 다음 에 해당 하 는 push 위 치 를 찾 아 다음 단계 페이지 를 찾 아야 합 니 다.만약 에 자체 프로젝트 의 디 렉 터 리 가 매우 복잡 하 다 면.그렇다면 한 종목 의 전체적인 점프 논 리 를 이해 하기 란 매우 어렵다.
UIViewController-Swizzled 라 이브 러 리 를 프로젝트 에 통합 한 후 한 페이지 한 페이지 조회 할 수 있 지만 고 통 스 럽 습 니 다.
만약 에 전체 프로젝트 의 전환 논 리 를 모두 추출 하여 하나의 유형 에 따로 놓 고 모듈 화 관 리 를 한다 면 생각 이 뚜렷 해 지고 심지어 Xmind 로 코드 에 따라 전체 프로젝트 의 트 리 그림 을 그 릴 수 있 습 니 다.
2.만약 에 회사 에 여러 개의 app 이 존재 한다 면 app 간 에 서로 추천 하고 서로 이동 하 는 것 이 정상 적 인 수요 라면 QQ,위 챗 3 자 공유 점프 등 과 유사 합 니 다.만약 에 Appdelegate 원생 방법 으로 차단 하면 하 는 일 은 적어도 Scheme 이 일치 하 는 지 판단 하고 뛰 어야 할 인터페이스 에 들 어 가 는 방법 을 생각해 야 합 니 다.만약 에 전달 과 관련 되 려 면 더욱 번 거 롭 습 니 다.
3.사용자 가 PC 에서 QR 코드 를 식별 하거나 링크 를 통 해 app 지정 페이지 에 들 어 가 려 면
JLRoute 를 기반 으로 하 는 모듈 화 예제 로 링크 가 원생 페이지 로 이동 하 는 것,WebView 페이지 와 ReactNative 페이지 를 포함한다.
모듈 화 는 이미 거대 한 프로젝트 구 조 를 조절 하 는 좋 은 약이 되 었 고 프로젝트 의 개발,유지 와 후속 적 인 확장 에 대한 장점 은 이미 말 하지 않 아 도 안다.
요구 하 다.
설치 하 다.
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:방법 으로 사용자 정의 클래스 의 대상 을 추가 할 수 있 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.