【Android】点击短信链接唤起APP的方案实践

news2024/11/16 19:34:01

一.概述

    在很多业务场景中,需要点击短信链接跳转到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个链接,如下所示:

  • http://yuwen.ggl.cn
  • https://yuwen.ggl.cn
  • prek://ggl.ggl
  • prek://yuwen.ggl.cn
  • http://ggl.ggl
  • https://ggl.ggl

    可以通过为每个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> //✅

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

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

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目录下。可通过浏览器进行访问: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文件的部署要求
  • 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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

源码开发经验:构建直播带货系统的关键步骤

在数字时代&#xff0c;直播带货已成为一种引领电子商务发展的热门趋势。无论您是一家电商巨头还是一位创业者&#xff0c;构建自己的直播带货平台都可能是一个具有巨大潜力的业务机会。本文将深入探讨构建直播带货平台的关键步骤&#xff0c;带您走进这一蓬勃发展的领域。 第…

每日提醒按时完成各项任务的手机app有什么?

快节奏的生活及工作压力下&#xff0c;很多事情处理起来也比较紧张&#xff0c;有时候我们需要抽出一丁点空闲的时间来处理非常重要的事情&#xff0c;而此时一定要把握好处理工作任务的时间&#xff0c;因此&#xff0c;时间观念要强在生活及工作中就变得非常重要&#xff0c;…

【RabbitMQ 实战】10 消息持久化和存储原理

一、持久化 1.1 持久化对象 rabbitmq的持久化分为三个部分&#xff1a; 交换器的持久化。队列的持久化。消息的持久化。 1.1.1 交换器持久化 交换器的持久化是通过在声明交换器时&#xff0c; 指定Durability参数为durable实现的。若交换器不设置持久化&#xff0c;在rabb…

【Node.js】zlib 模块

const fs require(fs) const zlib require(zlib)const gzip zlib.createGzip()const readstream fs.createReadStream(./avatar/1.txt) const writestream fs.createWriteStream(./avatar/2.txt)// 在写入之前压缩文件 readstream.pipe(gzip).pipe(writestream)可以明显看…

【Qt】QMainWindow

文章目录 **QMainWindow**简介菜单栏工具栏状态栏**铆接部件**核心部件&#xff08;中心部件&#xff09; 资源文件QtCreator导入资源文件VS导入资源文件使用资源文件 QMainWindow简介 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08;menu …

AMP 软中断的过程和GPIO中断差别

ZYNQ笔记&#xff08;5&#xff09;&#xff1a;软中断实现核间通信 - 咸鱼IC - 博客园 (cnblogs.com) ZYNQ基础----AMP核间软中断_zynq核间中断-CSDN博客 相较于GPIO中断&#xff0c;省去了对中断触发敏感类型的配置&#xff08;软中断不可配&#xff09;&#xff0c;对中断管…

session是什么?cookie是什么,两者的区别,以及应用的场景?

Session和Cookie是两个常见的Web开发中用于状态管理的概念。Session是服务器端用来存储用户信息的一种机制。Cookie是一种存储在客户端浏览器中的小型文本文件。 当用户访问一个网站时&#xff0c;服务器为该用户创建一个唯一的Session&#xff0c;并生成一个Session ID。这个…

【CVPR 2023】 All are Worth Words: A ViT Backbone for Diffusion Models

All are Worth Words: A ViT Backbone for Diffusion Models, CVPR 2023 论文&#xff1a;https://arxiv.org/abs/2209.12152 代码&#xff1a;https://github.com/baofff/U-ViT 解读&#xff1a;U-ViT: A ViT Backbone for Diffusion Models - 知乎 (zhihu.com) All are W…

Vue实现简单的接口封装

1. 在src中创建一个api文件夹 2. 按功能、模块等新建对应的js文件 3. 在内部写对应的封装接口&#xff0c;并导出 import axios from "axios";/*** 接口名称&#xff1a;* 接收参数&#xff1a;* 返回参数&#xff1a;* */export const miens ()>{return new P…

Linux下启动jar包的几种常见方式

首先把这两个jar上传到linux ,会操作启动一个应用和同时启动多个应用 两个项目jar已上传&#xff0c;可去这里下载&#xff1a; https://download.csdn.net/download/zengzhaowu313/88411336 第一种、直接启动 jar 包 &#xff0c;先启动一个应用程序 &#xff0c;后面操作启…

