简介:不发版本能够切换是灰度环境还是线上环境,为了解决这个问题,所做的事情;同理这个方法也可以做一些跳转和打开的操作
准备:
在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;}