常见的应用之间的跳转
- 拨打电话
- 发送信息,邮件
- 第三方的登录和分享
你知道的跳转方法
苹果官方专门有一个类来管理UIApplication
- (IBAction)callClick:(UIButton *)sender {
NSURL* url = [NSURLURLWithString:@"tel://10010"];
if ([[UIApplicationsharedApplication] openURL:url]) {
NSLog(@"开始拨号10010");
}else{
NSLog(@"无法打开拨号");
}
}
- (IBAction)sendMsgClick:(UIButton *)sender {
NSURL* url = [NSURL URLWithString:@"sms://10010"];
if ([[UIApplication sharedApplication] openURL:url]) {
NSLog(@"打开信息成功");
}else{
NSLog(@"打开信息失败");
}
}
关于openURL的说明
Attempts to open the resource at the specified URL.
The URL you pass to this method can identify a resource in the app that calls the method, or a resource to be handled by another app. If the resource is to be handled another app, invoking this method might cause the calling app to quit so the other can launch.
To check if there is an installed app that can handle a scheme, call the canOpenURL: method before calling this one. Be sure to read the description of that method for an important note about registering the schemes you want to employ.
Parameters
url
A URL (Universal Resource Locator). UIKit supports many common schemes, including the http, https, tel, facetime, and mailto schemes. You can also employ custom URL schemes associated with apps installed on the device.
Returns
YES if the resource located by the URL was successfully opened; otherwise NO.
应用跳转的原理
相信大家都在应用中集成过第三方登陆和分享的SDK,然后需要在工程中集成一大堆的东西,比如URL Schemes
1. 关于URL
- URL:资源的路径或地址。在IOS中有一个专门用于包装资源路径的类——NSURL。
一个完整的URL会包括以下内容
例如: http://baidu.com/s?word=123
"https//": 协议类型
"www.baidu.com":服务器的IP地址
"/s": 资源存放的路径
"word=简书": 请求的参数
比如如下例子:
NSURL* url = [[NSURL alloc] initWithString:@"http://baidu.com/s?word=123"];
NSLog(@"scheme(协议):%@",url.scheme);
NSLog(@"host(域名):%@",url.host);
NSLog(@"path(路径):%@",url.path);
NSLog(@"query(参数):%@",url.query);
输出结果如下:
2016-12-09 10:13:21.508350 APP0[1058:183130] scheme(协议):http
2016-12-09 10:13:21.508542 APP0[1058:183130] host(域名):baidu.com
2016-12-09 10:13:21.508673 APP0[1058:183130] path(路径):/s
2016-12-09 10:13:21.508796 APP0[1058:183130] query(参数):word=123
2.跳转的原理
在IOS中,从一个App打开另外一个APP,这必然需要涉及两个APP之间的通信和交互,苹果的UIApplication恰恰是专门用来管理的类。
如上的拨打电话和发送信息的 http, https, tel, facetime, and mailto 指定了对应通信的scheme(协议)。所以一个应用能打开另外一个应用的必然条件是,另一个应用必须配置一个scheme(协议),这样应用程序才能根据协议打开应用。
应用该原理实现应用之间的跳转
自定义应用之间的跳转
1.在APP0中配置一个协议scheme,这里就直接命名为APP0(名字可以任意设定)
targets -> info -> URL Types ->URL Scheme ->填写协议
2.在APP2中实现跳转的方法
NSURL *url = [NSURL URLWithString:@"APP0://"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}else{
NSLog(@"没有安装应用");
}
ok,到这里如果你的系统是ios9.0以下,已经大大功告成了。但是,如果是9.0以后,请看下一步。
3、配置协议白名单
在APP2的Info.plist文件中增加一个LSApplicationQueriesSchemes字段,把它设置为数组类型,并配置需要跳转的协议名单
4.细化协议
从APP2跳转到APP0,那么需要跳转到哪个界面,这就涉及到两个APP之间的通信。如果仅仅是实现两个应用之间的跳转,配置好了scheme,调用openURL即可实习。可是这二者如何通信呢?
比如我们定义:
- APP0://auth 需要APP0对于APP2的应用进行授权<当然授权设计返回,所以我们这里就定义 APP2://ture是授权成功 APP2://false是授权失败>
-
APP0://display/message 需要APP0中展示由APP2传递过来的一句话
源代码参考:https://github.com/cslmark/-DEMO
5.附上DEMO的演示效果
实现检测版本的升级
NSString *str = [NSString stringWithFormat:
@"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=%@",
YOURAPPID];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];