iOS 唤起APP之URL Scheme
什么是URL Scheme
简单的说,由于苹果选择使用沙盒机制来保障用户的隐私和安全,APP只能访问自己沙盒数据,但同时也阻碍了应用间合理的信息共享。因此苹果提供了一个可以在APP之间跳转的方法:URL Scheme。如果你的APP需要其他APP访问某些功能或者数据,那么你需要在你的APP定义一个相应的URL Scheme。当别的APP使用URL Scheme进行访问时,系统会根据URL Scheme进行匹配,从而来拉起对应的APP。
如何理解URL Scheme
如果想要更清晰的认识URL Scheme电话,我们需要了解下面几个概念:
URL(Uniform Resource Locator:统一资源定位器):也就是我们所属于的"网址",通过它我们可以访问到我们想要的服务和资源,并且URL也可以传递相应的参数,也就是我们常说的GET请求;URL地址格式排列为:scheme://host:port/path,举个栗子:https://www.jianshu.com/u/b09c13696e1c就是个典型的URL,而这个网址对应的Scheme就是https,标识的是一个URL中的一个位置——最初始的位置,也可以理解为一种协议头。而我们自定义的URL Scheme可以理解为一种自定义的协议。- 根据我们上面对
URL Scheme的理解,我们可以很轻易地理解,在以本地应用为主的iOS上,我们可以像定位一个网页一样,用一种特殊的URL来定位一个应用甚至应用里某个具体的功能。而定位这个应用的标识,也就是Scheme。比如微信的Scheme是weixin,打开微信扫一扫功能的URL Scheme则是weixin://dl/scan。
这样一对比就容易很明白的理解出了URL Scheme的真正含义,它是为了在iOS系统中定位对应的App然后执行对应的操作,复杂的URL Scheme还可以传递参数。
URL Scheme的应用场景
- 使用iOS系统预设的
URL Scheme调用系统APP:iOS系统内置的App,如mail,电话等等,都有相应的URL Scheme供其他的APP调用。比如下面的代码就是使用系统的电话APP给18888888888打电话。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://18888888888"]];以下是一些URL Scheme合集:
- [常用的
URL Scheme合集](常用的URL Scheme.md)
使用
URL Scheme让别的应用打开当前APP,自己的APP写好一下可以让其他APP来使用的功能,或者当前APP使用其他APP提供的服务。比如支付宝,当APP使用支付宝支付是,就可以使用支付宝定义好的Scheme来访问支付宝支付功能。因为URL可以携带一些参数因此我们也可以进行一些数据的共享。web页面通过
URL Scheme来使用APP的一些功能。web可以通过window.location.href跳转方式跳转对应的URL Scheme从而来使用APP中一些功能。相对比较常用的URL Scheme的应用场景。进行App内页面跳转。在传统意义上的页面跳转,无非也就是以下几种方式:
- Storyboard的segues方式跳转
- 直接跳转present,dismiss跳转
- UINavigationController的push,pop跳转
这些方式其实都有一个缺点,那就是跳转很不灵活,如果想让一个模块根据需求动态的跳转不同页面,传递不同的参数,那么就必须书写很多复杂的逻辑几句一些情况也选择要跳转的逻辑。
或许你说我可以通过控制器的名字来创建对应的控制器进行动态的跳转,但事实上这样的方式如果仅仅进行跳转还是能满足需求的,但是在传递参数方面就是闲的力不从心。
所以说了那么多,有一种跳转方式可以既满足跳转的动态需求,也可以灵活的传递参数。这种方式就是使用URL Scheme进行动态跳转。这也是我非常推荐的一种使用方式。并且在一些组件化开发的尝试中,这种跳转方式也带来了很多便利。
使用URL Scheme跳转的好处
URL Scheme跳转方式比较灵活,只需要本地进行简单逻辑处理,使用openURL来打开对应的控制器,而这个你想要打开的URL Scheme是可以动态的从服务器动态获取的。那么这样就很简单的实现了动态跳转。- URL Scheme传递参数的方式也与URL一致,只需要简单的在URL里附加上对应的参数即可。
- 这种页面跳转是无差别的,通过URL Scheme跳转可以无缝的在H5页面和原生页面之间跳转传值,而无需做更多的逻辑判断。
使用URL Scheme跳转的缺点
- 写在info.plist文件中的Scheme可能会被一些反编译手段获取到。
- URL Scheme可能会被劫持调来安全隐患,比如支付宝的URL Scheme劫持漏洞。
当然这是避免的,以下引自乌云:
苹果可以限制 iOS 应用不能注册别的应用的 Bundle ID 作为 URL Scheme。这样的话,使用自己的 Bundle ID 作为 URL Scheme 的接收器就会变的安全很多。
第三方应用可以通过①给自己发送 URL Scheme 请求来证明没有被劫持,如果没有收到自己的 URL Scheme,就可以及时给用户发送提醒;②利用 MobileCoreServices 服务中的 applicationsAvailableForHandlingURLScheme() 来查看所有注册了该 URL Schemes 的应用和处理顺序,从而检测自己、或者别人的 URL Scheme 是否被劫持。
注册自定义URL Scheme
注册自定义URL Scheme有两种方式
在工程中的info.plist文件中添加对应的key值



tagets -> info -> URL Types 中添加


这两种注册方式本质上其实是一样的只是位置不同。
URL Scheme相关验证
从其他应用或Safari中使用URL Scheme拉起APP
我们需要在APPdelegate中实现相应的代理方法:
iOS 9.0以下
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
iOS 9.0以上
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
下面我们通过Safari来验证:


- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
NSLog(@"%s",__func__);
NSLog(@"options: %@", options);
NSLog(@"URL scheme:%@", [url scheme]);
NSLog(@"URL query: %@", [url query]);
// 提示并展示query
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开URL Scheme成功"
message:[url query]
delegate:nil
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alertView show];
return YES;
}

在当前应用中使用URL Scheme
在应用中调用URL Scheme需要是以下方法:
iOS10.0以下使用该方法:
- (BOOL)openURL:(NSURL*)url NS_DEPRECATED_IOS(2_0, 10_0, "Please use openURL:options:completionHandler: instead") NS_EXTENSION_UNAVAILABLE_IOS("");
iOS10.0以上使用该方法:
- (void)openURL:(NSURL*)url options:(NSDictionary<UIApplicationOpenExternalURLOptionsKey, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");
还有一个方法可以判断对应URL Scheme是否存在一般和上述方法一起使用:
- (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);
下面来验证一下:
- (void)btnClick:(UIButton *)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"schemeDemo://"] options:@{} completionHandler:^(BOOL success) {
NSLog(@"完成");
}];
}

- 常用的
URL Scheme合集
文章若有不对地方,欢迎批评指正
iOS 唤起APP之URL Scheme的更多相关文章
- iOS通过URL Scheme启动app(收集了常用的app的URL Scheme)
URL Scheme不仅可以打开其他的app,当然你也能为自己的app设置URL Scheme 1.如何设置给app设置URL Scheme 添加URL types字段数组 设置URL identif ...
- 获取一个 app 的 URL Scheme 的方法:
获取一个 app 的 URL Scheme 的方法: 上这个网站 URL Schemes 查一下相应的 app 的 URL Scheme 是否有被收录 第一种方法没找到的话,把相应的 app 的 ip ...
- iOS App 自定义 URL Scheme 设计(转自COCOACHINA)
在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个 ...
- 【转】【iOS开发】打开另一个APP(URL Scheme与openURL)
目标 平常我们做iOS开发,会经常遇到打开其他的APP的功能.本篇文章讲的就是打开别人的APP的一些知识.我们的目标是: 打开别人的APP 让别人打开我们的APP iOS9的适配问题 使用URL Sc ...
- iOS 唤起APP之Universal Link(通用链接)
什么是Universal Link(通用链接) Universal Link(通用链接)是Apple在iOS9推出的一种能够方便的通过传统HTTPS链接来启动APP的功能,可以使用相同的网址打开网址和 ...
- React Native之配置URL Scheme(iOS Android)
React Native之配置URL Scheme(iOS Android) 一,需求分析 1.1,需要在网站中打开/唤起app,或其他app中打开app,则需要设置URL Scheme.比如微信的是 ...
- Url Scheme实现APP间通信、分享
代码地址如下:http://www.demodashi.com/demo/12748.html 简介: URL Scheme就是一个可以让app相互之间可以跳转的对外接口.通过给APP定义一个唯一的U ...
- H5唤起app
H5唤起app 1.判断是否在微信中打开 无论是在哪个平台的客户端Android/IOS,在微信的平台上访问都有一个问题,那就是无法启动客户端,这是微信为了安全性考虑的限制,android这边屏蔽sc ...
- 如何应用前端技术唤起app及判断用户来源及与原生交互的原理
做唤起时需要native端进行配合, h5唤起app这种需求是常见的.在移动为王的时代,h5在app导流上发挥着重要的作用. 目前我们采用的唤起方式是url scheme(iOS,Android平台都 ...
随机推荐
- springboot之jpa支持
相关pom依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- javaWeb核心技术第十四篇之easyui
网站是分为网站的前台和网站的后台. 前台--给用户看的 例如:商城 后台--给管理员看的 例如:商城后台 目的:用来添加维护数据 BootStrap:jsp 页面显示,效果好,美观,适合作为用户界面. ...
- C#中实现文件重命名的方式
场景 在C#中如果是删除文件的话可以直接使用 if (System.IO.File.Exists(fileName)) { System.IO.File.Delete(fileName); } 但是如 ...
- Oracle备份、还原数据库
备份数据库 创建备份目录(用sys账号),若已创建备份目录,此步可忽略 create directory db_bak as 'D:\ ECIMS_DB' --查看创建的目录 select * fro ...
- SharePoint PowerShell 创建网站栏
前言 最近,有这么个需求,需要使用PowerShell为网站集创建网站栏,好吧,直接看代码吧. Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorA ...
- ramfs 和 tmpfs 以及 ramdisk相关调研
最近需要使用到 ramfs 和 tmpfs 做内存文件系统,下面对这两个文件系统相关的信息,做一下总结: 参考链接: https://www.thegeekstuff.com/2008/11/over ...
- Sublime Text 3如何关闭自动更新
1.Preferences -> Settings-User 2.插入下面代码:"update_check": false 如果有其他的设置,用逗号隔开,然后保存 3.Pre ...
- Python踩坑系列之安装pycrypto报错:“Microsoft Visual C++14.0 is required”问题。
由于要使用Python3实现des3加密要使用pycrypto模块,所以使用pip install pycrypto 来安装,然后就常规性掉坑.安装报错“Microsoft Visual C++14. ...
- linux 安装程序的方式
linux 安装程序的方式 通用二进制格式(绿色软件,打开即用) 软件包管理器(rpm) 软件包管理器的前端工具(yum) 源代码编译
- 2019年最新50道java基础部分面试题(三)
前21题请看之前的随笔 22.面向对象的特征有哪些方面 计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中的业务其实就是一个个对象协作的过程.面向对象编程就是按现实业务一样的方式将程序代码 ...