最近正好在整治外投拉端拉下载的事,借这个机会整理了一下 URL SCHEME 唤端的应用和原理。本文主要会从手机系统层面、APP容器层面去讲解 URL SCHEME 的工做原理,好比在浏览器中输入一个scheme后为何可以打开一个APP,中间到底发生了什么。本文主要涉及的知识点:前端
通常来讲,咱们的手机上会有不少的我的信息,好比联系人、银行卡、我的照片等,若是任何一个安装的应用均可以随意获取这些信息,就会形成严重的隐私泄漏。为了解决这个问题,苹果官方提出了一个叫作沙盒机制的方案,就是全部的应用只能去访问系统声明可访问的资源,这样就避免了用户隐私的泄漏,可是这个机制在保护用户隐私的同时,也阻断了多个应用间的信息共享和消息通讯的能力。好比你想将一些事件添加到日历里,或者你想打开某个其余的app,就变得很是困难,因而就有了url scheme 的解决方案。起初url scheme只针对一些内置应用开放,好比日历、短信、邮件,后来才逐渐演变成了全部app均可以进行scheme注册和访问。ios
一个完整的 url scheme 格式以下,它主要由四个部分组成,前面的 app 就是应用的一个 scheme 标识,好比淘宝的标识为 taobao,微信的标识为 weixin,后面的item就是打开应用后须要访问的路由,再后面就是一系列参数的key值和value值,其中scheme部分将被系统识别并完成app打开行为,后面的参数将由app自身完成解析和处理。web
# {scheme}://{action}?{parameter}={value}&{parameter}={value}...
app://item?id=${itemId}&ut_sk=${utSk}&spm=widle.12011849.1.1
复制代码
scheme 的注册很是随意,以IOS为例,安装包中有一个标准的配置文件,文件名叫 info.plist,在应用被安装的时候会进行 scheme 的注册,注册的格式如截图所示,它的关键字叫 CFBundleURLSchemes,下面是具体的value值,这个截图是微信真实的配置文件,从这个文件里面能够看出,咱们能够经过weixin://唤起微信客户端,也能够经过wechat://去唤起客户端,甚至能够经过QQ41C152CF去唤起客户端,好比浏览器输入QQ41C152CF://,就能够打开微信客户端。浏览器
对于一些比较知名的app,好比微信微博淘宝,能够直接经过搜索就能够找到,可是对于一些小众的app,好比火山小视频、积目盒子等,可能就很难搜索到了,这个时候就只能本身去拆包。下面是详细的拆包教程:安全
对于前端来讲,唤端其实很容易,只须要经过 location.href 完成唤端跳转便可,若是跳转无反应,大几率是被拦截了bash
# 跳转微信
location.href = 'weixin://'
复制代码
更底层的,ios系统提供了一个openURL的系统方法,能够用来打开一个连接,若是连接头是某app的scheme,就会打开对应的app,ios示例代码以下,若是你的唤端scheme在app的跳转白名单内,就会经过openURL完成跳转逻辑微信
# 建立一个url对象
NSURL *url = [NSURL URLWithString:@"weixin://"];
# 调用openURL打开url
[[UIApplication sharedApplication] openURL:url];
复制代码
出于安全考虑或者出于商业目的,大部分app都会管控跳转白名单,好比微信就禁止跳转淘宝,若是你尝试在页面内访问 taobao:// ,是不会有任何反应的。这里的拦截逻辑一般出如今webview层面,当页面发起一次地址请求时,会触发webview的从新加载事件,而客户端就能够监听这次事件并决定是否要执行,以ios为例,经过shouldStartLoadWithRequest能够完成监听和拦截,若是返回YES,就表示容许本次加载,若是返回NO,则表示阻止本次加载,在这个方法中,客户端能够请求服务端校验地址是否在白名单内并决定是否要继续加载。markdown
# YES表示容许加载url
# NO表示阻止加载url
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if (特殊schema && 校验成功) {
# 打开第三方APP
return NO;
} else if (url校验成功) {
return YES;
} else{
return NO;
}
}
复制代码
当H5发起scheme跳转时,会触发webview的从新加载事件,此事件会被客户端劫持并进行白名单校验,若是经过则调用系统方法openURL完成app跳转(前提是该scheme被其余app注册过) app
虽然url scheme是目前应用最广的唤端方案,可是它仍然存在不少的局限性。编辑器
url scheme实际上是很是很是不安全的,由于苹果官方没有限制app定义的scheme名称,也就是说,任何一个app,均可以注册一个叫taobao的scheme,并且,苹果的原则是后来先上,就是越晚注册的app,优先被唤起,因此若是有恶意app进行scheme劫持,就会很容易出现钓鱼现象,好比模仿一个淘宝商城而后骗取用户资金。
那么要怎么样去防御呢?其实并无很好的防御方式,由于scheme没有版权一说,谁均可以进行注册,可是能够在用户访问app的时候给本身发送一条消息,好比打开淘宝后向taobao://发起调用,若是能正常接收到信息就表示没有被劫持,若是没有收到就表明scheme已经被恶意劫持了,此时能够友善地提醒用户卸载冲突的app。