上交所证券代码段分配规则

一、证券代码定义及编码原则 上海证券交易所证券代码采用6位阿拉伯数字编码&#xff0c;取值范围为000000-999999。6位代码的前3位为类别标识区&#xff0c;其中第一位为类别标识&#xff0c;第二位至第三位为业务标识&#xff0c;6位代码的后3位为顺序编码区&#xff1a; 二、…

计算机算法分析与设计(8)---图像压缩动态规划算法(含C++代码)

文章目录 一、知识概述1.1 问题描述1.2 算法思想1.3 算法设计1.4 例题分析 二、代码 一、知识概述 1.1 问题描述 1. 一幅图像的由很多个像素点构成&#xff0c;像素点越多分辨率越高&#xff0c;像素的灰度值范围为0~255&#xff0c;也就是需要8bit来存储一个像素的灰度值信息…

MS2401隔离式调制器可pin对pin兼容AD7401/AMC1305

MS2401是一款二阶Σ-Δ调制器&#xff0c;集成片上数字隔离器&#xff0c;能将模拟输入信号转换为高速1位码流。可pin对pin兼容AD7401/AMC1305&#xff0c;可兼容AD7701/AMC1306。调制器对输入信号连续采样&#xff0c;无需外部采样保持电路。模拟信号输入满量程为320mV&#x…

win10通过导入注册表快速添加小鹤双拼

环境:win10 win10通过导入注册表快速添加小鹤双拼 fly.reg win10导入附件中的注册表,系统将会自动添加小鹤双拼方案,并将小鹤双拼方案设置为默认。 将下面的代码复制并保存到reg文件中 Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Microsoft\InputMe…

mysql作业-牛客

1 这个题已经为咱创建了表&#xff0c;所以直接输出就行。 select * from user_profile;2 查询多列&#xff0c;在select 后加上对应的列名即可 select device_id,gender,age,university from user_profile;3. 查询结果要求去重&#xff0c;在select 后加上distinct 再加上对…

2024年元旦怎么放假?元旦放假时间安排表记录到待办APP

结束了为其8天的中秋国庆长假&#xff0c;已经有不少网友开始期待下一个重要节日的到来了&#xff0c;它就是2024年的元旦。那么2024年元旦怎么放假&#xff1f;元旦放假时间安排表你知道吗&#xff1f;其实2024年1月1日是星期一&#xff0c;所以元旦放假时间是2023年12月30日—…

首批成员单位 | 聚铭网络受邀加入中国人工智能产业发展联盟数据委员会

近日&#xff0c;中国人工智能产业发展联盟(简称AIIA&#xff09;成立“数据委员会”&#xff0c;**聚铭网络受邀加入&#xff0c;成为首批成员单位&#xff0c;**与其他成员单位协同推动人工智能产业发展。 中国人工智能产业发展联盟是在国家发展和改革委员会、科学技术部、工…

【网络基础必看】计算机网络 Web与HTTP详解:中科大郑烇老师笔记 (三)

目录 0 引言1 基本概念2 HTTP2.1 HTTP概况2.1.1 HTTP的主要特点2.1.2 持久HTTP和非持久HTTP2.1.3 HTTP请求报文2.1.4 HTTP响应报文 2.2 用户-服务器状态&#xff1a;Cookies2.3 请求-响应模型2.4 Web缓存&#xff08;代理服务器&#xff09; &#x1f64b;‍♂️ 作者&#xff…

spring:详解控制反转IOC和AOP

文章目录 IOC工厂模式实例基于xml管理Bean基于注解管理Bean常用注解&#xff1a;用于创建对象的常用注解&#xff1a;用于注入数据的常用注解&#xff1a;和生命周期相关的(了解)常用注解&#xff1a;新注解 IOC IOC (Inversion of Control)是Spring的核心概念之一。它是指控制…

【SoC FPGA】HPS启动过程

SoC HPS启动流程 Boot ROMPreloaderBoot Loader HPS的启动是一个多阶段的过程&#xff0c;每一个阶段都会完成对应的工作并且将下一个阶段的执行代码引导起来。每个阶段均负责加载下一个阶段。第一个软件阶段是引导 ROM&#xff0c;引导 ROM 代码查找并且执行称为预加载器的第 …