转载至:https://www.jianshu.com/p/a74dc1d90503

iOS是一个封闭的系统,应用之间是不可以互相读取文件的。

实现途径:
URL Scheme是苹果为方便app之间互相调用而设计的。

  • 你可以通过一个类似URL的链接,通过系统的OpenURL来唤起该App,并可以传递一些参数。
  • 要求:每个URL必须能唯一标识一个App,如果你设置的URL与别的APP的URL冲突,此时,你的APP不一定会被调用起来。

例如:下列常用URL Scheme

//微信URLscheme
@"weixin://app/%@/pay/?nonceStr=%@&package=Sign%%3DWXPay&partnerId=%@&prepayId=%@&timeStamp=%@&sign=%@&signType=SHA1"//高德地图
@"iosamap://path?sourceApplication=ApplicationName&sid=BGVIS1&slat=%f&slon=%f&sname=当前位置&did=BGVIS2&dlat=%f&dlon=%f&dname=%@&dev=0&m=0&t=0"//百度地图
@"baidumap://map/direction?origin=%f,%f&destination=latlng:%f,%f|name=%@&mode=driving&coord_type=gcj02"//腾讯地图
@"qqmap://map/routeplan?from=当前位置&fromcoord=%f,%f&type=drive&tocoord=%f,%f&to=%@&coord_type=1&policy=0"[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.baidu.com"]];  //唤起浏览器 打开网页
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://158********"]];  //唤起发送信心功能
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://158********"]];  //唤起拔打电话功能
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://362****@qq.com"]];  //唤起邮件功能


实例教学: App1 唤起 App2
创建两个app: App1唤起方 App2接收方

APP2_接收方需要做的事情:

(1)设置URL Scheme

  1. 第一种方法:info.plist

    • URL Schemes:唯一性

    • URL identifier:可以是任何值,但建议用“反域名”(例如 “com.fcplayer.testHello”)

      配置URL Schemes_infoplist.png

  1. 第二种方法: Target—>Info—>URL Types

    • URL Schemes:唯一性

    • identifier:可以是任何值,但建议用“反域名”(例如 “com.fcplayer.testHello”)

      配置URL Schemes_info.png

(2) 在AppDelegate.m里面增加回调方法

#pragma mark --回调方法
/// iOS 9.0+
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{// Keys for application:openURL:options:UIApplicationOpenURLOptionsSourceApplicationKey // value is an NSString containing the bundle ID of the originating applicationUIApplicationOpenURLOptionsAnnotationKey // value is a property-list typed object corresponding to what the originating application passed in UIDocumentInteractionController's annotation propertyUIApplicationOpenURLOptionsOpenInPlaceKey  // value is a bool NSNumber, set to YES if the file needs to be copied before use}/// iOS 2.0–9.0
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{NSLog(@"URL scheme:%@", [url scheme]);NSLog(@"URL query: %@", [url query]);
}/// iOS 4.2–9.0
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{//通过sourceApplication来判断来自哪个app以决定要不要唤醒自己的appif ([sourceApplication isEqualToString:@"Bundle identifier"]){NSLog(@"%@", sourceApplication);    //来源于哪个app(Bundle identifier)NSLog(@"scheme:%@", [url scheme]);  //url schemeNSLog(@"query: %@", [url query]);   //可以通过[url query]来获得查询串  (传递参数)return YES;}else{return NO;}
}

APP1_唤起方需要做的事情:

1.唤起方法:

唤起方直接在点击事件里调用唤起方法:

/// 三个方法:/// iOS 3.0+
- (BOOL)canOpenURL:(NSURL *)url;/// iOS 10.0+
- (void)openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options completionHandler:(void (^)(BOOL success))completion;/// iOS 2.0–10.0
- (BOOL)openURL:(NSURL *)url;//e.g. 唤起第三方App
- (void)evokeOtherApp {//app2是应用的唯一的scheme//scheme 必须是“app2://lanch” “weixin://app”类似的格式:NSURL *url = [NSURL URLWithString:@"app2://lanch?key=param"];if ([[UIApplication sharedApplication] canOpenURL:url]) {if ([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {//iOS 10.0+[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {}];}else{//iOS 2~10[[UIApplication sharedApplication] openURL:url];}}else{//一般是没有安装NSLog(@"跳转下载app链接");}
}

2.sheme设置

如果你是iOS 9.0以上的系统,有时候会报错:

2017-01-05 11:06:24.343 APP1[235:48284] -canOpenURL: failed for URL: "app2://lanch?key=param" - error: "This app is not allowed to query for scheme app2"

因为:iOS 9.0以上的系统需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查唤起的第三方应用是否安装。受此影响,当你的应用在iOS 9中需要使用 QQ/QQ空间/支付宝/微信SDK 的相关能力时,需要在“Info.plist”里增加白名单:

key>LSApplicationQueriesSchemes</key><array><!-- 微信 URL Scheme 白名单--><string>wechat</string><string>weixin</string><!-- 新浪微博 URL Scheme 白名单--><string>sinaweibohd</string><string>sinaweibo</string><string>sinaweibosso</string><string>weibosdk</string><string>weibosdk2.5</string><!-- QQ、Qzone URL Scheme 白名单--><string>mqqapi</string><string>mqq</string><string>mqqOpensdkSSoLogin</string><string>mqqconnect</string><string>mqqopensdkdataline</string><string>mqqopensdkgrouptribeshare</string><string>mqqopensdkfriend</string><string>mqqopensdkapi</string><string>mqqopensdkapiV2</string><string>mqqopensdkapiV3</string><string>mqzoneopensdk</string><string>wtloginmqq</string><string>wtloginmqq2</string><string>mqqwpa</string><string>mqzone</string><string>mqzonev2</string><string>mqzoneshare</string><string>wtloginqzone</string><string>mqzonewx</string><string>mqzoneopensdkapiV2</string><string>mqzoneopensdkapi19</string><string>mqzoneopensdkapi</string><string>mqzoneopensdk</string><!-- 支付宝  URL Scheme 白名单--><string>alipay</string><string>alipayshare</string></array>

解决方案:

(1)在Info.plist里,配置支持http协议:

    <key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
`

(2)在Info.plist里,配置scheme到LSApplicationQueriesSchemes,也就是白名单:

<key>LSApplicationQueriesSchemes</key><array><string>app2</string><string>app3</string><string>app4</string></array>

(3)延伸...?

// 代码动态把key加入白名单(不可行)var info = Bundle.main.infoDictionaryguard var array:[Any] = info?["LSApplicationQueriesSchemes"] as? [Any] else {return}array.append(iosKey)print(array)var info2 = Bundle.main.infoDictionaryprint(info2)

跳转app_sheme设置.png

3.没有安装的处理

控制台输出错误:

2017-01-05 11:22:30.741 APP1[252:51626] -canOpenURL: failed for URL: "app3://lanch?key=param" - error: "(null)"
2017-01-05 11:22:30.746 APP1[252:51626] -canOpenURL: failed for URL: "app3://lanch?key=param" - error: "(null)"
2017-01-05 11:22:30.746 APP1[252:51626] [[UIApplication sharedApplication] canOpenURL:url] = 0

一般是没有安装App,可以跳转下载链接。

Demo下载地址:
链接: https://pan.baidu.com/s/1kViBtS7 密码: kvid

或者:https://github.com/mrhyh/arouse

iOS 唤起第三方App相关推荐

  1. 解决多个app共用一个universal links的问题 / apple-app-site-association / 不想用uniapp提供的云服务 / iOS唤起自家App

    效果图 主要步骤 准备好一个可以HTTPS访问的网站 准备统一配置文件"apple-app-site-association",包含多个app的不同访问路径 上传配置文件到http ...

  2. ionic4 ios打开appstore 跳转第三方app

    ionic4 打开appstore 跳转第三方app 1. 需要用到的插件 (1)检测 APP 是否安装的插件 ionic cordova plugin add cordova-plugin-appa ...

  3. App使用中,被打开了第三方App

    用户反馈,我们App在使用打开后,几秒内默认跳转到了其他App前台,这是非常危险的问题,被别人盗取了自己的流量, 由此开头引发了我后续的一系列安全攻防 ,下面是我总结的快速排查此问题的方式 1.现象: ...

  4. iOS/Android 微信及浏览器中唤起本地APP

    title: iOS/Android 微信及浏览器中唤起本地APP date: 2017-05-10 10:19:20 tags: 需求概述 分享应用活动链接已经成为手机应用一个非常重要的推广传播形式 ...

  5. iOS APP 跳转 第三方 APP

    iOS APP 跳转 第三方 APP  1.配置 URL scheme (1)在"项目" -> "info" -> "URL Types& ...

  6. IOS 调用第三方地图APP导航

    在开发中调用第三方APP进行路径规划,在此过程中不需要导入所调用地图的SDK,本文中只介绍调用百度地图.高德地图以及苹果自身地图APP. 在本项目中我用的是百度地图编码获取的百度经纬度坐标,而在开发过 ...

  7. ios调用第三方程序打开文件,以及第三方调用自己的APP打开文件

    一.自己的APP调用第三方打开文件 主要是使用 UIDocumentInteractionController 类 并实现 UIDocumentInteractionControllerDelegat ...

  8. 浏览器中唤起native app || 跳转到应用商城下载(二) 之universal links

    上一篇文章 在ios9出来以后,我们发现越来越多的应用能够直接绕过微信的屏蔽,从其内置浏览器中直接唤起app.相比于通过弹窗提示让用户到浏览器中操作的方式,这无疑是极大的提高了用户体验与流量导入.因此 ...

  9. H5页面拉起第三方App

    这是一篇自己写的旧文,首发于: 原文链接,略有修改. 背景 在H5页面或者app的webview中调起第三方app 核心 调起app是操作系统(iOS.Android)的机制,在h5页面,我们可以做的 ...

  10. 无星的RN学习之旅(六)-第三方App跳转,苹果商店跳转,loading框

    1.第三方App跳转 这是很常见的问题,第三方app跳转到本app去做一些业务操作. 但是这时候会发现,你跳进来,是黑色的,没有界面,没想到吧23333 其实这在前面说过,RN的想法很独特,是一个ct ...

最新文章

  1. FD.io/VPP — VPP Agent — Overview
  2. python可以自学吗-python自学行吗
  3. malloc 两种实现方式:brk 和 mmap
  4. 清华大学 2011 春季学期 lt;现代软件工程gt; 课程表
  5. 风变编程python论文_如何看待风变编程的 Python 网课?
  6. php字符串如何比较大小写,PHP字符串函数strcmp(二进制安全比较字符串,区分大小写)...
  7. 10.Springcloud的Zuul
  8. Android中Adapter之BaseAdapter使用
  9. 港股历史行情数据 API 接口
  10. 利用递归层次遍历句法结构树(Stanfordcorenlp及nltk)
  11. 劣币驱逐良币,人吃人的中国职场环境还能走多远
  12. 哪种程序员最挣钱?平均月薪30.8K,网友说这是掌握世界的技术
  13. 在材料技术方面的进步使游戏改变了MLCC的性能
  14. 高一到高三计算机笔记,高中数学笔记总结高一至高三,很全.doc
  15. iPad可以用来学计算机吗,我的ipad都用来做什么?学习娱乐两不误
  16. java后端研发经典面试题总结二
  17. OpenStack+Ceph存储空间回收
  18. 活猫还是死猫?| 薛定谔的猫 | 儿童故事
  19. ai人工智能换脸原理_他们如何看待AI监视内部工作原理
  20. 【web 前端面试笔试题自总结】

热门文章

  1. 巨头争云存储祭免费旗 或重演视频业消耗战
  2. 解决华为手机、平板系统没有录屏、不能分享录屏的问题
  3. 树莓派(RPi) CentOS7扩展内存卡剩余空间
  4. 谈谈如何提升工作效率,需要从这4方面入手!
  5. PS 批处理切图去空白
  6. 数学建模番外篇1:PPT绘制3D图形
  7. carry函数在C语言中用法,carry的用法总结大全
  8. 中国股市的发展进程,审核制到注册制利国利民
  9. SQL分组统计-每个学科前三名
  10. 如何查看计算机连接的打印机驱动,打印机已经连接电脑了。360驱动大师怎么检查不出来打印机驱动在那里?...