利用可选的 Firebase App Distribution SDK,您可以在有新的应用 build 可供安装时向测试人员显示应用内提醒。本指南说明了如何使用 App Distribution SDK 针对测试人员创建和自定义新 build 提醒。
准备工作
将 Firebase 添加到您的 Android 项目(如果尚未添加)。
第 1 步:启用 App Distribution Tester API
在 Google Cloud Console 中选择您的项目。
在“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。调用时,该方法将遵循以下顺序:
检查测试人员是否已启用提醒。如果测试人员尚未启用提醒,该方法会提示测试人员使用其 Google 帐号登录 App Distribution。
检查是否有新推出的 build 可供测试人员安装。
显示提示测试人员进行更新的预构建提醒。
如果新 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.
}
}
}
}
高级配置
高级登录配置
signInTester
和 isTesterSignedIn
方法可让您更灵活地自定义测试人员的登录体验,以使测试人员的体验能够更好地与应用的外观和风格相匹配。
以下示例会检查测试人员是否已登录其 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.
}
}
高级更新配置
checkForNewRelease
和 updateApp
方法可让您更灵活地自定义何时提醒测试人员进行更新。您还可以自定义预构建的更新对话框和下载进度指示器,以使它们能够更好地与应用的外观和风格相匹配。
请注意,updateApp
不提供下载进度指示。这意味着,您需要使用 NotificationManager
、某种应用内状态显示或某种其他方法实现自己的进度指示。
以下示例会检查是否有新版本,然后会显示自定义界面。在调用 checkForNewRelease
和 updateApp
之前,请确保使用高级登录配置来让测试人员登录。
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
- 测试人员遇到登录循环问题