应用间跳转

需要先认识几个概念:

1
2
3
4
5
6
7
8
/*
* URL: 统一资源定位符(可以没有路径,但是必须有协议头)
* scheme: 协议头,用来决定查找资源的方式 http:// ftp://
* path: 路径 通过路径将从哪个记录跳转过来的应用的 URL,知道是哪跳转过来的
*
* 默认情况下应用程序没有 URL
* 在 iOS 中,打开一个程序,只要拿到这个应用程序的协议头即可
*/

从我们的应用跳转到别人的应用

其实,通过 application 发短信也是应用间跳转,从我们的应用打开系统自带的发短信应用。因此,想要打开一个应用,我们只需要知道该应用的协议头(scheme)即可。

当我们点击分享微信好友圈的时候,此时其实一共会有三种情况:

  1. 我们的手机并没有安装微信
  2. 我们的手机上的微信程序并没有运行
  3. 我们的手机上的微信 app 已经运行但是在某个特定的页面

[UIApplication sharedApplication] canOpenURL:wechatURL] 可以检测出是否安装微信,如果安装直接跳转即可,系统会自动打开微信 app。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
* 步骤:
* 1. 获取到对应应用程序的 URL
* 2. 判断手机中是否安装了对应的应用程序
* 3. 打开应用程序
*/
NSURL *wechatURL = [NSURL URLWithString:@"wechat://timeline?we"];
/*
* 此处带路径的作用:
* 1. timeline 的作用是跳转到 wechat 应用的哪个界面,比如微信朋友圈还是微信好友
* 2. ?we 的作用是告诉微信是哪个应用跳转到微信的,便于返回原来的应用
*/

// 判断手机中是否安装了对应的应用程序
if ([[UIApplication sharedApplication] canOpenURL:wechatURL]) {
// 打开应用程序
[[UIApplication sharedApplication] openURL:wechatURL];
}

从别人的应用跳转到我们的应用

当别人的应用要跳转到你的应用时,application 代理会执行如下方法:

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
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
/*
* 一般跳转界面思路:
* 先获取微信的主页控制器,然后回到主页控制器
* 然后再从主页控制器 push 到朋友圈或者好友。
*
*/
// 1.将 URL 转换成字符串
NSString *urlString = url.absoluteString;

// 获取主页控制器
UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;

// 回到根控制器
[rootNav popToRootViewControllerAnimated:YES];

// 拿到 nav 的根控制器
UIViewController *homeVc = [rootNav.childViewControllers firstObject];

// 2.判断是通过朋友圈还是微信好友跳转过来
if ([urlString containsString:@"timeline"]) {
[rootNav pushViewController:@"朋友圈控制器" animated:YES];
} else if ([urlString containsString:@"session"]) {
[rootNav pushViewController:@"微信好友控制器" animated: YES];
}

return YES;
}

如果跳转结束以后,此时需要返回原来的 app。我们需要拿到原来 app 的协议头 scheme。

如何拿呢?所以就需要跳转之前的 path,路径了,通过特殊符号拼接参数,将应用协议头拼接到参数中传递给我们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* 需要有个属性保存 url
* 然后截取字符串的方式获取到是哪个 url 跳转到了这个界面
*/
- (void)backToApp
{
NSString *urlSchemeString = [[self.urlString componentsSeparatedByString:@"?"] lastObject];

NSString *urlString = [urlSchemeString stringByAppendingString:@"://"];

// urlString 就是跳转过来的应用的 url
NSURL *url = [NSURL URLWithString:urlString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
}
文章作者: Ammar
文章链接: http://lizhaoloveit.cn/2015/06/20/%E5%BA%94%E7%94%A8%E9%97%B4%E8%B7%B3%E8%BD%AC/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ammar's Blog
打赏
  • 微信
  • 支付宝

评论