1. 程式人生 > >從外部跳轉到自己的app,並且根據引數不同做不同的操作

從外部跳轉到自己的app,並且根據引數不同做不同的操作

簡介:不發版本能夠切換是灰度環境還是線上環境,為了解決這個問題,所做的事情;同理這個方法也可以做一些跳轉和開啟的操作

準備:

在plist 裡面新增 : 裡面放入bundleid ,放入跳轉時候的協議名字

<dict>
			<key>CFBundleURLName</key>
			<string>你的app的bundle ID</string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>weejinfu801</string>  
			</array>
</dict>

外部URL樣式:

操作內容    weejinfu801://?action=eve&ps=801325&sw=999
網頁    114.112.70.156:8002/user/checkenv  (對內的操作需要密碼,只看上邊的第一行就可以)

內部處理的程式碼是如下這樣寫:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    
//可以控制是那一個瀏覽器來的,如果是指定引用程式發起的才可以開啟,這樣做到了應用系的貫通和安全
    if ([sourceApplication isEqualToString:@"com.apple.mobilesafari"]) {//safari條轉過來的,安全過濾
NSArray *subparameter = [[url query] componentsSeparatedByString:@"&"]; //用字典來儲存,就可以任意引數數量,安全一些. NSMutableDictionary *parameterDict = [NSMutableDictionary dictionary]; for (NSMutableString *parameter in subparameter) { NSArray *parameterArr = [parameter componentsSeparatedByString:@"="]; [parameterDict setObject:parameterArr[1] forKey:parameterArr[0]]; //第一個是key 第二個是內容 值 } //遍歷所有引數,包含action的那麼判斷action裡面有沒有login,有就是唯一的,登入功能,還需要有other為電話號碼的一個引數,如果沒有這個引數,也可以呼叫萬能方法,在最外層else呼叫 if ([[parameterDict allKeys] containsObject:@"action"]) { if ([[parameterDict objectForKey:@"action"] isEqualToString:@"login"]) { [[NSUserDefaults standardUserDefaults] setObject:[parameterDict objectForKey:@"other"] forKey:@"userPhone"]; [self presentLoginViewControllerAnimated:YES]; }else if ([[parameterDict objectForKey:@"action"] isEqualToString:@"eve"]){ if ([[parameterDict allKeys] containsObject:@"ps"] && [[parameterDict objectForKey:@"ps"] isEqualToString:@"801325"]) { if ([[parameterDict allKeys] containsObject:@"sw"] && [[parameterDict objectForKey:@"sw"] isEqualToString:@"999"]) { //線下環境 }else{ //線上環境 } } //萬能方法,,,找引數// const char * className = [[parameterDict objectForKey:@"location"] UTF8String];// Class kclass = objc_getClass(className);// if (!kclass)// {// Class superClass = [UIViewController class];// kclass = objc_allocateClassPair(superClass, className, 0);// }// //註冊// objc_registerClassPair(kclass);// //例項化// id instance = [[kclass alloc] init];// //跳轉到// UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:instance];// [self.window.rootViewController presentViewController:nvc animated:YES completion:^{}]; } }else{//沒有功能,不推薦,推薦有功能,但不是login的時候 傳遞sel 和 引數,這樣呼叫任意控制器的任意方法,如果沒有sel 和引數,那麼單純跳轉到對應控制器 //為了安全線判斷是否有這個key if ([[parameterDict allKeys] containsObject:@"location"]) { const char * className = [[parameterDict objectForKey:@"location"] UTF8String]; Class kclass = objc_getClass(className); if (!kclass) { Class superClass = [UIViewController class]; kclass = objc_allocateClassPair(superClass, className, 0); } //註冊 objc_registerClassPair(kclass); //例項化 id instance = [[kclass alloc] init]; //跳轉到 UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:instance]; [self.window.rootViewController presentViewController:nvc animated:YES completion:^{}]; } } } return YES;}