iOS系统是具备在设备上的两个App之间进行相互跳转功能的。
而且跳转的需求我们也会经常见到,比如在豆瓣中分享一个影评,会在分享后,给与用户选择是直接跳转到微博中还是留在豆瓣;这些都是这个功能很常见的使用。
而实现二者之间可以相互跳转甚至可以说是通信的实现,是基于二者之间约定的协议来达成通讯,就如同互联网最基本的TCP/IP协议,只要二者都遵循并实现这个协议,二者之间就可以实现跳转通信。在iOS中使用的是URL Schemes作为二者的通信“协议”,跳转的方法苹果也帮助我封装在了UIApplication中。
- (BOOL)openURL:(URL)url;
其中在iOS中我们一般的使用打开系统的应用程序也是使用的类似于这种“URL”方法
// 打开打电话应用程序
URL:tel
// 打开发短信应用程序
URL:sms
打开系统的设置界面,必须先在info.plist中配置URL Schemes
在URL Types中添加prefs
// 打开Wifi设置
URL:prefs:root=WIFI
// 打开定位服务
URL:prefs:root=LOCATION_SERVICES
// 打开蓝牙服务
URL:prefs:root=Bluetooth
// 打开FaceTime
URL:prefs:root=FACETIME
// 打开音乐
URL:prefs:root=MUSIC
// 打开墙纸设置
URL:prefs:root=Wallpaper
结合网上的一些关于两个App之间的跳转,这里也是分为了3中情况实现。
-
- 单跳转
应用
App_A
-->应用App_B
,只管跳转过去,不管从应用App_B
在跳转回App_A
。
a. 首先要在项目 App_B
当中设置URL Schemes。该key必须确保唯一,要提供给App_A
用。
如下截图所示,我在这个测试App中设置URL Schemes
为APPB
(当然这里在避免特殊字符后可以随机设置)
可按照如下路径设置:
TARGETS -> Info -> URL Types(下拉展开) -> URL Scheme
(如果初始建立的工程中URL Types中没有任何内容,可点击底部加号创建即可)
或者 直接在 Info.plist 也可以添加
b. 在另一个APP应用App_A
实现跳转代码
注意: iOS9中打开一个应用程序的URL必须配置 Info.plist
文件
添加 LSApplicationQueriesSchemes
的key
添加对应 URLSchemes
- (void)testMethod1{
// 此URL的格式是应用App_B设置的URL Scheme
NSString *urlStr = @"APPB://";
NSURL *url = [NSURL URLWithString:urlStr];
// 在这里可做处理判断,如果没有跳转APPStore去下载
if ([[UIApplication sharedApplication]canOpenURL:url]) {
// 此方法可用于跳转时传值和跳转后响应处理操作
NSDictionary *dicInfo = @{@"APPA_key":@"APPA_value"};
[[UIApplication sharedApplication]openURL:url options:dicInfo completionHandler:^(BOOL success) {
}];
// [[UIApplication sharedApplication]openURL:url];
}else{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"跳转的应用程序未安装" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"Dowload", nil];
[alert show];
}
}
- 相互跳转
相较于单跳转,相互跳转只不过是把上面单跳转的步骤相同的在另一个需要跳转和被跳转的App应用中执行一次即可。可按照上述单跳转步骤在执行一次即可,这里不作详述
- 跳转参数传值
具体的一些实现跳转操作可如下代码:
在跳转App_A中配置相应传值参数
在上述单跳转步骤中,- testMethod1 方法中,urlStr = @"APPB://";
---> urlStr = @"APPB://testInt = 10";
在被跳转App_B中接收跳转参数
在 AppDelegate.m 文件中 -- 实现此方法 (注此方法在后面版本iOS中已经deprecated)
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
NSString *urlParameter = url.absoluteString;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"传过来的参数是" message: urlParameter delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
[alert show];
return YES;
}
在这里我自己其实有个疑问就是,我们一般在实现Facebook或者是国内的微博在我们自己的App中实现其登录功能,在跳转到相应的Facebook或者微博后,登录成功授权后还会重新跳转到我们自己的App中,此功能如何实现?
我自己给了如下猜测:
如果需要跳转登录并授权到Facebook或者微博肯定需要在其官网的开发者选项中加入我们的应用id;
而其在登录成功授权后,会根据我们在官网注册的id实现跳转回到我们的应用中。(其中App_id肯定已经存储在当前设备的Facebook或者微博对应的应用中)