使用 App Distribution Android SDK 设置有关新 build 的应用内提醒

利用可选的 Firebase App Distribution SDK,您可以在有新的应用 build 可供安装时向测试人员显示应用内提醒。本指南说明了如何使用 App Distribution SDK 针对测试人员创建和自定义新 build 提醒。

准备工作

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

第 1 步:启用 App Distribution Tester API

  1. Google Cloud Console 中选择您的项目。

  2. 在“Firebase App Testers API”下,点击启用

第 2 步:将 App Distribution 添加到您的应用

在应用级模块 Gradle 文件(通常是 app/build.gradle)中,声明与 App Distribution Android SDK 有关的依赖项:

Java

dependencies {
    // ADD this line
    implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta02'
}

Kotlin+KTX

dependencies {
    // ADD this line
    implementation 'com.google.firebase:firebase-appdistribution-ktx:16.0.0-beta02'
}

第 3 步:配置应用内提醒

App Distribution SDK 提供了以下为测试人员设置应用内 build 提醒的方法:

  • 基本提醒配置,提供要向测试人员显示的预构建应用更新和登录对话框。
  • 一种高级提醒配置,可让您自定义专属界面。

如果您是首次使用 App Distribution SDK,我们建议您使用基本提醒配置。

基本配置

使用 updateIfNewReleaseAvailable 向尚未启用提醒的测试人员显示预构建的“启用提醒”对话框,然后检查是否有新的 build。调用时,该方法将遵循以下顺序:

  1. 检查测试人员是否已启用提醒。如果测试人员尚未启用提醒,该方法会提示测试人员使用其 Google 帐号登录 App Distribution。

  2. 检查是否有新推出的 build 可供测试人员安装。

  3. 显示提示测试人员进行更新的预构建提醒。

  4. 如果新 build 是 Android App Bundle (AAB),则会将测试人员重定向到 Google Play 以完成更新流程。

    如果新 build 是 Android 应用软件包 (APK),则该 SDK 会在后台下载新 build,并在下载完成时提示测试人员安装。该 SDK 会使用 NotificationManager 向用户发送下载进度通知。您还可以通过向 updateIfNewReleaseAvailable 任务附加 onProgressUpdate 处理程序来添加自己的进度指示器。

您可以在应用中的任何时间点调用 updateIfNewReleaseAvailable()。例如,您可以在 MainActivity 的 onResume() 方法执行过程中调用 updateIfNewReleaseAvailable()

以下示例会检查测试人员是否启用了提醒以及是否可以访问新的 build。如果满足这些条件,则当 build 可供安装时,系统会显示一个对话框:

Java

public class MainActivity extends AppCompatActivity {
    FirebaseAppDistribution firebaseAppDistribution =
        FirebaseAppDistribution.getInstance();

    @Override
    public void onResume() {
        super.onResume();
        firebaseAppDistribution.updateIfNewReleaseAvailable()
            .addOnProgressListener(updateProgress -> {
              // (Optional) Implement custom progress updates in addition to
              // automatic NotificationManager updates.
            })
            .addOnFailureListener(e -> {
              if (e instanceof FirebaseAppDistributionException) {
                // Handle exception.
              }
            });
    }
}

Kotlin+KTX

class MainActivity : AppCompatActivity() {
    var firebaseAppDistribution = FirebaseAppDistribution.getInstance()

    override fun onResume() {
        super.onResume()
        firebaseAppDistribution.updateIfNewReleaseAvailable()
            .addOnProgressListener { updateProgress ->
              // (Optional) Implement custom progress updates in addition to
              // automatic NotificationManager updates.
            }
            .addOnFailureListener { e ->
                if (e is FirebaseAppDistributionException) {
                    // Handle exception.
                }
            }
    }
}

高级配置

高级登录配置

signInTesterisTesterSignedIn 方法可让您更灵活地自定义测试人员的登录体验,以使测试人员的体验能够更好地与应用的外观和风格相匹配。

以下示例会检查测试人员是否已登录其 App Distribution 测试人员帐号。这样,您就可以选择只向尚未登录的测试人员显示登录界面。测试人员登录后,您便可以调用 updateIfNewReleaseAvailable 以检查测试人员是否可以访问新的 build。

Java


if (!firebaseAppDistribution.isTesterSignedIn()) {
    // Start your sign in UI here.
    //
    // When the tester chooses to proceed with the update,
    // call signInTester():
    //
    //   firebaseAppDistribution.signInTester().addOnSuccessListener( unused -> {
    //       // Handle successful sign in.
    //   }).addOnFailureListener(e -> {
    //       // Handle failed sign in.
    //   });
}

// Only check for updates if the tester is already signed in (do not prompt).
if (firebaseAppDistribution.isTesterSignedIn()) {
    firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener( e -> {
        // Handle failed update.
    });
}

Kotlin+KTX

if (!firebaseAppDistribution.isTesterSignedIn) {
    // Start your sign in UI here.
    //
    // When the tester chooses to proceed with the update,
    // call signInTester():
    //
    //   firebaseAppDistribution.signInTester().addOnSuccessListener {
    //       // Handle successful sign in.
    //   }.addOnFailureListener {
    //       // Handle failed sign in.
    //   });
}

