前言
在 Android 6.0 之前,点击一个链接会产生一个对话框,询问用户打开哪个应用。但是谷歌在 Android 6.0 实现了一个自动认证机制 — App Links,让开发者可以避开这个弹出框,使用户不必去选择一个列表,直接跳转到我们的 app 中。
和 URL Scheme 的区别
下表列举了一些 App Links
和 URL Scheme
这两种短链唤起 app 的一些区别,主要差异在于使用 App Links,可以在保证安全的前提下,无缝打开 App 提高用户体验,缺点为仅支持 Android 6.0 以上的系统。
区别项 | App Links | URL Scheme |
---|---|---|
Intent URL Scheme | http、https | http、https、自定义scheme |
Intent Action | android.intent.action.View | 任何 action |
Intent Category | android.intent.category.BROWSABLE android.intent.category.DEFAULT |
任何 category |
链接验证 | 验证 | 不验证 |
用户体验 | 不弹 App 选择框,直接打开 App | 会打开一个弹窗让你选择用哪个应用打开,或者跳转到默认浏览器 |
兼容性 | Android 6.0 及以上 | 所有 Android 版本 |
如何实现 App Links
Android studio 提供了 App Links Assistant
(以下称工具)来帮助开发者快速开发 App Links。
一、在 AndroidManifest 中创建需要配置的 intent filter
- 点击
Tools
→App Links Assistant
- 点击
Open URL Mapping Editor
,点击+
去添加一个URL Mapping
- 在弹出的
Add URL Mapping
对话框中输入对应内容,完成添加
其他:顺便解释下path
、pathPrefix
、pathPattern
之间的区别
- path 用来匹配完整的路径,如:
http://example.com/test/abc.html
,这里将 path 设置为 /test/abc.html 才能够进行匹配; - pathPrefix 用来匹配路径的开头部分,这里将 pathPrefix 设置为 /test 就能进行匹配了;
- pathPattern 用表达式来匹配整个路径,这里需要说下匹配符号与转义。
匹配符号:
“” 用来匹配0次或更多,如:“a” 可以匹配“a”、“aa”、“aaa”…
“.” 用来匹配任意字符,如:“.” 可以匹配“a”、“b”,“c”…
点击 OK 后,就会在 AndroidManifest 文件中生成如下内容:
注意:这里只演示了单个域名下的配置,如果需要支持多域名,可以配置多个 <intent-filter />,也可以在同一个 <intent-filter /> 中写多个 <data />,不过同一个 <intent-filter /> 下的 <data/> 元素会进行组合。
二、处理 Intent
如果你想要处理从 App Links 跳转来的 URL 代码,可点击工具中的 Select Activity
,选取目标 Activity,然后会自动在 Activity 中插入如下代码:
三、生成 asserlinks.json
- 为了在应用安装成功后,系统能自动验证该应用是否有权使用对应域名,系统会向
https://image.daixc.com/.well-known/assetlinks.json
请求数据,根据获取到的文件内容,验证应用域名的合法性。 - 点击工具中的
Open Digital Asset Links File Generator
,开始生成 asserlinks.json 文件,并检查其有效性。 - 首先是配置好域名、包名、keystore,然后点击生成 assetlinks.json,点击保存到本地,然后将文件上传到
https://域名/.well-known/assetlinks.json
,点击测试能否显示内容。
可以看到 asserlinks.json,主要是配置了你的应用信息,以及在 website 上的位置,因此在使用时,我们会遇到以下场景:
场景一:多个应用关联一个域名
假如你有多个应用想共用一份 assetlinks.json 文件,可以添加多个应用信息,只需修改 package_name
和 `sha256_cert_fingerprints`` 的值即可,其他的不用动。
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.my.app1",
"sha256_cert_fingerprints": ["你的sha256值"]
}
},
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.my.app2",
"sha256_cert_fingerprints": ["你的sha256值"]
}
}]
场景二:单个应用关联多个域名
把 assetlinks.json 上传到多个域名下即可,路径为 https://你的域名/.well-known/assetlinks.com
四、测试
使用工具中的 Test App Links
进行测试,配置好测试 URL,Run Test
等待运行即可。
实测数据
机型 | Android 系统 | 短信中点击链接,实际表现 |
---|---|---|
小米 10 | Android 11 | 能直接唤起 App |
小米 MIX 2 | Android 8 | 能直接唤起 App |
荣耀 Magic 2 | Android 9 | 不能直接唤起 App,但是默认App中会出现我们的应用 |
一加9 | Android 11 | 不能直接唤起 App,会直接打开网址,因为是 ColorOS 系统,表现和 OPPO 一致 |
华为 Mate 30 pro | 鸿蒙 2.0.0 | 能直接唤起 App |
魅族Pro 6s | Android 7.1.1 | 能直接唤起 App |
OPPO realme V5 | Android 11 | 不能直接唤起 App,会直接打开网址 |
方案实施
经测试,在不同的厂商下 App Links 存在一定的兼容性,且仅支持 Android 6.0 以上的系统,故计划同时支持 App Links 和 URL Scheme,如下:
如图,短链表现为
https://image.daixc.com/h
对于不支持 App Links 的机型,会使用浏览器打开此页面,届时再通过 eloan 的 Scheme 唤起 LauncherActivity;
对于支持 App Links 的机型,会直接唤起 LauncherActivity;