解锁Android的隐藏超链接:Deep Link与App Link探秘

发布时间:2026/7/5 22:53:59

解锁Android的隐藏超链接:Deep Link与App Link探秘 解锁Android的隐藏超链接Deep Link与App Link探秘引言开启深度链接的奇妙世界在移动互联网的世界里你是否常常遇到这样的场景收到银行的转账短信点击其中的链接就能直接打开手机银行 App 并跳转到交易详情页面又或是在朋友圈看到朋友分享的一篇精彩文章来自某个资讯 App点击链接后神奇地直接唤起了该 App 并定位到对应的文章内容。这些看似平常的操作背后却隐藏着一项强大的技术 —— 深度链接Deep Link。深度链接简单来说就是一种能够让用户从一个应用如短信、网页、社交媒体等直接跳转到另一个应用内特定页面的技术它打破了应用之间的壁垒为用户提供了更加便捷、流畅的体验就像是在不同的数字城堡之间搭建了一条条秘密通道让用户可以快速穿梭其中。而在 Android 系统中有两种重要的深度链接实现方式它们就像深度链接世界里的两员大将各有所长这就是 Android Deep Link 和 App Link。接下来就让我们一起深入探索它们的奥秘揭开深度链接的神秘面纱 。Android Deep Link通用但存瑕的元老核心原理城堡的秘密密道Android Deep Link也被称为 URL Scheme是深度链接技术中的 “元老”自 Android 系统诞生之初便已存在 。如果把每个 App 比作一座独立的城堡那么 URL Scheme 就像是为每个城堡设计的 “秘密密道”它有着特殊的暗号格式比如知乎的密道暗号是zhihu://。其工作机制也不难理解应用首先要向操作系统 “登记” 自己的密道暗号。当系统遇到类似zhihu://questions/123456这样的暗号时就会在已安装的应用中寻找所有能 “听懂” 这个暗号的 App然后弹出一个选择器询问用户 “你要用哪个城堡的密道”也就是让用户选择使用哪个应用来打开这个链接。短信场景中的应用短信场景是 Android Deep Link 最常见的应用领域之一。例如你收到银行发送的转账通知短信内容可能是这样尊敬的客户您尾号8888的储蓄卡收入5000.00元。ahreficbc://transfer/result?order20240119001点击查看详情/a立即下载ahrefhttps://appstore/icbc应用商店/a在这条短信中a hreficbc://transfer/result?order20240119001点击查看详情/a就是一个 Deep Link 链接。当用户点击这个链接时如果手机上已经安装了工商银行的手机银行 App系统就会尝试打开该 App并将用户直接带到转账结果详情页面如果未安装则会显示无法打开的提示。这种方式为用户提供了极大的便利无需手动打开 App 再去查找相关交易记录大大提升了操作效率和用户体验。实现方式全解析H5 页面触发跳转在 H5 页面中有多种方法可以触发 Deep Link 跳转。直接跳转使用window.location.href属性直接赋值为 Deep Link 链接如functionopenAppByScheme(){window.location.hrefzhihu://question/123456;}通过 iframe 跳转这种方式更加稳定创建一个隐藏的 iframe将 Deep Link 链接设置为其 src 属性代码如下functionopenAppByIframe(){constiframedocument.createElement(iframe);iframe.style.displaynone;iframe.srczhihu://question/123456;document.body.appendChild(iframe);// 2秒后移除iframesetTimeout((){document.body.removeChild(iframe);},2000);}处理短信链接在短信中链接通常是直接可点击的用户点击a hrefzhihu://question/123短信链接/a即可触发跳转前端无需额外的复杂处理。Android 原生端配置在 Android 原生开发中需要在AndroidManifest.xml文件中进行配置以声明应用对特定 Deep Link 的处理能力。!-- 接收Scheme链接的Activity --activityandroid:name.DeepLinkActivityandroid:exportedtrue!-- 声明Scheme处理能力 --intent-filteractionandroid:nameandroid.intent.action.VIEW/categoryandroid:nameandroid.intent.category.DEFAULT/categoryandroid:nameandroid.intent.category.BROWSABLE/!-- 声明你的密道暗号 --dataandroid:hostdeeplinkandroid:schemezhihu/!-- 可选更精确的路径匹配 --dataandroid:pathPrefix/question///intent-filter!-- 可以声明多个intent-filter处理不同格式 --intent-filteractionandroid:nameandroid.intent.action.VIEW/categoryandroid:nameandroid.intent.category.DEFAULT/categoryandroid:nameandroid.intent.category.BROWSABLE/!-- 另一个Scheme --dataandroid:schemezh//intent-filter/activity在上述配置中intent-filter标签用于声明该 Activity 能够处理的 Intent 类型。action android:nameandroid.intent.action.VIEW /表示该 Activity 可以处理查看的动作category android:nameandroid.intent.category.DEFAULT /允许 Activity 被隐式 Intent 启动category android:nameandroid.intent.category.BROWSABLE /至关重要它允许从浏览器中安全地启动该 Activitydata标签则定义了 URI 模式包括android:scheme协议如zhihu、android:host主机名如deeplink以及android:pathPrefix路径前缀如/question/等用于精确匹配不同的链接格式。在 Activity 中处理传入的链接当 Activity 接收到 Deep Link 对应的 Intent 时需要对其进行处理以实现跳转到相应的页面或执行特定的操作。publicclassDeepLinkActivityextendsAppCompatActivity{OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_deeplink);// 处理传入的IntenthandleDeepLink(getIntent());}OverrideprotectedvoidonNewIntent(Intentintent){super.onNewIntent(intent);// 防止重复创建ActivitysetIntent(intent);handleDeepLink(intent);}privatevoidhandleDeepLink(Intentintent){Uriuriintent.getData();if(uri!null){StringuriStringuri.toString();if(uriString.startsWith(zhihu://question/)){StringquestionIduri.getLastPathSegment();openQuestionDetail(questionId);}elseif(uriString.startsWith(zhihu://user/)){StringuserIduri.getLastPathSegment();openUserProfile(userId);}elseif(uriString.startsWith(icbc://)){handleBankTransaction(uri);}}}privatevoidopenQuestionDetail(StringquestionId){// 跳转到问题详情页IntentintentnewIntent(this,QuestionDetailActivity.class);intent.putExtra(QUESTION_ID,questionId);startActivity(intent);finish();}privatevoidopenUserProfile(StringuserId){// 跳转到用户主页IntentintentnewIntent(this,UserProfileActivity.class);intent.putExtra(USER_ID,userId);startActivity(intent);finish();}privatevoidhandleBankTransaction(Uriuri){// 处理银行交易相关逻辑}}在上述代码中handleDeepLink方法通过判断 Uri 的前缀来确定链接类型然后根据不同的链接类型解析出相应的参数并跳转到对应的页面或执行相应的操作。例如对于知乎的问题链接解析出问题 ID 并跳转到问题详情页面对于用户主页链接解析出用户 ID 并跳转到用户主页。优缺点大剖析优点兼容性极佳从 Android 1.0 到最新版本都对 Android Deep Link 提供了良好的支持这使得它在各种版本的 Android 设备上都能稳定运行无需担心兼容性问题。实现简单开发者只需在AndroidManifest.xml中进行简单的配置声明应用支持的 URL Scheme即可实现基本的 Deep Link 功能无需复杂的服务器配置或额外的技术栈。短信友好在短信中使用 Deep Link 非常方便直接嵌入scheme://path格式的链接用户点击即可跳转无需对短信进行特殊处理也不需要借助其他第三方工具。缺点弹出选择器由于多个应用可以声明相同的自定义 Scheme当用户点击 Deep Link 链接时系统会弹出选择器询问用户使用哪个应用打开链接。这不仅增加了用户的操作步骤还破坏了用户体验的流畅性尤其是在用户明确知道想要打开的应用时这种选择器显得多余。无法判断是否成功在 H5 页面触发 Deep Link 跳转时无法准确判断应用是否成功打开。虽然可以使用定时器方案来进行大致判断但这种方法并不准确存在一定的误差无法满足对跳转结果精确判断的需求。容易被劫持恶意应用可以注册与合法应用相同的 Scheme从而劫持 Deep Link 链接。当用户点击链接时可能会被引导至恶意应用导致信息泄露、安全风险增加等问题给用户和合法应用开发者带来损失。微信 / QQ 中被屏蔽在微信、QQ 等社交应用中为了保障用户安全和应用生态的健康会拦截非白名单的 Scheme 链接。这使得 Android Deep Link 在这些主流社交平台上无法正常使用限制了其传播和推广的范围。无降级方案如果用户手机上未安装对应的应用点击 Deep Link 链接后会直接显示无法打开的提示没有提供合理的降级方案比如跳转到应用商店进行下载这会导致用户体验的中断降低用户对应用的好感度。综上所述Android Deep Link 虽然具有兼容性好、实现简单等优点但也存在诸多缺点在实际应用中需要根据具体场景和需求谨慎使用并结合其他技术来弥补其不足 。Android App Link官方出品的优雅方案核心原理基于域名的所有权验证如果说 Android Deep Link 是民间的 “小道密道”那么 Android App Link 则是官方打造的 “高速公路”更加规范、安全、高效 。App Link 是 Android 6.0API 级别 23引入的一种深度链接技术它的出现主要是为了解决 Android Deep Link 存在的一些问题如弹出选择器、安全性低等 。App Link 基于 HTTP/HTTPS 协议其核心原理是通过验证应用对某个域名的所有权来实现无歧义的深度链接。简单来说就是应用需要向系统证明自己是某个域名的合法拥有者这样当用户点击指向该域名的链接时系统就会直接打开对应的应用而不会弹出选择器询问用户 。为了便于理解我们可以将这个过程想象成一个快递配送系统。每个 App 就像是一个收件人而链接中的域名则是收件地址。在普通的配送方式类似 Android Deep Link中当快递员系统拿到一个包裹链接时由于有多个收件人应用可能声称对这个地址有接收权快递员就会询问周围的人弹出选择器“这个包裹该给谁” 而在 App Link 的 “官方快递系统” 中收件人应用提前向快递站系统提供了自己的指纹信息通过域名所有权验证当快递员拿到包裹时只需要核对指纹验证域名所有权如果匹配就可以直接将包裹送到收件人手中无需再询问其他人 。具体的验证流程如下在 AndroidManifest.xml 中声明应用首先需要在AndroidManifest.xml文件中声明支持的 HTTP/HTTPS Intent Filter例如activityandroid:name.AppLinkActivityintent-filterandroid:autoVerifytrueactionandroid:nameandroid.intent.action.VIEW/categoryandroid:nameandroid.intent.category.DEFAULT/categoryandroid:nameandroid.intent.category.BROWSABLE/dataandroid:schemehttpsandroid:hostexample.comandroid:pathPrefix/article///intent-filter/activity在上述代码中android:autoVerifytrue表示应用请求系统在安装时自动验证其对指定域名的所有权data标签定义了应用能够处理的链接格式包括android:scheme协议必须是 http 或 https、android:host主机名即域名以及android:pathPrefix路径前缀用于更精确地匹配链接 。2.在网站上发布验证文件应用开发者需要在对应的网站上发布一个 Digital Asset Links JSON 文件通常位于/.well-known/assetlinks.json该文件包含了应用的包名和签名证书的 SHA-256 指纹等信息用于证明应用对该域名的所有权 。例如[{relation:[delegate_permission/common.handle_all_urls],target:{namespace:android_app,package_name:com.example.app,sha256_cert_fingerprints:[ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890]}}]系统验证当用户安装应用时系统会自动下载并验证这个 JSON 文件。如果验证成功系统就会将该应用与对应的域名关联起来。此后当用户点击指向该域名的链接时系统就会直接打开对应的应用并将链接传递给应用进行处理 。实现步骤详解配置 AndroidManifest.xml在AndroidManifest.xml中为需要处理 App Link 的 Activity 添加intent-filter示例如下activityandroid:name.AppLinkActivityintent-filterandroid:autoVerifytrueactionandroid:nameandroid.intent.action.VIEW/categoryandroid:nameandroid.intent.category.DEFAULT/categoryandroid:nameandroid.intent.category.BROWSABLE/dataandroid:schemehttpsandroid:hostexample.comandroid:pathPrefix/article//!-- 可以添加多个data标签以支持不同的链接格式 --dataandroid:schemehttpsandroid:hostexample.comandroid:pathPrefix/user///intent-filter/activity配置服务器端在服务器上创建并放置assetlinks.json文件文件内容格式如下[{relation:[delegate_permission/common.handle_all_urls],target:{namespace:android_app,package_name:com.example.app,sha256_cert_fingerprints:[YOUR_SHA256_CERT_FINGERPRINT]}}]其中YOUR_SHA256_CERT_FINGERPRINT需要替换为应用签名证书的 SHA-256 指纹。获取 SHA-256 指纹的方法如下使用命令行工具如果是使用 Gradle 构建的项目可以在项目根目录下的命令行中执行以下命令假设使用的是 JDK 1.8 及以上版本./gradlew signingReport在输出结果中找到对应构建类型如release或debug的SHA-256指纹。使用 Android Studio在 Android Studio 中依次点击Build-Generate Signed Bundle / APK按照向导完成操作。在最后一步点击View Certificate即可查看证书的详细信息包括 SHA-256 指纹 。优势尽显无歧义直接打开由于通过域名所有权验证系统能够明确知道应该使用哪个应用来打开链接避免了弹出选择器的困扰为用户提供了更加流畅、无缝的体验就像快递直接送达收件人手中无需中间的询问环节 。无缝体验用户从外部链接直接进入应用内的特定页面整个过程自然流畅无需额外的操作大大提升了用户体验增强了用户对应用的好感度 。安全性高基于 HTTP/HTTPS 协议和域名所有权验证有效防止了链接被劫持保障了用户的信息安全和应用的正常使用就像给快递加上了一把安全锁 。SEO 友好使用标准的 HTTP/HTTPS 链接有利于搜索引擎对应用内容的索引和收录提高应用的曝光率和可发现性 。未安装处理如果用户未安装应用点击 App Link 链接时系统会自然降级到对应的网页为用户提供了合理的备用方案避免了用户体验的中断 。当然App Link 也并非完美无缺它也存在一些不足之处配置相对复杂相比 Android Deep LinkApp Link 的配置过程涉及到服务器端的配置和域名所有权验证对于开发者来说需要更多的技术知识和操作步骤 。版本限制App Link 仅支持 Android 6.0API 级别 23及以上版本的系统这意味着在一些老旧设备上无法使用限制了其应用范围 。国内特殊环境在国内由于网络环境和应用生态的特殊性可能会存在一些兼容性问题或无法正常验证域名所有权的情况需要开发者进行额外的适配和调试 。总体而言Android App Link 以其独特的优势为深度链接带来了更加优质的解决方案尤其适用于追求极致用户体验和高安全性的应用场景 。两者深度对比差异与选择在深入了解了 Android Deep Link 和 App Link 之后我们来对它们进行一番全面的对比以便在实际开发中能够根据项目的具体需求做出明智的选择 。对比维度Android Deep LinkAndroid App Link适用版本全系列版本从 Android 1.0 起就已存在兼容性极佳能够覆盖所有 Android 设备无论是老旧机型还是最新款手机都能稳定支持 Deep Link 功能仅支持 Android 6.0API 级别 23及以上版本在一些运行 Android 6.0 以下系统的设备上无法使用这在一定程度上限制了其应用范围 但随着 Android 系统的不断更新换代高版本系统的设备占比逐渐增加App Link 的应用场景也在不断扩大适用协议支持自定义协议开发者可以根据项目需求自由定义 URL Scheme如myapp://这种灵活性使得 Deep Link 在一些特定场景下能够更好地满足业务需求例如在企业内部应用中可以使用自定义协议来实现特定功能的深度链接仅支持 HTTP/HTTPS 协议基于标准的网络协议这使得 App Link 在安全性和通用性方面具有优势同时也有利于与 Web 端进行无缝集成方便进行 SEO 优化和跨平台交互安全验证不进行验证这使得 Deep Link 存在一定的安全风险恶意应用可以注册相同的自定义 Scheme从而劫持链接导致用户被引导至恶意应用造成信息泄露、安全威胁等问题需要进行客户端与服务器端的双向验证通过在服务器上放置 Digital Asset Links JSON 文件验证应用对域名的所有权确保链接只能被指定的应用处理有效防止了链接被劫持保障了用户的信息安全和应用的正常使用 就像给链接加上了一把坚固的安全锁用户体验通常会弹出选择器当多个应用声明相同的自定义 Scheme 时系统会询问用户使用哪个应用打开链接这增加了用户的操作步骤破坏了用户体验的流畅性尤其是在用户明确知道想要打开的应用时这种选择器显得多余默认直接启动目标 App用户点击链接后能够直接进入应用内的特定页面无需额外的操作提供了更加流畅、无缝的用户体验就像乘坐直达电梯一样快速到达目的地实现难度实现相对简单只需在AndroidManifest.xml中进行简单的配置声明应用支持的 URL Scheme 即可无需复杂的服务器配置或额外的技术栈对于开发者来说上手难度较低配置相对复杂除了在AndroidManifest.xml中进行配置外还需要在服务器端创建并放置assetlinks.json文件进行域名所有权验证这需要开发者具备一定的服务器端开发知识和操作经验 但一旦配置完成能够为应用带来更优质的深度链接体验未安装处理无合理的降级方案如果用户手机上未安装对应的应用点击 Deep Link 链接后会直接显示无法打开的提示导致用户体验的中断无法引导用户进行进一步的操作如下载应用有合理的降级方案如果用户未安装应用点击 App Link 链接时系统会自然降级到对应的网页用户可以在网页上进行相关操作或者引导用户下载应用为用户提供了更加友好的体验避免了用户体验的中断 就像为用户准备了一条备用通道通过以上对比可以看出Android Deep Link 和 App Link 各有优劣。在实际项目中如果需要兼容所有 Android 版本或者对链接的灵活性有较高要求且对安全性和用户体验的要求相对较低可以选择使用 Android Deep Link如果项目主要面向 Android 6.0 及以上版本的设备追求极致的用户体验和高安全性并且愿意投入更多的时间和精力进行配置那么 Android App Link 无疑是更好的选择 。在一些情况下也可以同时使用两者利用 Deep Link 的兼容性和 App Link 的优势为用户提供更加全面、优质的深度链接服务 。实践建议与避坑指南在实际项目中使用 Android Deep Link 和 App Link 时以下是一些实用的建议和需要注意的问题 。同步配置两者为了确保在不同的 Android 版本和场景下都能提供良好的深度链接体验建议同时配置 Android Deep Link 和 App Link 。以电商 App 为例在进行营销活动时通过短信向用户发送活动链接。如果只配置了 App Link那么在 Android 6.0 以下版本的设备上链接将无法正常工作导致用户无法参与活动从而影响活动效果和用户体验 。而如果同时配置了 Deep Link即使在低版本设备上也能通过 Deep Link 实现基本的跳转功能保证了活动的覆盖范围和用户参与度 。点击链接无反应原因最常见的原因是没有匹配到 Intent Filter可能是 scheme、host、path 等配置与实际链接不一致 。例如在配置 Intent Filter 时将 scheme 声明为myapp而实际链接中使用的是myApp注意大小写这样就会导致无法匹配点击链接无反应 。解决方案仔细检查AndroidManifest.xml中 Intent Filter 的配置确保与链接中的 scheme、host、path 等完全一致包括大小写 。可以使用 ADB 命令进行测试如adb shell am start -a android.intent.action.VIEW -d myapp://detail?id123如果能成功打开应用则说明配置正确如果提示Activity not started等错误信息则需要进一步检查配置 。链接被浏览器拦截原因未在 Intent Filter 中声明BROWSABLE类别浏览器无法识别该链接可以被应用处理从而将其拦截 。解决方案在AndroidManifest.xml中为处理链接的 Activity 添加category android:nameandroid.intent.category.BROWSABLE /确保浏览器能够将链接正确地传递给应用 。例如activityandroid:name.DeepLinkActivityandroid:exportedtrueintent-filteractionandroid:nameandroid.intent.action.VIEW/categoryandroid:nameandroid.intent.category.DEFAULT/categoryandroid:nameandroid.intent.category.BROWSABLE/dataandroid:hostdeeplinkandroid:schememyapp//intent-filter/activityApp Links 未验证成功原因通常是assetlinks.json文件配置错误如文件路径不正确、内容格式有误、SHA-256 指纹与应用签名证书不匹配等 。例如在生成assetlinks.json文件时使用了错误的应用签名证书来获取 SHA-256 指纹导致验证失败 。解决方案使用adb shell am verify-app-links命令检查验证状态根据提示信息进行排查 。确保assetlinks.json文件放置在正确的服务器路径下如https://example.com/.well-known/assetlinks.json仔细检查文件内容确保package_name和sha256_cert_fingerprints与应用实际情况一致 。如果指纹不匹配需要重新获取正确的 SHA-256 指纹并更新assetlinks.json文件 。获取 SHA-256 指纹的方法可以参考前文提到的使用命令行工具或 Android Studio 的方式 。多个应用注册相同 scheme 冲突原因当多个应用声明了相同的自定义 Scheme 时系统无法确定应该使用哪个应用来打开链接从而导致冲突 。例如两个不同的新闻类 App 都注册了news://的 Scheme用户点击news://article/123链接时系统会弹出选择器询问用户使用哪个应用打开这不仅影响用户体验还可能导致用户误操作 。解决方案优先使用 App LinkHTTPS因为 App Link 通过域名所有权验证可以避免多个应用注册相同 scheme 的冲突问题 。如果必须使用自定义 Scheme尽量使用独特的、不易与其他应用冲突的 Scheme并且在应用中做好提示和引导告知用户可能出现的选择器情况并提供清晰的操作指引 。

相关新闻