// Only check for updates if the tester is already signed in (do not prompt).
if (firebaseAppDistribution.isTesterSignedIn) {
    firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener {
        // Handle failed update.
    }
}

高级更新配置

checkForNewReleaseupdateApp 方法可让您更灵活地自定义何时提醒测试人员进行更新。您还可以自定义预构建的更新对话框和下载进度指示器,以使它们能够更好地与应用的外观和风格相匹配。

请注意,updateApp 不提供下载进度指示。这意味着,您需要使用 NotificationManager、某种应用内状态显示或某种其他方法实现自己的进度指示。

以下示例会检查是否有新版本,然后会显示自定义界面。在调用 checkForNewReleaseupdateApp 之前,请确保使用高级登录配置来让测试人员登录。

Java

firebaseAppDistribution.checkForNewRelease().addOnSuccessListener(release -> {
    if (release != null) {  // New release available.

        // Start your update UI here.
        //
        // When the tester chooses to proceed with the update, call updateApp():
        //
        //      firebaseAppDistribution.updateApp()
        //              .addOnProgressListener(updateState -> {
        //                  // Use updateState to show update progress.
        //              });
    }
}).addOnFailureListener(e -> {
    // Handle failed check for new release.
});

Kotlin+KTX

firebaseAppDistribution.checkForNewRelease().addOnSuccessListener { release ->
    if (release != null) { // New release available.

        // Start your update UI here.
        //
        // When the tester chooses to proceed with the update, call updateApp():
        //
        //      firebaseAppDistribution.updateApp()
        //          .addOnProgressListener { updateState ->
        //              // Use updateState to show update progress.
        //          }
    }
}.addOnFailureListener {
    // Handle failed check for new release.
}

第 4 步:在发布前,将 App Distribution 隔离到预发布 build

App Distribution Android SDK 不应包含在正式版应用中。该 SDK 包含可能被视为违反 Google Play 政策的自我更新功能,即使该代码没有在运行时执行也是如此。

为确保您不会在正式版应用中包含 Android SDK 代码,我们建议通过在预发布 build 变体源代码集而不是正式版源代码集中实现的类使用该 SDK。该类应公开应用的其余部分所需的功能。

例如,如果您使用上面的高级登录配置,请在预发布变体中实现一个类,其中包含一个使用该 SDK 让测试人员登录和更新应用的方法:

Java

// src/{pre-release variant}/java/com/example/AppDistributionWrapper.java

class AppDistributionWrapper {
    FirebaseAppDistribution firebaseAppDistribution =
        FirebaseAppDistribution.getInstance();

    void signInAndUpdate() {
        // Use the App Distribution SDK to sign in the tester and update the app.
    }
}

Kotlin+KTX

// src/{pre-release variant}/java/com/example/AppDistributionWrapper.kt

class AppDistributionWrapper {
    val firebaseAppDistribution = FirebaseAppDistribution.getInstance()

    fun signInAndUpdate() {
        // Use the App Distribution SDK to sign in the tester and update the app.
    }
}

在正式版变体源代码中实现同一个类的不使用该 SDK 的版本:

Java

// src/{production variant}/java/com/example/AppDistributionWrapper.java

class AppDistributionWrapper {
    void signInAndUpdate() {
        // In production, do nothing.
    }
}

Kotlin+KTX

// src/{production variant}/java/com/example/AppDistributionWrapper.kt

class AppDistributionWrapper {
    fun signInAndUpdate() {
        // In production, do nothing.
    }
}

在应用代码中调用封装容器方法,例如在主 activity 的 onResume() 中调用:

Java

// src/main/java/com/example/MainActivity.java

public class MainActivity extends AppCompatActivity {
    AppDistributionWrapper appDistributionWrapper =
        new AppDistributionWrapper();

    @Override
    public void onResume() {
        super.onResume();
        appDistributionWrapper.signInAndUpdate();
    }
}

Kotlin+KTX

// src/main/java/com/example/MainActivity.kt

class MainActivity : AppCompatActivity() {
    var appDistributionWrapper = AppDistributionWrapper()

    override fun onResume() {
        super.onResume()
        appDistributionWrapper.signInAndUpdate()
    }
}

在应用级模块 Gradle 文件(通常是 app/build.gradle)中,更新与 App Distribution Android SDK 有关的依赖项,以便仅包含预发布 build 变体

Java

dependencies {
    // UPDATE the dependency to include the "beta" variant only (example)
    betaImplementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta02'
}

Kotlin+KTX

dependencies {
    // UPDATE the dependency to include the "beta" variant only (example)
    betaImplementation 'com.google.firebase:firebase-appdistribution-ktx:16.0.0-beta02'
}

第 5 步:构建并测试您的实现

最后,构建应用并使用 Firebase 控制台将 build 分发给测试人员来测试您的实现。

如需有关类似于以下常见问题的帮助,请访问 App Distribution 问题排查指南

  • 测试人员收不到应用内提醒
  • 系统多次提示测试人员登录 Google
  • 测试人员遇到登录循环问题