URL SCHEME 唤端

前言

最近正好在整治外投拉端拉下载的事,借这个机会整理了一下 URL SCHEME 唤端的应用和原理。本文主要会从手机系统层面、APP容器层面去讲解 URL SCHEME 的工做原理,好比在浏览器中输入一个scheme后为何可以打开一个APP,中间到底发生了什么。本文主要涉及的知识点:前端

  1. url scheme 的组成结构
  2. app 如何注册 scheme 信息
  3. 对于一些不知名app,怎么去获取它的scheme信息
  4. 如何经过scheme打开一个app
  5. 为何在有些平台scheme会被拦截

诞生背景

通常来讲,咱们的手机上会有不少的我的信息,好比联系人、银行卡、我的照片等,若是任何一个安装的应用均可以随意获取这些信息,就会形成严重的隐私泄漏。为了解决这个问题,苹果官方提出了一个叫作沙盒机制的方案,就是全部的应用只能去访问系统声明可访问的资源,这样就避免了用户隐私的泄漏,可是这个机制在保护用户隐私的同时,也阻断了多个应用间的信息共享和消息通讯的能力。好比你想将一些事件添加到日历里,或者你想打开某个其余的app,就变得很是困难,因而就有了url scheme 的解决方案。起初url scheme只针对一些内置应用开放,好比日历、短信、邮件,后来才逐渐演变成了全部app均可以进行scheme注册和访问。ios

URL SCHEME 组成结构

一个完整的 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

scheme 的注册很是随意,以IOS为例,安装包中有一个标准的配置文件,文件名叫 info.plist,在应用被安装的时候会进行 scheme 的注册,注册的格式如截图所示,它的关键字叫 CFBundleURLSchemes,下面是具体的value值,这个截图是微信真实的配置文件,从这个文件里面能够看出,咱们能够经过weixin://唤起微信客户端,也能够经过wechat://去唤起客户端,甚至能够经过QQ41C152CF去唤起客户端,好比浏览器输入QQ41C152CF://,就能够打开微信客户端。浏览器

如何查找其余APP的scheme

对于一些比较知名的app,好比微信微博淘宝,能够直接经过搜索就能够找到,可是对于一些小众的app,好比火山小视频、积目盒子等,可能就很难搜索到了,这个时候就只能本身去拆包。下面是详细的拆包教程:安全

  1. 须要安装一个应用助手,我使用的是爱思助手,在应用助手中搜索微信并下载

  1. 找到下载的文件,通常是ipa文件,右键进行解压

  1. 解压完成后咱们找到payload里面的WeChat包,右键点击显示包内容

  1. 找到info.plist 文件,在编辑器中打开,而后搜索 CFBundleURLSchemes 就能够看到该APP全部的scheme信息了。

如何打开一个 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];
复制代码

scheme被拦截

出于安全考虑或者出于商业目的,大部分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是目前应用最广的唤端方案,可是它仍然存在不少的局限性。编辑器

  1. 没法判断是否唤起成功,虽然app能够经过canOpenURL来判断可否打开,可是数量有限,且只适用于ios,大部分场景下仍然不能正常判断。h5常见的应对方案是监听页面离开事件,好比2s内离开的认为跳转成功,2s后还停留在页面的认为跳转失败,能够进行一些下载引导。
  2. 用户流失率高,由于不少的app或者浏览器都会有一个弹窗来二次确认是否须要打开某某app,在这一步会有很高的用户流失率。
  3. 很容易被商业屏蔽,由于url scheme很容易就能被拦截,出于商业缘由,不少平台都会限制跳转其余app。

url scheme的不安全性

url scheme实际上是很是很是不安全的,由于苹果官方没有限制app定义的scheme名称,也就是说,任何一个app,均可以注册一个叫taobao的scheme,并且,苹果的原则是后来先上,就是越晚注册的app,优先被唤起,因此若是有恶意app进行scheme劫持,就会很容易出现钓鱼现象,好比模仿一个淘宝商城而后骗取用户资金。

那么要怎么样去防御呢?其实并无很好的防御方式,由于scheme没有版权一说,谁均可以进行注册,可是能够在用户访问app的时候给本身发送一条消息,好比打开淘宝后向taobao://发起调用,若是能正常接收到信息就表示没有被劫持,若是没有收到就表明scheme已经被恶意劫持了,此时能够友善地提醒用户卸载冲突的app。

相关文章
相关标签/搜索