从外部跳转到自己的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;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值