本文介绍: 在很多业务场景中,需要点击短信链接跳转到App指定页面。在Android系统中,想要实现这个功能可以通过DeepLink或AppLink实现。 DeepLink是Android系统最基础、最普遍、最广泛的外部唤起App的方式,不受系统版本限制。 当用户点击链接时,系统会弹出弹窗用户选择使用哪个App来处理这个链接,如下图所示: 在AndroidManifest文件需要唤起的activity加入intentfilter监听对应链接代码如下: 注意:由于一个inte

一.概述

    在很多业务场景中,需要点击短信链接跳转到App的指定页面。在Android系统中,想要实现这个功能可以通过DeepLink或AppLink实现

二.方案

1.DeepLink

    DeepLink是Android系统最基础、最普遍、最广泛的外部唤起App的方式,不受系统版本限制

1.1 方案效果

    当用户点击链接时,系统会弹出弹窗用户选择使用哪个App来处理这个链接,如下图所示
在这里插入图片描述

1.2 使用流程

1.2.1 配置监听链接

    在AndroidManifest文件需要唤起的activity加入intentfilter监听对应的链接。代码如下

<intent-filter&gt;
    <action android:name="android.intent.action.VIEW" /&gt;

    <category android:name="android.intent.category.DEFAULT" /&gt;
    <category android:name="android.intent.category.BROWSABLE" /&gt;

    <data
        android:host="yuwen.ggl.cn"
        android:scheme="http" /&gt;
    <data
        android:host="yuwen.ggl.cn"
        android:scheme="https" />
    <data
        android:host="ggl.ggl"
        android:scheme="prek" />
</intent-filter>

    注意:由于一个intent-filter多个dataschemehostpath等会进行组合。因此,按照上面XML的配置最后生成6个链接,如下所示

    可以通过每个data单独设置一个intent-filter来避免这个问题

    若需要监听指定路径,可以通过设置path属性实现代码如下:

    <data
        android:path="/app"
        android:host="yuwen.ggl.cn"
        android:scheme="https" />

    https://yuwen.ggl.cn/app跳转https://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> //✅

    缺点:不支持schemehttp和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 解析链接携带的数据

    以https://yuwen.ggl.cn/app?a=123&amp;b=’ggl’为例,代码如下:

val data:Uri? = intent.data // https://yuwen.ggl.cn/app?a=123&amp;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,弹出窗口如下:
在这里插入图片描述
    窗口中四个选项功能如下:

    选择第三项,帮助生成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目录下。可通过浏览器进行访问https://yuwen.ggl.cn/.well-known/assetlinks.json

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文件的部署要求
2.3.2 assetlinks.json文件的验证时机

三.总结

1.DeepLink

在这里插入图片描述

2.AppLink

在这里插入图片描述

原文地址:https://blog.csdn.net/LeeDuoZuiShuai/article/details/133491270

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_27840.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注