本文转载自:http://www.jianshu.com/p/0811ccd6a65d
目标
平常我们做iOS开发,会经常遇到打开其他的APP的功能。本篇文章讲的就是打开别人的APP的一些知识。我们的目标是:
打开别人的APP 让别人打开我们的APP iOS9的适配问题 使用URL Schemes传递数据准备工作
建立一个名为OpenApp的工作空间,用来存放我们的两个工程 建立这个工作空间主要是为了让我们后面建立的两个工程能在一个Xcode页面上管理,方便讲解和管理。挺简单的,不清楚的可以看我之前的文章【iOS开发】在一个Xcode页面建立多个工程建立一个名为MyApp的iOS工程。这个MyApp是“我的app”,用来打开另一个APP的。 添加工程到我们刚才创建的OpenApp.xcworkspace。并且在工程的Main.storyboard添加一个button,待会儿我们会用来写方法。
建立一个名为WXApp的iOS工程。这个工程是我们模拟的“微信APP”,是被人打开的那个APP。 为了区分两个应用,我们在Main.storyboard上加一个label,“我是微信App”。
好了,准备工作就这么简单。
打开别人的APP与让别人打开我们的APP
想要打开别人的APP或者让别人打开我们的APP,那就需要通过URL Schemes了。
什么是URL Schemes?
URL Schemes是苹果给出的用来跳转到系统应用或者跳转到别人的应用的一种机制。同时还可以在应用之间传数据。
通过对比网页链接来理解 iOS 上的 URL Schemes,应该就容易多了。 URL Schemes 有两个单词:
URL,我们都很清楚,http://www.apple.com 就是个 URL,我们也叫它链接或网址; Schemes,表示的是一个 URL 中的一个位置——最初始的位置,即 :// 之前的那段字符。比如 http://www.apple.com 这个网址的 Schemes是 http。 根据我们上面对 URL Schemes 的使用,我们可以很轻易地理解,在以本地应用为主的 iOS 上,我们可以像定位一个网页一样,用一种特殊的 URL 来定位一个应用甚至应用里某个具体的功能。而定位这个应用的,就应该是这个应用的 URL 的 Schemes 部分,也就是开头儿那部分。
在WXApp上设置一个URL Schemes
为了能让别的App(包括我们刚才创建的MyApp)能够打开WXApp,我们需要为WXApp添加一个URL Schemes。 步骤:选中WXApp工程->Info->URL Types->点击“+”->在URL Schemes栏填上 weixin
备注:一个应用是可以有多个URL Schemes的。你可以再次点击“+”来添加一个URL Schemes
我们看看info.plist文件里面是怎样的。
然后我们run一下WXApp。(注意一下你run的target是哪个)
这样,WXApp就向系统“注册”了一个URL Schemes,其他的应用可以通过openurl:
方法来打开WXApp了。
MyApp打开WXApp
现在我们在MyApp里面打开WXApp。方法非常简单。 在ViewController里面添加一个方法
- (IBAction)openWXApp:(UIButton *)sender {
[self demo1];
}
- (void)demo1 {
//创建一个url,这个url就是WXApp的url,记得加上://
NSURL *url = [NSURL URLWithString:@"weixin://"];
//打开url
[[UIApplication sharedApplication] openURL:url];
}
然后run一下MyApp
运行了之后点击“打开微信”button,会弹出“MyApp”想要打开“WXApp”
提示框,点确认之后就可以跳转到WXApp了。
iOS9之后,在一个应用跳转到了另一个应用之后,左上角会有个返回到上一个应用的按钮。这样,我们在MyApp里面点击“打开微信”按钮,跳转到WXApp之后,再点击“Back to MyApp”,又回到MyApp了。闲着无聊就可以反复点击这两个按钮来两个应用间跳转了,哈哈。
值得一说的是,这个URL Schemes并不是唯一的。也就是说,多个应用之间设置的URL Schemes是可以相同的。
那么问题来了,假如两个应用的URL Schemes相同的话,使用openURL:
方法会打开哪个应用呢?
楼主亲自用手机试了一下。
步骤是:
- 将MyApp安装到手机上,点击“打开微信”button,微信打开了。
- 然后将WXApp也安装到手机上。再次点击MyApp的“打开微信”button,结果打开的是WXApp。
结论:如果两个应用有URL Schemes是相同的,后安装的应用的URL Schemes会把早安装的应用的URL Schems覆盖掉。
在safari打开WXApp
没错,注册了URL Schemes的应用,用safari浏览器也是可以打开的。我就经常用这个来验证应用是否设置了我想要的URL Schemes
在safari打开WXApp,直接在safari的地址栏输入weixin://
,enter就可以打开了
iOS9中的适配
- 配置URL Schemes白名单
其实在打开WXApp的时候,正常情况下,我们应该是先用canOpenURL:
方法先判断能否打开这个url,然后再用openURL
方法打开该URL的。这样可以带来更好的用户体验。因为用户不一定安装了WXApp。假如用户没有安装的话点击“打开微信”button是没有任何反应的。这时候我们应该先判断是否能够打开这个url(也就是判断用户有没有安装WXApp),没有安装的话就给个温馨提示,比如:“U四不四洒,没安装WXApp,怎么打开啊!”。
更重要的是,假如点击之后没效果,很有可能被苹果拒绝哦。
- (IBAction)openWXApp:(UIButton *)sender {
// [self demo1];
[self demo2];
}
//先判断再打开WXApp
- (void)demo2 {
//创建一个url,这个url就是WXApp的url,记得加上://
NSURL *url = [NSURL URLWithString:@"weixin://"];
//先判断是否能打开该url
if ([[UIApplication sharedApplication] canOpenURL:url]) {
//打开url
[[UIApplication sharedApplication] openURL:url];
}else {
//给个提示或者做点别的事情
NSLog(@"U四不四洒,没安装WXApp,怎么打开啊!");
}
但是我们发现用了canOpenURL:
方法之后,并没有如我们想像中打开了WXApp。一看,Xcode控制台提示:
为什么会这样呢?
因为iOS9的时候苹果加强了权限,只有在info.plist文件中加入了URL Schemes白名单才能使用canOpenURL:
方法来判断是否能打开该url。该白名单的上限是50个。也就是说,你最多只能使用canOpenURL:
方法判断50个URL Schemes。当然,平常我们都用不了那么多,就算是集成分享功能,50个肯定够了。
备注:只是对
canOpenURL:
方法有限制,openURL:
方法是没有限制的。
言归正传,我们需要在MyApp的info.plist里面将weixin
设置为白名单。
步骤:点击info.plist->右键->Open As->Source Code->添加下面的代码
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
这样就可以了。