俩个应用间的循环跳转

2016-06-12  本文已影响44人  lee_moons

应用跳转是根据协议头跳转

A跳转B,需要B增加URL Types ,A应用根据URL的协议头跳转

iOS8之前的跳转方法:
//适配iOS9 需要配置plist文件 -->添加应用白名单 -->info.plist添加LSApplicationQueriesSchemes数组

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]]) {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"weixin://"]];
}

//iOS9可以使用 不需要配置plist文件
if (![[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"weixin://"]]) {
    NSLog(@"打开失败");
}

分别跳转朋友圈和好友列表 给好友列表页面一个"唯一"的URL scheme以供跳转

在A中将scheme和要跳转B的协议头处理拼接
//headerStr是协议头 scheme是A的标识
urlStr = [NSString stringWithFormat:@"%@?%@",headerStr,scheme];

在B中处理传来的url
//lastUrl是截取出来的scheme
NSString *urlStr = [lastUrl stringByAppendingString:@"://"];

处理url得到scheme,并返回
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlStr]]

A方

// 朋友圈
- (IBAction)timeline:(id)sender
{
    if (![[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"weixin://timeline"]]) {
        NSLog(@"不能跳转到微信");
    }
    
}
// 好友列表
- (IBAction)session:(id)sender
{
//    if (![[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"weixin://session"]]) {
//        NSLog(@"不能跳转到微信");
//    }
    
    // 获取info.plist内容
    NSDictionary *info = [NSBundle mainBundle].infoDictionary;
//    NSLog(@"%@",info);
    // 获取scheme
    NSArray *urlTypes = info[@"CFBundleURLTypes"];
//    NSLog(@"%@",urlTypes);
    
    NSDictionary *dict = urlTypes[0];
    
    NSArray *urlSchemes = dict[@"CFBundleURLSchemes"];
    
    NSString *scheme = urlSchemes[0];
    NSLog(@"%@",scheme);
    
    // 拼接@"weixin://session" 和scheme
    NSString *headerStr = @"weixin://session";
    NSString *urlStr = [NSString stringWithFormat:@"%@?%@",headerStr,scheme];
     NSLog(@"%@",urlStr);
    // 跳转到好友列表
    if (![[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlStr]]) {
            NSLog(@"不能跳转到微信");
    }
}


B方

AppDelegate

@property (nonatomic, copy) NSString *lastStr;


#pragma mark 作用完全一样-->接收第三方app传递的信息
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
    // weixin://session
    NSLog(@"%@",url);
    NSString *urlStr = url.absoluteString;
    // 获取 // 的范围
    NSRange range = [urlStr rangeOfString:@"//"];
    // 截取 // 后面的所有字符串
    // session?ert84tfv
    NSString *lastStr = [urlStr substringFromIndex:range.location + range.length];
    NSLog(@"%@",lastStr);
    self.lastStr = lastStr;
    
    // 获取根控制器
    UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
    // 获取viewController
    ViewController *vc = nav.childViewControllers[0];
    // 回到根控制器
    [nav popToRootViewControllerAnimated:YES];
    // 跳转不同界面
    if ([lastStr containsString:@"session"]) {
        [vc performSegueWithIdentifier:@"session" sender:nil];
    }else if([lastStr containsString:@"timeline"]){
        [vc performSegueWithIdentifier:@"timeline" sender:nil];
    }
    return YES;
}

ViewController
点击返回到之前的项目

- (IBAction)backToApp:(id)sender
{
    // 获取应用程序的代理
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    // 获取//以后的字符串
    // lastStr:  session?ert84tfv
    NSString *lastStr = delegate.lastStr;
    // 获取?的范围
    NSRange range = [lastStr rangeOfString:@"?"];
    // 从?后面开始截取字符串
    NSString *scheme = [lastStr substringFromIndex:range.location + range.length];
    NSLog(@"%@",scheme);
    // 跳转
    if (![[UIApplication sharedApplication] openURL:[NSURL URLWithString:[scheme stringByAppendingString:@"://"]]]) {
        NSLog(@"不能跳转");
    }
}
上一篇下一篇

猜你喜欢

热点阅读