通用链接 完整指南
了解 iOS 和 Android 中通用链接、深度链接与 App Links 的核心知识、实现方法与最佳实践
目录
什么是通用链接?
通用链接是一种可在网页和移动应用之间无缝工作的 URL。当用户在 iOS 设备上点击通用链接时,系统会检查是否安装了可处理该链接的应用。若已安装,则直接打开应用中的对应内容;否则会在 Safari 中打开。
在 Android 上,对应的技术称为 App Links。其核心理念相同:一个 URL,智能将用户路由到应用或网站。
核心优势
- 更顺滑的用户体验,无需额外提示或跳转
- 一个 URL 适用于所有平台
- 更好的归因与分析能力
- SEO 更友好(标准 HTTPS URL)
- 适用于邮件、短信、社交媒体等各种场景
通用链接如何工作
实现过程通常包含三个关键部分:
Apple App Site Association(AASA)文件
部署在域名上的 JSON 文件(路径为 /.well-known/apple-app-site-association),用于告诉 iOS 哪些应用可以处理该域名下的链接。
应用配置
你的应用需要在 entitlements(iOS)或 intent filters(Android)中声明可处理的域名与 URL 规则。
URL 处理代码
应用需要实现接收深度链接 URL 的代码,并将用户导航到正确页面或内容。
iOS Universal Links 实现
步骤 1:创建 AASA 文件
创建名为 apple-app-site-association 的文件(无扩展名),内容结构如下: apple-app-site-association
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.com.yourcompany.yourapp",
"paths": [
"/products/*",
"/articles/*",
"/user/*"
]
}
]
}
}重要提示
该文件必须通过 HTTPS 提供,并使用有效 SSL 证书,同时返回 Content-Type: application/json 响应头。
步骤 2:配置 iOS 应用
在 Xcode 中为应用添加 Associated Domains capability,并加入你的域名:
applinks:yourdomain.com
applinks:www.yourdomain.com步骤 3:在应用中处理 URL
// AppDelegate.swift
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else {
return false
}
// Handle the URL and navigate to appropriate screen
handleUniversalLink(url)
return true
}Android App Links 实现
步骤 1:创建 assetlinks.json
将该文件托管在 https://yourdomain.com/.well-known/assetlinks.json:
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.yourcompany.yourapp",
"sha256_cert_fingerprints": [
"XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX"
]
}
}]步骤 2:更新 AndroidManifest.xml
<activity android:name=".MainActivity">
<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" />
<data android:host="yourdomain.com" />
<data android:pathPrefix="/products" />
</intent-filter>
</activity>步骤 3:处理 Intent
// MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val action = intent.action
val data = intent.data
if (Intent.ACTION_VIEW == action && data != null) {
// Handle the deep link
handleDeepLink(data)
}
}最佳实践与常见陷阱
推荐做法
- ✅ 始终为域名使用 HTTPS
- ✅ 在真实设备上测试,而不只是模拟器
- ✅ 为网页用户提供回退 URL
- ✅ 加入完整的分析追踪
- ✅ 妥善处理各种边界情况
- ✅ 保持 AASA/assetlinks 文件及时更新
❌避免这样做
- ❌ 不要为 AASA/assetlinks 文件配置重定向
- ❌ 不要忘记校验 JSON 语法
- ❌ 不要把应用导航逻辑写死
- ❌ 不要假设用户一定已安装应用
- ❌ 不要跳过不同系统版本的测试
测试与调试
iOS 测试
- 1. 使用 Apple 的 AASA 验证工具
- 2. 在备忘录、信息或邮件中测试链接
- 3. 在 Xcode Console 中查看日志
- 4. 在设置 → 开发者中验证域名关联状态
Android 测试
- 1. 使用 adb shell am start -a android.intent.action.VIEW -d "your-url"
- 2. 在 Chrome、Gmail 和消息应用中测试
- 3. 使用 adb shell dumpsys package domain-preferred-apps 检查验证状态
- 4. 查看 logcat 错误日志
分析与归因
想了解通用链接的真实效果,完善的分析非常关键。建议重点追踪以下指标:
- 不同渠道的点击率
- App 打开率 vs 网页回退率
- 各渠道用户获取成本
- 深度链接内容的转化率
- 用户通过深度链接后的首次操作耗时
- 平台表现差异(iOS vs Android)
结论
通用链接已成为现代移动应用的重要基础能力。它能提供顺滑的用户体验、改善归因,并在多平台环境中稳定工作。虽然实现时需要关注细节,但在用户体验和分析能力上的收益非常值得。
建议从基础配置开始,充分测试后根据真实表现数据持续优化。如果你希望跳过复杂实现流程,可以使用 Appy 这类平台,让这些能力自动运行。
继续探索
深度链接 vs 通用链接:完整对比
了解深度链接与通用链接的核心差异、适用场景,以及如何正确实现。
通用链接打开 Safari?修复 AASA、App Links、重定向与响应头
可执行排障流程,帮助你修复打开浏览器而非 App 的通用链接问题。
Firebase Dynamic Links 停服:迁移到 Appy 的完整指南
Firebase Dynamic Links 即将关闭。这里有一份迁移到 Appy 的完整指南,帮助你实现零停机切换。
想看更多内容?浏览 Appy 博客全部主题.