当前位置: 首页 > news >正文

【大前端】Android Deep Link 技术详解与实践指南

🚀 Android Deep Link 技术详解与实践指南

在 Android 应用开发中,我们经常会遇到这样的场景:

  • 从短信、网页、推送或第三方 App 点击链接后,直接打开自己 App 的指定页面

  • H5 页面跳转 App 实现无缝衔接;

  • 营销活动链接带参数打开应用指定内容。

这些功能的核心实现手段,就是 Deep Link(深度链接)


一、什么是 Deep Link?

Deep Link 简单来说就是一种“从外部链接直接唤起 App 内特定页面”的机制。
当用户点击一个符合规则的 URL(例如 myapp://detail?id=123)时,系统会解析该链接并唤起对应的 App 页面。

类比网页:

  • 普通网页链接跳转是 https://example.com/detail?id=123

  • Deep Link 则是 myapp://detail?id=123,它会跳转到 App 内 detail 页面


二、Deep Link 的类型

Deep Link 在 Android 生态中主要分为三种类型:

类型说明示例
Custom URI Scheme自定义协议,最基础、最早的 Deep Link 方案myapp://product/detail?id=1
Android App LinksAndroid 6.0+ 推出的官方方案,支持 HTTPS 验证,安全性高https://www.example.com/product/1
Intent Filters with HTTP/HTTPS普通的 HTTP 链接匹配,不需要域名验证http://m.example.com/detail?id=1

本文主要聚焦 Custom URI Scheme + App Links 两种主流实现方式。


三、Custom Scheme Deep Link 实现

1. Manifest 配置

在目标页面的 Activity 中声明一个 Intent Filter:

<activityandroid:name=".ui.DetailActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><!-- 自定义协议 --><dataandroid:scheme="myapp"android:host="detail" /></intent-filter>
</activity>

2. 链接触发示例

  • 网页中:

    <a href="myapp://detail?id=10086">打开App详情页</a>
    
  • ADB 模拟触发:

    adb shell am start -a android.intent.action.VIEW -d "myapp://detail?id=10086"
    

3. 获取参数

DetailActivity 中通过 Intent 获取参数:

override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val data: Uri? = intent.dataval id = data?.getQueryParameter("id")Log.d("DeepLink", "detail id = $id")
}

四、Android App Links 实现(官方推荐)

相比自定义 scheme,App Links 具有以下优势:

  • 使用标准 HTTPS 链接;

  • 只有验证过的域名才会触发应用打开;

  • 避免了多个 App 注册相同 scheme 冲突的问题。

1. Manifest 配置

<activityandroid:name=".ui.DetailActivity"android:exported="true"><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:scheme="https"android:host="www.example.com"android:pathPrefix="/detail" /></intent-filter>
</activity>

2. 域名验证文件

在服务器根目录放置一个文件:

路径: https://www.example.com/.well-known/assetlinks.json
内容:

[{"relation": ["delegate_permission/common.handle_all_urls"],"target": {"namespace": "android_app","package_name": "com.example.myapp","sha256_cert_fingerprints": ["A1:B2:C3:D4:...:ZZ"]}}
]

SHA256 指纹可以通过以下命令获取:

keytool -list -v -keystore myapp.keystore

五、从外部浏览器跳转 App

1️⃣ 若 App 已安装

  • 系统自动匹配 Intent Filter 并打开对应 Activity。

2️⃣ 若 App 未安装

  • 可配置 fallback 链接(例如跳转到应用商店下载页):

<a href="intent://detail?id=10086#Intent;scheme=myapp;package=com.example.myapp;S.browser_fallback_url=https://www.example.com/download;end">打开应用
</a>

六、Deep Link 参数解析与路由封装

在大型项目中,为了统一管理各个页面的跳转,可以封装一个 DeepLink 路由管理器:

object DeepLinkRouter {fun handleDeepLink(context: Context, uri: Uri) {when (uri.host) {"detail" -> {val id = uri.getQueryParameter("id")val intent = Intent(context, DetailActivity::class.java)intent.putExtra("id", id)context.startActivity(intent)}"profile" -> {val userId = uri.getQueryParameter("userId")val intent = Intent(context, ProfileActivity::class.java)intent.putExtra("userId", userId)context.startActivity(intent)}}}
}

然后在入口 Activity(例如 MainActivity)中统一接管:

override fun onNewIntent(intent: Intent?) {super.onNewIntent(intent)intent?.data?.let { DeepLinkRouter.handleDeepLink(this, it) }
}

七、常见问题与排查技巧

问题原因解决方案
点击链接无反应没有匹配到 Intent Filter检查 scheme、host、path 是否完全一致
链接被浏览器拦截未声明 BROWSABLE添加 <category android:name="android.intent.category.BROWSABLE"/>
App Links 未验证成功assetlinks.json 配置错误adb shell am verify-app-links 检查验证状态
多个应用注册相同 scheme冲突优先使用 App Links(HTTPS)避免冲突

八、总结

对比项Custom SchemeApp Links
安全性弱,易被抢注高,需域名验证
使用门槛简单,无需服务器需配置 assetlinks.json
链接样式myapp://https://
推荐场景内部渠道唤起、测试生产环境、H5落地页、广告跳转

九、结语

Deep Link 是连接 Web 与 App 的桥梁,是移动增长和产品体验的重要一环。
在项目中合理使用 Deep Link,可以极大提升用户转化率与跳转体验。

http://www.dtcms.com/a/464986.html

相关文章:

  • Linux操作系统如何使用ISO镜像文件来搭建本地镜像源?
  • UMI 中使用qiankun问题记录
  • 演示和解读ChatGPT App SDK,以后Android/iOS App不用开发了?
  • Spring Boot 与 WebSocket:长连接掉线、心跳与消息广播的问题
  • 数琨创享:新能源行业标杆企业QMS质量管理平台案例
  • 如何用easyui做网站网站设计说明书5000字
  • 从MySQL到ClickHouse超大规模数据分析的架构迁移实践与性能对比
  • 架构图在什么网站可以做wordpress-saas
  • echarts不根据传入参数,自定义 legend 的内容(视觉映射)
  • H3C IRF
  • 【C++】继承深度解析:继承方式和菱形虚拟继承的详解
  • 徐州 网站 备案 哪个公司做的好phpcms 中英文网站
  • WebSocket | 一点简单了解
  • 算法题基础 : Java : BufferedReader、BufferedWriter 和 StringTokenizer 详解
  • 企业微信 自建应用审批流程引擎功能开发【报错分析】
  • Slf4j 接口文档左侧菜单有显示,但是点击后空白
  • 【AES加密专题】4.Sbox的解析和生成
  • 考完HCIE数通,能转云计算 / 安全 / AI方向吗?
  • 重庆企业网站建设推荐怎么申请域名和备案
  • 松江 网站建设公司拼多多推广联盟
  • 中国极端气象干旱事件(1951-2022)
  • 一文详解Go 语言内存逃逸(Escape Analysis)
  • 学习threejs,实现粒子化交互文字
  • 密码学基础:RSA与AES算法的实现与对比
  • RAG:生成与检索的完美结合
  • 一款由网易出品的免费、低延迟、专业的远程控制软件,支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑!
  • [C# starter-kit] Blazor EntityTable 组件 | 预构建
  • 深入浅出 AI Agent:从概念本质到技术基石
  • 宁波网站制作服务wordpress搭建淘客网站
  • 第五章:Go的“面向对象”编程