一.从应用A
直接跳转到应用B
- 以应用A(网易)与应用B(微信)说明,
网易
应用跳转至微信
应用;
1.设置应用B的URL Types
中的URL Schemes
2.在应用A中添加一个跳转的按钮,并监听点击
1 2 3 4 5 6 7 8
| - (IBAction)skipToWechat:(id)sender {
NSURL *url = [NSURL URLWithString:@"wechat://"]; // 如果已经安装了这个应用,就跳转 if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; } }
|
- 注意点:
- 一个
URL
是可以没有路径的,但是协议头
必须的完整;
- 只要协议头和对应的应用的
URL Schemes
一致,就可知跳转到对应的应用,与URL路径无关
二.从 应用A 跳转到 应用B 的制定的页面
1.设置应用B的URL Types
中的URL Schemes
,(这里不再赘述)
2.在应用A中添加一个跳转的按钮,并监听点击
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| - (IBAction)skipToSession:(id)sender {
NSURL *url = [NSURL URLWithString:@"wechat://session"]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; } }
- (IBAction)skipToSession:(id)sender {
NSURL *url = [NSURL URLWithString:@"wechat://timeLine"]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; } }
|
- 备注:
session
和timeLine
是我们自定义的,到时候根据这两个不同的路径分别进行不同的跳转(见下文)
3.在应用B中监听跳转,进行判断,执行不同的跳转
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
|
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
NSString *urlString = url.absoluteString; UINavigationController *nav = (UINavigationController *)application.keyWindow.rootViewController; ViewController *vc = [nav.childViewControllers firstObject]; [nav popToRootViewControllerAnimated:NO]; if ([urlString containsString:@"timeLine"]) { [vc performSegueWithIdentifier:@"jump2tiemLine" sender:nil]; } else if ([urlString containsString:@"session"]) { [vc performSegueWithIdentifier:@"jump2session" sender:nil]; } return YES; }
|
- 注意点:我们通过
URL打开
的应用就会调用这个方法,不管这个应用是在后台还是杀死状态;
三.从 应用B 反跳转到 应用A
- 细节分析:
- 1.我们进行反跳的时候,要根据是谁跳转来的,然后跳转到相应的应用;也就是说,我们在进行跳转时要还要携带自身的一些数据,根据这个数据反跳到对应的应用;
- 2.制作一个规定:我们跳转的时候将自己的
URL Schemes
携带过来,如下:1
| @"wechat://timeLine?news"
|
- 说明:
wechat://
:将要跳转到的应用的URL Schemes
;
timeLine
:用于区分跳转到应用的哪个页面;
?
:分隔符
news
:自身的URL Schemes
,配置方法与上面的一样
- 3.获取数据应用跳转前的数据,并反跳回去
- 1.在应用B的
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
方法中,我们能够获取完整的URL(也就是wechat://timeLine?news
),所以在跳转前的控制器中添加一个属性,用于保存;
- 2.重写这个控制器的
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
方法,这样我们能够根据segue.destinationViewController
获取要跳转到的控制器;
- 3.在要跳转到的控制器中定义一个属性,用于接受,并截取,拼接成合法的URL(此时的URL已经是跳转前的那个应用的
URL Schemes
),执行跳转即可返回对应的应用