iOS应用之间的跳转解析

应用之间的跳转,在我们日常使用中是经常见到的,分享到微信啊,支付宝支付啊,等等。接下来,我们就来实现一下这种效果

这是从一个APP直接跳到另外一个APP的效果

1

这是从一个APP跳到另一个APP的指定页面

说明

在开发之中我们经常遇到需要从我们当前程序跳入到另外一个程序中,下面我们来说明一下这实现的过程

常见的跳转场景

  • 使用第三方登录时,需要跳转社交APP,比如常见的QQ、微信、淘宝、支付宝等
  • 分享我们的消息到其他APP,最常见的就是分享到QQ和微信,推广我们的APP
  • 第三方支付,微信和支付宝
  • 导航,跳转到地图类应用
  • 跳转到系统的APP,打电话,发短信,发邮件等

实现原理

我们想要打开iOS中的一个应用,只需要拿到这个应用的协议头,我们就可以实现从一个APP跳到另外一个APP

假设我们现在有两个APP,APP-1和APP-2,需要从APP-1跳到APP-2
那么我们就需要给APP-2绑定一个URL Schemes(自定义的应用协议头),在APP-1中我们就可以实现用这个协议头跳到APP-2

一个APP直接跳到另外一个APP实现

创建两个项目APP-1和APP-2

在APP-2中,我们来绑定URL Schemes

3

在APP2的target中绑定协议头为 APP2

然后我们在APP-1中添加一个按钮 来实现,点击跳转

注意,这两个APP得在手机上都安装上,才能跳转

1
[btn1 addTarget:self action:@selector(jumpToApp2) forControlEvents:UIControlEventTouchUpInside];

跳转方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (void)jumpToApp2{
//获取APP2的URL Scheme
NSURL *appURL = [NSURL URLWithString:@"APP2://"];

//判断手机中是否安装了APP2
if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
//打开APP2
[[UIApplication sharedApplication] openURL:appURL];
}else{
NSLog(@"没有安装APP2");
}
// ---------------如果是iOS9之前,上面代码就可以实现跳转了---------------------
// ---------------iOS9之后需要在应用程序中加上白名单,即在APP-1中加上APP-2的白名单---------
// ----------------在APP-1的Info中 添加键值对LSApplicationQueriesSchemes---------------------------------

}

在iOS9之后,跳转 我们需要在APP中设置需要跳转的URL Schemes才能实现跳转 即在Info中添加LSApplicationQueriesSchemes键值对

5

然后我们就可以实现跳转了

看一下效果

1

一个APP跳到另一个APP的指定页面

这个实现起来也很简单的,首先在APP2中新建两个ViewController

然后在APP-1中添加两个按钮分别是跳转到不同的页面

1
2
3
4
5
6
7
8
9
10
UIButton *btn1 = [[UIButton alloc] initWithFrame:CGRectMake(50, 150, 200, 30)];
[btn1 setTitle:@"跳转到第一个界面" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(jumpToApp2_1) forControlEvents:UIControlEventTouchUpInside];
btn1.backgroundColor = [UIColor redColor];
[self.view addSubview:btn1];

UIButton *btn2 = [[UIButton alloc] initWithFrame:CGRectMake(50, 200, 200, 30)];
[btn2 setTitle:@"跳转到第二个界面" forState:UIControlStateNormal];
[btn2 addTarget:self action:@selector(jumpToApp2_2) forControlEvents:UIControlEventTouchUpInside];
btn2.backgroundColor = [UIColor redColor];

跳转方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

- (void)jumpToApp2_1{
//获取APP2的URL Scheme
NSURL *appURL = [NSURL URLWithString:@"APP2://VC1"];

//判断手机中是否安装了APP2
if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
//打开APP2的ViewController1
[[UIApplication sharedApplication] openURL:appURL];
}else{
NSLog(@"没有安装APP2");
}
// ---------------如果是iOS9之前,上面代码就可以实现跳转了---------------------
// ---------------iOS9之后需要在应用程序中加上白名单,即在APP-1中加上APP-2的白名单---------
// ----------------在APP-1的Info中 添加键值对LSApplicationQueriesSchemes---------------------------------

}

- (void)jumpToApp2_2{
//获取APP2的URL Scheme
NSURL *appURL = [NSURL URLWithString:@"APP2://VC2"];

//判断手机中是否安装了APP2
if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
//打开APP2ViewController2
[[UIApplication sharedApplication] openURL:appURL];
}else{
NSLog(@"没有安装APP2");
}
// ---------------如果是iOS9之前,上面代码就可以实现跳转了---------------------
// ---------------iOS9之后需要在应用程序中加上白名单,即在APP-1中加上APP-2的白名单---------
// ----------------在APP-1的Info中 添加键值对LSApplicationQueriesSchemes---------------------------------

}

通过对跳转的协议头添加不同的描述,来实现不同的跳转

然后我们在APP-2的delegate中 实现方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 因为现在xcode8 最低支持8.0 所以  我还是用这个方法吧
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{

//获取根控制器
UINavigationController *nvc = (UINavigationController *)self.window.rootViewController;
// ViewController *vc = nvc.childViewControllers.firstObject;

//每次跳转都必须要在根控制器 这一点比较重要
[nvc popToRootViewControllerAnimated:YES];

//根据url判断需要展示的VC
if ([url.absoluteString containsString:@"VC1"]) {
ViewController1 *vc1 = [[ViewController1 alloc] init];
// [vc presentViewController:vc1 animated:YES completion:nil];
[nvc pushViewController:vc1 animated:YES];
}else if([url.absoluteString containsString:@"VC2"]){
ViewController2 *vc2 = [[ViewController2 alloc] init];
[nvc pushViewController:vc2 animated:YES];
}

return YES;
}

实现跳转监听,这样就能跳转到不同的页面了

源代码放在了

https://github.com/yangqian111/blog/tree/master/APP-1

https://github.com/yangqian111/blog/tree/master/APP-2