十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
平常我们做iOS开发,会经常遇到打开其他的APP的功能。本篇文章讲的就是打开别人的APP的一些知识。我们的目标是:
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:国际域名空间、网络空间、营销软件、网站建设、台儿网站维护、网站推广。打开别人的APP 让别人打开我们的APP iOS9的适配问题 使用URL Schemes传递数据 准备工作 建立一个名为OpenApp的工作空间,用来存放我们的两个工程建立一个workspace来存放我们的工程
建立一个名为MyApp的iOS工程。这个MyApp是“我的app”,用来打开另一个APP的。
添加工程到我们刚才创建的OpenApp.xcworkspace。并且在工程的Main.storyboard添加一个button,待会儿我们会用来写方法。
MyApp工程
建立一个名为WXApp的iOS工程。这个工程是我们模拟的“微信APP”,是被人打开的那个APP。
为了区分两个应用,我们在Main.storyboard上加一个label,“我是微信App”。
在workspace建立WXApp工程
WXApp
好了,准备工作就这么简单。
打开别人的APP与让别人打开我们的APP想要打开别人的APP或者让别人打开我们的APP,那就需要通过URL Schemes了。
什么是URL Schemes?URL Schemes是苹果给出的用来跳转到系统应用或者跳转到别人的应用的一种机制。同时还可以在应用之间传数据。
通过对比网页链接来理解 iOS 上的 URL Schemes,应该就容易多了。
URL Schemes 有两个单词:
为了能让别的App(包括我们刚才创建的MyApp)能够打开WXApp,我们需要为WXApp添加一个URL Schemes。
步骤:选中WXApp工程->Info->URL Types->点击“+”->在URL Schemes栏填上 weixin
添加一个URL Schemes
备注:一个应用是可以有多个URL Schemes的。你可以再次点击“+”来添加一个URL Schemes
我们看看info.plist文件里面是怎样的。
info.plist文件里面的URL Schemes
然后我们run一下WXApp。(注意一下你run的target是哪个)
在模拟器run一下WXApp
这样,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
run MyApp
运行了之后点击“打开微信”button,会弹出“MyApp”想要打开“WXApp”提示框,点确认之后就可以跳转到WXApp了。
点击“打开微信”button
打开了WXApp
iOS9之后,在一个应用跳转到了另一个应用之后,左上角会有个返回到上一个应用的按钮。这样,我们在MyApp里面点击“打开微信”按钮,跳转到WXApp之后,再点击“Back to MyApp”,又回到MyApp了。闲着无聊就可以反复点击这两个按钮来两个应用间跳转了,哈哈。
值得一说的是,这个URL Schemes并不是唯一的。也就是说,多个应用之间设置的URL Schemes是可以相同的。
那么问题来了,假如两个应用的URL Schemes相同的话,使用openURL:方法会打开哪个应用呢?
楼主亲自用手机试了一下。
步骤是:
没错,注册了URL Schemes的应用,用safari浏览器也是可以打开的。我就经常用这个来验证应用是否设置了我想要的URL Schemes
在safari打开WXApp,直接在safari的地址栏输入weixin://,enter就可以打开了
用safari打开WXApp
用safari打开WXApp
iOS9中的适配 配置URL Schemes白名单- (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控制台提示:
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->添加下面的代码
这样就可以了。
使用URL Schems传递数据URL Schemes除了可以用来打开APP之外,还可以用来在两个App之间传递少量的数据。
在百度上搜索“ios”,会生成一个url,下面来以这个url来大概介绍url的组成。
url为:https://www.baidu.com/s?ie=UTF-8&wd=ios
https就是协议,也就是scheme www.baidu.com 是域名 /s是路径 ?后面的是query,也就是查询参数。这个url有两个参数,分别是ie=UTF-8和wd=ios我们iOS的URL Schemes中也是差不多的。
而且,在openURL的时候,如果url中带有参数,只要URL Schemes是正确的,那同样可以打开App,而且,后面的参数也会带到我们打开的App那里。
咱们做个Demo就一目了然了。
在MyApp中,写个demo3方法,url为weixin://www.shixueqian.com/abc?title=hello&content=helloworld
- (IBAction)openWXApp:(UIButton *)sender { // [self demo1]; // [self demo2]; [self demo3]; } //使用URL Schemes传递数据 - (void)demo3 { //创建一个url,这个url就是WXApp的url,记得加上:// NSURL *url = [NSURL URLWithString:@"weixin://www.shixueqian.com/abc?title=hello&content=helloworld"]; //打开url [[UIApplication sharedApplication] openURL:url]; }
在WXApp的AppDelegate.m中,实现application: openURL:(NSURL *)url sourceApplication: annotation:回调
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { NSLog(@"url=====%@ n sourceApplication=======%@ n annotation======%@", url, sourceApplication, annotation); return YES; }
run了之后,我们发现,我们依旧可以通过点击openURL:方法打开WXApp。而且在WXApp被打开的时候,会执行application: openURL:(NSURL *)url sourceApplication: annotation:回调方法。在这个回调方法中,我们可以得到MyApp传过来的url等信息。
控制台打印如下:
log结果
完整的url信息都传过来了,我们就可以利用这个url里面的路径和参数等信息了,想干嘛就干嘛。这就实现了从MyApp向WXApp传递数据了。
备注:
苹果一共给了3个openURL的回调。
分别是:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED; - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED; - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary
为什么会有3个呢?这3个回调又有什么区别?(为方面讲解,分别设置ABC3个回调)
3个回调的功能基本一样,都是在别人通过URL Schemes打开应用的时候会执行的。// Keys for application:openURL:options: UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsSourceApplicationKey NS_AVAILABLE_IOS(9_0); // value is an NSString containing the bundle ID of the originating application UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsAnnotationKey NS_AVAILABLE_IOS(9_0); // value is a property-list typed object corresponding to what the originating application passed in UIDocumentInteractionController\'s annotation property UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsOpenInPlaceKey NS_AVAILABLE_IOS(9_0); // value is a bool NSNumber, set to YES if the file needs to be copied before use 这几个回调是有优先级的。C>B>A。也就是说,如果你3个回调都实现了,那么程序只会执行C回调。其他回调是不会执行的。(当然,iOS9以下只会执行B回调)。