如何自动打开你的 App?
相信大家在刷 某博 / 某书 / 某音 的时候,最能体会什么叫做 条条大路通 tao bao。经常是你打开一个 App,不小心点了下屏幕,就又打开了另一个 App 了。
那么这种自动打开一个 App 到底是怎么实现的呢?
URL Scheme
首先是最原始的方式 URL Scheme。
URL Scheme 是一种特殊的 URL,用于定位到某个应用以及应用的某个功能。
它的格式一般是: [scheme:][//authority][path][?query]
scheme 代表要打开的应用,每个上架应用商店的 App 所注册的 scheme 都是唯一的;后面的参数代表应用下的某个功能及其参数。
在 IOS 上配置 URL Scheme
在 XCode 里可以轻松配置
在 Android 上配置 URL Scheme
Android 的配置也很简单,在 AndroidManifest.xml 文件下添加以下配置即可
通过访问链接自动打开 App
配置完成后,只要访问 URL Scheme 链接,系统便会自动打开对应 scheme 的 App。
因此,我们可以实现一个简单的 H5 页面来承载这个跳转逻辑,然后在页面中通过调用 location.href=schemeUrl 或者 <a href='schemeUrl' />
等方式来触发访问链接,从而自动打开 App
优缺点分析
优点: 这个是最原始的方案,因此最大的优点就是兼容性好
缺点:
- 通过 scheme url 这种方式唤起 App,对于 H5 中间页面是无法感知的,并不知道是否已经成功打开 App
- 部分浏览器有安全限制,自动跳转会被拦截,必须用户手动触发跳转(即 location.href 行不通,必须 a 标签)
- 一些 App 会限制可访问的 scheme,你必须要在白名单内,否则也会被拦截跳转
- 通过 scheme url 唤起 App 时,浏览器会提示你是否确定要打开该 App,会影响用户体验
DeepLink
通过上述缺点我们可以看出,传统的 URL Scheme 在用户体验上是存在一定缺陷的。
因此,DeepLink 诞生了。
DeepLink 的宗旨就是通过传统的 HTT P链接就可以唤醒app,而如果用户没有安装APP,则会跳转到该链接对应的页面。
IOS Universal Link
在 IOS 上一般称之为 Universal Link。
【配置你的 Universal Link 域名】
首先要去 Apple 的开发者平台上配置你的 domains,假设是: mysite.com
【配置 apple-app-site-association 文件】
在该域名根目录下创建一个 .well-known 路径,并在该路径下放置 apple-app-site-association 文件。
文件内容包含 appID 以及 path,path如果配置 /app 则表示访问该域名下的 /app 路径均能唤起App
该文件内容大致如下:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "xxx", // 你的应用的 appID
"paths": [ "/app/*"]
}
]
}
}
【系统获取配置文件】
上面两步配置成功后,当用户 首次安装App 或者后续每次 覆盖安装App 时,系统都会主动去拉取域名下的配置文件。
即系统会主动去拉取
https://mysite.com/.well-known/apple-app-site-association
这个文件
然后根据返回的 appID 以及 path 判断访问哪些路径是需要唤起哪个App
【自动唤起 App】
当系统成功获取配置文件后,只要用户访问 mysite.com/app/xxx 链接,系统便会自动唤起你的 App。
同时,客户端还可以进行一些自定义逻辑处理:
客户端会接收到 NSUserActivity 对象,其 actionType 为 NSUserActivityTypeBrowsingWeb,因此客户端可以在接收到该对象后做一些跳转逻辑处理。
Android DeepLink
与 IOS Universal Link 原理相似,Android系统也能够直接通过网站地址打开应用程序对应的内容页面,而不需要用户选择使用哪个应用来处理网站地址
【配置 AndroidManifest.xml】
在 AndroidManifest 配置文件中添加对应域名的 intent-filter:
scheme 为 https / http;
host 则是你的域名,假设是: mysite.com
【生成 assetlinks.json 文件】
首先要去 Google developers.google.com/digital-ass… 生成你的 assetlinks json 文件。
【配置 assetlinks.json 文件】
生成文件后,同样的需要在该域名根目录下创建一个 .well-known 路径,并在该路径下放置 assetlinks.json 配置文件,文件内容包含应用的package name 和对应签名的sha哈希
【系统获取配置文件】
配置成功后,当用户 首次安装App 或者后续每次 覆盖安装App 时,系统会进行以下校验:
- 如果 intent-filter 的 autoVerify 设置为 true,那么系统会验证其
- Action 是否为 android.intent.action.VIEW
- Category 是否为android.intent.category.BROWSABLE 和 android.intent.category.DEFAULT
- Data scheme 是否为 http 或 https
- 如果上述条件都满足,那么系统将会拉取该域名下的 json 配置文件,同时将 App 设置为该域名链接的默认处理App
【自动唤起 App】
当系统成功获取配置文件后,只要用户访问 mysite.com/app/xxx 链接,系统便会自动唤起你的 App。
优缺点分析
【优点】
- 用户体验好:可以直接打开 App,没有弹窗提示
- 唤起App失败则会跳转链接对应的页面
【缺点】
- iOS 9 以后才支持 Universal Link,
- Android 6.0 以后才支持 DeepLink
- DeepLink 需要依赖远程配置文件,无法保证每次都能成功拉取到配置文件
推荐方案: DeepLink + H5 兜底
基于前面两种方案的优缺点,我推荐的解决方案是配置 DeepLink,同时再加上一个 H5 页面作为兜底。
首先按照前面 DeepLink 的教程先配置好 DeepLink,其中访问路径配置为 https://mysite.com/app
接着,我们就可以在 https://mysite.com/app
路径下做文章了。在该路径下放置一个 H5 页面,内容可以是引导用户打开你的 App。
当用户访问 DeepLink 没有自动打开你的 App 时,此时用户会进入浏览器,并访问 https://mysite.com/app
这个 H5 页面。
在 H5 页面中,你可以通过浏览器 ua 获取当前的系统以及版本:
- 如果是 Android 6.0 以下,那么可以尝试用 URL Scheme 去唤起 App
- 如果是 IOS / Android 6.0 及以上,那么此时可以判断用户未安装 App。这种情况下可以做些额外的逻辑,比如重定向到应用商店引导用户去下载之类的
来源:juejin.cn/post/7201521440612974649