在 Android 上接收 Firebase 动态链接

如需接收您创建的 Firebase Dynamic Links,您必须将 Dynamic Links SDK 添加到应用中,并在应用加载时调用 FirebaseDynamicLinks.getDynamicLink() 方法,以获取 Dynamic Link 中传递的数据。

  1. 将 Firebase 添加至您的 Android 项目(如果尚未添加)。

    在注册您的应用时,请指定 SHA-1 签名密钥。如果您使用 App Links,还需要指定 SHA-256 密钥。

  2. 模块(应用级)Gradle 文件(通常是 <project>/<app-module>/build.gradle.kts<project>/<app-module>/build.gradle)中,添加 Dynamic Links 库的依赖项。我们建议使用 Firebase Android BoM 来实现库版本控制。

    为了获得最佳的 Dynamic Links 使用体验,我们建议您在 Firebase 项目中启用 Google Analytics,并将 Firebase SDK for Google Analytics 添加到您的应用中。

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.6.0"))
    
        // Add the dependencies for the Dynamic Links and Analytics libraries
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-dynamic-links'
        implementation 'com.google.firebase:firebase-analytics'
    }
    

    借助 Firebase Android BoM,可确保您的应用使用的始终是 Firebase Android 库的兼容版本。

    (替代方法) 在不使用 BoM 的情况下添加 Firebase 库依赖项

    如果您选择不使用 Firebase BoM,则必须在每个 Firebase 库的依赖项行中指定相应的库版本。

    请注意,如果您在应用中使用多个 Firebase 库,我们强烈建议您使用 BoM 来管理库版本,从而确保所有版本都兼容。

    dependencies {
        // Add the dependencies for the Dynamic Links and Analytics libraries
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-dynamic-links:22.1.0'
        implementation 'com.google.firebase:firebase-analytics:22.1.2'
    }
    
    是否想要查找 Kotlin 专用的库模块?从 2023 年 10 月 (Firebase BoM 32.5.0) 开始,Kotlin 和 Java 开发者可以依赖于主库模块(如需了解详情,请参阅关于此计划的常见问题解答)。
  3. Firebase 控制台中,打开 Dynamic Links 部分。如有提示,请接受服务条款。

普通深层链接一样,您必须在为应用处理深层链接的 Activity 中添加一个新的 intent 过滤器。该 intent 过滤器应该捕获您的网域的深层链接,因为如果用户安装了您的应用,Dynamic Link 会重定向到您的网域。在用户从 Play 商店安装/更新了您的应用并点按“继续”按钮后,若要让应用能收到 Dynamic Link 数据,则必须执行此操作。在 AndroidManifest.xml 中:

<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="example.com"
        android:scheme="https"/>
</intent-filter>

当用户打开 Dynamic Link(该链接包含指向您指定的架构和主机的深层链接)时,您的应用将会启动包含此 intent 过滤器的 Activity 来处理该链接。

如需接收深层链接,可调用 getDynamicLink() 方法:

Kotlin+KTX

Firebase.dynamicLinks
    .getDynamicLink(intent)
    .addOnSuccessListener(this) { pendingDynamicLinkData: PendingDynamicLinkData? ->
        // Get deep link from result (may be null if no link is found)
        var deepLink: Uri? = null
        if (pendingDynamicLinkData != null) {
            deepLink = pendingDynamicLinkData.link
        }

        // Handle the deep link. For example, open the linked
        // content, or apply promotional credit to the user's
        // account.
        // ...
    }
    .addOnFailureListener(this) { e -> Log.w(TAG, "getDynamicLink:onFailure", e) }

Java

FirebaseDynamicLinks.getInstance()
        .getDynamicLink(getIntent())
        .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
            @Override
            public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
                // Get deep link from result (may be null if no link is found)
                Uri deepLink = null;
                if (pendingDynamicLinkData != null) {
                    deepLink = pendingDynamicLinkData.getLink();
                }


                // Handle the deep link. For example, open the linked
                // content, or apply promotional credit to the user's
                // account.
                // ...

                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.w(TAG, "getDynamicLink:onFailure", e);
            }
        });

您必须在动态链接可能启动的每个 Activity 中调用 getDynamicLink() 来获取该链接,即使您有可能使用 getIntent().getData() 从 intent 中获取该链接也是如此。调用 getDynamicLink() 可检索动态链接并清除相关数据,因此您的应用只会对该链接进行一次处理。

您通常应该在主 Activity 以及由与链接匹配的 intent 过滤器启动的所有 Activity 中调用 getDynamicLink()

记录分析结果

您可以在 Google Analytics 中自动跟踪以下事件并在 Firebase 控制台中显示相关信息。

  • dynamic_link_app_open
  • dynamic_link_first_open
  • dynamic_link_app_update

为了注册这些事件,您需要在检索深层链接之前配置 Google Analytics。检查是否满足以下条件:

  • 在应用入口点调用 FirebaseDynamicLinks.getDynamicLink()
    • 启动器 Activity。例如:action="android.intent.action.MAIN"category="android.intent.category.LAUNCHER"
    • Activity 入口点。例如:onStart()onCreate()
    • 深层链接 Activity。
  • 设置并使用 Google Analytics

在 Android 6.0(API 级别 23)及更高版本中,您可以使用 Android App Links,将应用设置为当其已安装时直接处理 Dynamic Links

确保已在 Firebase 控制台中将应用的 SHA256 证书指纹添加到您的项目中。Dynamic Links 将负责为您的 Dynamic Links 网域设置 App Links 网站关联。

为处理 Dynamic Link 的 Activity 添加一个自动验证的 intent 过滤器,将主机设置为您项目的 Dynamic Links 网域(可以Firebase 控制台中找到该网域)。在 AndroidManifest.xml 中:

<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="example.com/link" android:scheme="http"/>
    <data android:host="example.com/link" android:scheme="https"/>
</intent-filter>

请注意,android:host 必须设置为您的 Dynamic Links 网域,而不是深层链接的网域。

清单文件中的所有 autoVerify intent 过滤器都必须注册,这样 App Links 才能与其互动。Firebase 会自动为您的 Dynamic Links 网域完成此操作,您也可以打开 Dynamic Links 网域上托管的 assetlinks.json 文件来进行检查:

https://YOUR_DOMAIN/.well-known/assetlinks.json
您的所有 Firebase 应用的软件包名称都应该包含在内。

Dynamic Links 现在会直接发送到您的应用。您可以在添加了 App Links intent 过滤器的 Activity 中调用 getDynamicLink(),以获取深层链接和其他 Dynamic Link 数据(如处理深层链接中所述)。

注意:由于通过 App Links 调用会将用户直接转到应用,因此动态链接本身无法满足最低版本要求。您需要在打开应用后,将动态链接的最低版本 (getminimumappversion) 与 PackageInfo.versionCode 进行比较,然后根据需要使用 getUpdateAppIntent 重定向用户以升级应用。