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


    一.概述

        在很多业务场景中,需要点击短信链接跳转到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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

        注意:由于一个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" />
    
    • 1
    • 2
    • 3
    • 4

        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
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    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> //✅
    
    • 1
    • 2
    • 3

        缺点:不支持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>
    
    • 1

        缺点:格式复杂。部分浏览器不支持。存在信息泄漏安全风险。

        由于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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    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指纹信息]
        }
      }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

        使用指令生成JSON文件中需要的指纹信息,代码如下:

    $ keytool -list -v -keystore my-release-key.keystore
    
    • 1

        替换指纹信息和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"]
      }
    }]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    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
    
    • 1

        得到手机中所有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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

        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

    在这里插入图片描述

  • 相关阅读:
    小程序技术加速信创操作系统国产化替换
    JMeter 扩展插件实现对自定义协议的支持
    开源数据库MySQL 8.0 OCP认证精讲视频、环境和题库 之三 选项、变量
    【新功能】Ambire 钱包集成了 Metis 网络
    JavaScript中的Error错误对象与自定义错误类型
    MongoDB_实战部分(二)
    BUUCTF做题Upload-Labs记录pass-01~pass-10
    Java多线程下载分析方法
    day03 Spring-AOP面向切面编程
    java学习笔记(十一)—— 异常机制
  • 原文地址:https://blog.csdn.net/LeeDuoZuiShuai/article/details/133491270