一.概述
在许多事务场景中,需求点击短信链接跳转到App的指定页面。在Android体系中,想要完成这个功用,能够经过DeepLink或AppLink完成。
二.方案
1.DeepLink
DeepLink是Android体系最根底、最遍及、最广泛的外部引发App的方法,不受体系版本约束。
1.1 方案作用
当用户点击链接时,体系会弹出弹窗让用户挑选运用哪个App来处理这个链接,如下图所示:
1.2 运用流程
1.2.1 装备监听链接
在AndroidManifest文件中需求引发的activity中参加intent-filter,监听对应的链接。代码如下:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="yuwen.ggl.cn"
android:scheme="http" />
<data
android:host="yuwen.ggl.cn"
android:scheme="https" />
<data
android:host="ggl.ggl"
android:scheme="prek" />
</intent-filter>
留意:由于一个intent-filter中多个data,scheme、host、path等会进行组合。因而,按照上面XML的装备,最后会生成6个链接,如下所示:
- yuwen.ggl.cn
- yuwen.ggl.cn
- prek://ggl.ggl
- prek://yuwen.ggl.cn
- ggl.ggl
- ggl.ggl
能够经过为每个data独自设置一个intent-filter来避免这个问题。
若需求监听指定的途径,能够经过设置path特点完成,代码如下:
<data
android:path="/app"
android:host="yuwen.ggl.cn"
android:scheme="https" />
点击 yuwen.ggl.cn/app 跳转,点击 yuwen.ggl.cn 不跳转。
1.2.2 点击短信中的链接
大多数接近原生的Android体系会弹出如下弹窗,让用户挑选运用哪个app打开该链接,如下图所示: 一些被魔改正的国产Android体系,会直接运用浏览器打开链接。
一起,通常情况下浏览器都会监听悉数的http和https协议的链接,代码如下:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="*"
android:scheme="http" />
<data
android:host="*"
android:scheme="https" />
</intent-filter>
1.2.3 经过浏览器引发app
浏览器引发app共有两种方法,一种是经过自定义Scheme完成,一种是经过Intent Scheme完成。
1)自定义的Sheme
语法格局:scheme://host/path?parameters
<a href = "http://yuwen.ggl.cn"> 点击跳转 </a> //❌
<a href = "https://yuwen.ggl.cn"> 点击跳转 </a> //❌
<a href = "prek://ggl.ggl"> 点击跳转 </a> //✅
缺陷:不支撑scheme为http和https等非自定义scheme。部分浏览器不支撑。存在信息泄漏安全危险。
2)Intent Scheme
语法格局:intent:Host/Uri_path#Intent;package=[String];action=[String];component=[String];scheme=[String];end
<a href = "intent:prek://ggl.ggl#Intent;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;end"> 点击跳转 </a>
缺陷:格局复杂。部分浏览器不支撑。存在信息泄漏安全危险。
由于Intent Scheme格局过于复杂,因而能够经过Android Studio生成,代码如下:
var schemeUri = Intent().apply {
action = Intent.ACTION_VIEW
addCategory(Intent.CATEGORY_DEFAULT)
addCategory(Intent.CATEGORY_BROWSABLE)
data = Uri.parse("prek://ggl.ggl")
}.toUri(0)
// prek://ggl.ggl#Intent;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;end
1.2.4 解析链接携带的数据
以yuwen.ggl.cn/app?a=123&b…为例,代码如下:
val data:Uri? = intent.data // https://yuwen.ggl.cn/app?a=123&b='ggl'
val scheme:String? = data?.scheme // https
val host:String? = data?.host // yuwen.ggl.cn
val path:String? = data?.path // /app
val valueA:String? = data?.getQueryParameter("a") // 123
val valueB:String? = data?.getQueryParameter("b") // 'ggl'
2.AppLink
AppLink是DeepLink升级版,只支撑Android6.0以上。
2.1 方案作用
当用户点击链接时,体系会直接引发对应的App处理这个链接,如下图所示:
2.2 运用流程
2.2.1 装备监听链接
在AndroidManifest文件中需求引发的activity中参加intent-filter,监听对应的链接。留意:scheme只能为http或https。代码如下:
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="yuwen.ggl.cn"
android:scheme="http" />
<data
android:host="yuwen.ggl.cn"
android:scheme="https" />
</intent-filter>
2.2.2 生成assetlinks.json文件
assetlinks.json文件共有两种生成方法,一种是对已有的assetlinks.json文件中的中心参数进行替换,一种是运用Android Studio生成assetlinks.json文件。
1)对已有的assetlinks.json文件中的中心参数进行替换 assetlinks.json文件格局如下:
[
{
"relation": [
"delegate_permission/common.handle_all_urls"
],
"target": {
"namespace": "android_app",
"package_name": "build.gradle里定义的application ID",
"sha256_cert_fingerprints": [使用签名的SHA256指纹信息]
}
}
]
运用指令生成JSON文件中需求的指纹信息,代码如下:
$ keytool -list -v -keystore my-release-key.keystore
替换指纹信息和App包名。
2)运用Android Studio生成assetlinks.json文件 在Android Studio中点击Tools,然后在弹出的列表中挑选App Links Assistant,弹出窗口如下: 窗口中四个选项的功用如下:
- 1️⃣ 协助增加需求监听的链接到AndroidManifest中指定的Activity。
- 2️⃣ 协助向处理对应链接的Activity中增加解析Intent中携带的参数的代码。
- 3️⃣ 协助生成assetlinks.json文件
- 4️⃣ 验证链接对应域名是否正确布置JSON文件
挑选第三项,协助生成assetlinks.json文件,如下图所示: 在当前窗口中填写域名和使用ID,挑选对应的密钥库,最后生成文件并保存,生成文件如下所示:
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.prek.android.ef",
"sha256_cert_fingerprints":["FA:89:53:F3:5E:8D:AD:CF:EC:9A:79:6B:B5:48:50:CC:8A:BC:85:9E:21:9C:03:91:38:88:AA:39:6B:83:6C:3A"]
}
}]
2.2.3 布置assetlinks.json文件
将生成的assetlinks.json文件放到对应监听的域名的.well-known目录下。可经过浏览器进行拜访:yuwen.ggl.cn/.well-known…。
2.2.4 检查验证状态
经过adb指令检查验证状态,代码如下:
adb shell dumpsys package d
得到手机中所有App的AppLink验证信息,如下所示:
Package: com.prek.android.ef
Domains: yuwen.ggl.cn
Status: ask
Package: com.zhihu.android
Domains: www.zhihu.com promotion.zhihu.com oia.zhihu.com zhuanlan.zhihu.com ms.zhihu.com
Status: always : 200000000
Package: com.taptap
Domains: d.taptap.com www.taptap.com
Status: always : 200000000
ask未经过验证,always已经过验证。
2.3 留意事项
2.3.1 assetlinks.json文件的布置要求
- assetlinks.json文件的content-type有必要为application/json。
- 不管监听链接的scheme为http或https,assetlinks.json有必要能经过HTTPS链接拜访。
- assetlinks.json有必要能不经过任何重定向被拜访到,一起能够被爬虫拜访到(robot.txt有必要答应抓取/.well-known/assetlinks.json)。
- 如果使用支撑多种域名,需求把assetlinks.json发布在这几个域名的服务器上。
2.3.2 assetlinks.json文件的验证机遇
- App装置后(没有–>有),体系对会进行验证。若验证状态为经过,则覆盖装置后,不会进行验证。若验证状态为不经过,则每次覆盖装置后,会重新进行验证,直到验证状态为经过。
- App卸载再装置后会进行验证。
- 新版本中域名发生变化,覆盖装置后会进行验证。
- 验证进程需求联网,不然验证不经过。若验证不经过,则AppLink退化为DeepLink。
- 经过在浏览器中输入网址拜访/.well-known文件夹下JSON文件的方法,无法触发验证。
三.总结
1.DeepLink
2.AppLink