Firebase Dynamic Links 是 Google 的一项服务,用于创建智能链接,无论应用是否安装,都可以将用户引导到应用中的正确位置。根据 Firebase Documentation,Dynamic Links 在应用不存在时自动将用户重定向到 App Store 或 Google Play,并在安装后恢复跳转上下文。Firebase 的 智能链接 解决了 URL Scheme 的问题,后者无法与未安装的应用一起使用。
要点
Firebase Dynamic Links 是 Google 的云服务,为 iOS 和 Android 上的移动应用创建统一的通用链接。动态链接包含指向应用内容的深层链接,但行为类似于普通的 HTTPS 链接:如果应用已安装,则直接打开,否则重定向到应用商店。
与普通的 URL Scheme 不同,Dynamic Links 可以借助 deferred deep link 技术与未安装的应用一起使用。当用户点击链接后安装应用时,Firebase 会保存跳转参数,并在首次启动时传递它们。这为推荐计划、营销活动和邀请打开了可能性。
URL Scheme 需要已安装的应用,并且没有标准的回退机制。Firebase Dynamic Links 通过一个中间 Firebase Web 服务解决了这个问题,该服务确定设备上应用的安装状态并正确路由用户。一个链接在两个平台上工作方式相同。
Firebase Dynamic Link 使用 yourcode.page.link 形式的域名,该域名在 Firebase Console 中注册。当用户通过这样的链接导航时,Firebase 会确定设备类型和应用的安装状态。对于 iOS,使用 Universal Links 机制,对于 Android — 使用 App Links,通过 Digital Asset Links 进行自动验证。
处理过程包括几个连续的阶段:点击链接时,浏览器向 Firebase 服务器发送 GET 请求,服务器确定平台并检查设备上应用的存在。如果应用已安装 — 生成重定向到 Universal Link 或 Intent,并带有打开目标屏幕的参数。如果应用未安装 — 重定向到 App Store 或 Google Play 进行下载。
应用在 Firebase SDK 初始化阶段接收链接。getDynamicLink() 方法返回一个包含跳转数据的 PendingResult。成功接收后,从链接中提取深层链接参数、用于分析的 UTM 标签以及在创建链接时传递的任意数据。
Firebase Console 提供了用于创建 Dynamic Links 的可视界面。开发人员指定深层链接(deep link URL)、活动名称、iOS 和 Android 的单独设置以及分析参数。创建后,Firebase 生成一个 https://yourcode.page.link/abc123 形式的短链接,可用于广告材料、电子邮件活动和社交媒体。
对于编程方式创建 Dynamic Links,使用 Firebase REST API 或客户端 SDK。REST API 允许为营销活动批量生成带有自定义参数的链接,包括用于社交媒体的链接和异步跳转分析。通过 API 创建链接时,正确指定 socialMetaTagInfo 参数非常重要 — 它们决定了链接在即时通讯应用和社交网络中通过预览卡片共享时的显示方式。
| 参数 | 用途 | 必填 |
|---|---|---|
| Deep Link URL | 指向应用内容的内部链接 | 是 |
| iOS Bundle ID | 应用在 App Store 中的标识符 | 用于 iOS |
| Android Package Name | 在 Google Play 中的包名 | 用于 Android |
| Fallback URL | 应用不存在时的网页 | 否 |
| UTM 标签 | 用于 Google Analytics 的参数 | 否 |
要在 iOS 上使用 Firebase Dynamic Links,需要通过 CocoaPods 或 Swift Package Manager 连接 Firebase SDK,使用 GOOGLE_APP_ID 配置 Info.plist,并在项目的 Associated Domains 中注册 Dynamic Links 域名。之后,应用会自动处理 Firebase 生成的 Universal Links。
在 Xcode 中,需要添加 Associated Domains 功能,记录格式为 applinks:yourcode.page.link。Firebase SDK 使用 application(_:continue:restorationHandler:) 方法处理 Universal Links,因此无需与 AppDelegate 进行额外集成 — Firebase 会自动从 User Activity 中提取 Dynamic Link 参数。
用于正确初始化 Firebase 和注册 Dynamic Links 处理程序的 Info.plist 配置示例。FIROptions 键应包含 GoogleService-Info.plist 的项目标识符。
<key>FirebaseDynamicLinksCustomDomains</key>
<array>
<string>https://yourcode.page.link</string>
</array>
<key>FirebaseAppDelegateProxyEnabled</key>
<false/>
如果 AppDelegate 代理被禁用,需要手动调用 handleUniversalLink(_:) 方法并从 continue NSUserActivity 传递 User Activity。Firebase SDK 会自动提取链接参数并通过 completion handler 返回 DynamicLink。
在 Android 上,Firebase Dynamic Links 的集成从在 build.gradle 中添加依赖项和从 Firebase Console 添加 google-services.json 文件开始。Dynamic Links 域名在 Firebase Console 中注册,之后所有带有此域名的链接都会被 Android 应用通过具有 VIEW 操作的 Intent Filter 自动识别。为了正确运行,还需要在根和模块 build.gradle 中添加 Google Services 插件并执行 Gradle 同步。
为了在 Android 上正确处理链接,需要为 Dynamic Links 域名在应该接收传入链接的 Activity 中添加 Intent Filter。过滤器应包含 https 方案、您的 Dynamic Links 域名的主机和默认路径。
AndroidManifest.xml 中用于在 yourcode.page.link 域接收 Dynamic Links 的 Intent Filter 示例。
<activity android:name=".MainActivity"
android:launchMode="singleTask">
<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="yourcode.page.link" />
</intent-filter>
</activity>
对于接收 Dynamic Links 的 Activity,将 launchMode 设置为 singleTask 非常重要。这可以防止在通过链接重复导航时创建新的 Activity 实例,并允许在单个实例中正确处理所有传入的深层链接。
适用于 Android 的 Firebase SDK 提供了 FirebaseDynamicLinks.getInstance().getDynamicLink(intent) 方法,该方法返回一个包含链接数据的 PendingTask 对象。从 DynamicLink 对象中提取深层 URI、UTM 参数和跳转时间戳。建议在 Activity 的 onCreate() 和 onNewIntent() 方法中进行处理。
在处理时,重要的是考虑到 Dynamic Link 既可以在从冷状态启动应用时(冷启动)接收,也可以在从其他应用切换到已经运行的应用时接收。对于第二种情况,需要重写 onNewIntent() 并重新调用 Dynamic Link 检查。
在 MainActivity 中接收和处理 Firebase Dynamic Link 的示例。代码处理冷启动和从其他应用的跳转。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
checkDynamicLink(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
checkDynamicLink(intent)
}
private fun checkDynamicLink(intent: Intent) {
FirebaseDynamicLinks.getInstance()
.getDynamicLink(intent)
.addOnSuccessListener link ->
val deepLink = link?.link.toString()
handleDeepLink(deepLink)
}
}
}
addOnSuccessListener 方法返回 DynamicLink,从中通过 link?.link 提取目标链接。如果监听器返回 null,则表示 Intent 不包含 Dynamic Link — 这是没有传入链接的正常应用启动。此外,还有用于跳转分析的 UTM 标签,包括 campaign、medium、source 和 content,可以传递给 Google Analytics 以详细评估每个营销渠道的效果。
常见问题
Firebase Dynamic Links 支持 deferred deep link — 即使应用未安装,链接也能保留上下文。安装后,应用会收到所有跳转参数,这在普通 URL Scheme 或 Universal Links 中是不可能的。
Firebase Dynamic Links 包含在免费的 Firebase Spark 套餐中。创建的链接数量没有限制。不过,自 2024 年起,Google 已宣布过渡到新基础设施,因此条款可能会发生变化。
Dynamic Links 专为移动应用设计。从桌面浏览器访问时,链接将打开回退 URL。对于 Web 应用,请使用普通链接或您自己的重定向逻辑。
Firebase Console 提供 Test Dynamic Link 按钮用于预览行为。您也可以使用安装了 Firebase SDK 的 Android 模拟器或 iOS 模拟器来本地测试所有跳转场景。
Firebase Dynamic Link 短链接由 page.link 域名和大约 7 个字符的随机后缀组成。总长度约为 30 个字符。内部的深层链接可以是任意长度,但为了兼容性,建议限制在 2 KB 以内。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。