利用可选的 Firebase App Distribution SDK,在有新的应用 build 可以安装时,向测试人员显示应用内提醒。本指南说明了如何使用 App Distribution SDK 针对测试人员创建和自定义新 build 提醒。
准备工作
将 Firebase 添加到您的 iOS 项目(如果尚未添加)。
第 1 步:启用 App Distribution Tester API
在 Google Cloud Console 中选择您的项目。
在 Firebase App Testers API 下,点击启用。
第 2 步:将 App Distribution 添加到您的应用
打开为项目创建的 podfile(或运行
pod init
创建一个 podfile),然后在目标部分中添加下面一行代码:pod 'Firebase/AppDistribution'
在您的 podfile 目录中,运行
pod install
,然后打开创建的.xcworkspace
文件。对 Google 应用 ID 进行编码(只需针对 iOS 版本 9 和 10 执行此操作):
对 Google 应用 ID 进行编码
在
Info.plist file
中包含代码段以添加appdistribution-<encoded-google-app-id>
网址架构(如需查看如何在 Xcode 中添加网址架构的说明,请参阅 Apple 的文档):<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLSchemes</key> <array> <string>appdistribution-<encoded-google-app-id></string> </array> </dict> </array>
然后,将冒号 (:) 替换为短划线 (-),以对您的 Google 应用 ID 进行编码。请注意,您的 Google 应用 ID 位于
GoogleService-Info.plist
文件中。例如,如果 Google 应用 ID 是:7:77777777777:ios:123456789
已编码的 Google 应用 ID 是:
7-77777777777-ios-123456789
在
UIApplicationDelegate
中导入 Firebase 模块:Swift
import Firebase
Objective-C
@import Firebase;
配置一个
FirebaseApp
共享实例(通常在应用的application:didFinishLaunchingWithOptions:
方法中配置):Swift
// Use Firebase library to configure APIs FirebaseApp.configure()
Objective-C
// Use Firebase library to configure APIs [FIRApp configure];
最后,重新编译您的应用。
第 3 步:配置应用内提醒
App Distribution SDK 提供了两种针对测试人员设置应用内 build 提醒的方法:基本提醒配置(提供要向测试人员显示的预建应用更新和登录对话框)和高级提醒配置(可让您自定义专属界面)。如果您是 App Distribution SDK 新手,我们建议您先使用基本提醒配置。
基本配置
使用 checkForUpdate
向尚未启用提醒的测试人员显示预建的“启用提醒”对话框,然后检查是否有新的构建版本。调用时,该方法将遵循以下顺序:
通过提示测试人员使用 Google 帐号登录 App Distribution,确认测试人员是否已启用提醒。
如果测试人员尚未启用提醒,则显示预建的对话框。
只需在测试设备上启用提醒一次。即使在应用更新期间,提醒的启用状态也不会发生变化。提醒会在测试设备上保持启用状态,直到应用被卸载或
signOutTester
方法被调用为止。 如需了解详情,请参阅该方法的参考文档(Swift 或 Objective-C)。检查是否有新推出的 build 可供测试人员安装。
您可以在应用中的任何位置包含 checkForUpdate
。例如,您可以通过在 UIViewController
的 viewDidAppear
中包含 checkForUpdate
,以在启动时提示测试人员安装新推出的 build。
以下示例会检查测试人员是否已启用提醒以及是否可以访问新的 build;如果是,则会在可以安装 build 时显示一个对话框:
Swift
AppDistribution.appDistribution().checkForUpdate(completion: { release, error in
guard let release = release else {
return
}
// Customize your alerts here.
let title = "New Version Available"
let message = "Version \(release.displayVersion)(\(release.buildVersion)) is available."
let uialert = UIAlertController(title: title,message: message, preferredStyle: .alert)
uialert.addAction(UIAlertAction(title: "Update", style: UIAlertAction.Style.default) {
_ in
UIApplication.shared.open(release.downloadURL)
})
uialert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel) {
_ in
})
// self should be a UIViewController.
self.present(uialert, animated: true, completion: nil)
})
Objective-C
[[FIRAppDistribution appDistribution]
checkForUpdateWithCompletion:^(FIRAppDistributionRelease *_Nullable release,
NSError *_Nullable error) {
if (error) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Check For Update"
message:[NSString stringWithFormat:@"Error during tester sign in! %@", error.localizedDescription]
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {}];
[alert addAction:okAction];
[self presentViewController:alert animated:YES completion:nil];
return;
}
if (release) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"New Version Available"
message:[NSString stringWithFormat:@"Version %@ (%@) is available.", release.displayVersion,
release.buildVersion] preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *updateAction = [UIAlertAction actionWithTitle:@"Update"
style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
[[UIApplication sharedApplication] openURL:release.downloadURL options:@{}
completionHandler:nil];
}];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel"
style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {}];
[alert addAction:updateAction];
[alert addAction:cancelAction];
[self presentViewController:alert animated:YES completion:nil];
}
}];
高级配置
方法 signInTester
和 isTesterSignedIn
可让您更灵活地自定义测试人员的登录体验,因此可以与应用的外观更相符。
以下示例会检查测试人员是否已登录其 Firebase App Distribution 测试人员帐号,因此您可以选择仅为尚未登录的测试人员显示登录界面。测试人员登录后,您便可以调用 checkForUpdate
以检查测试人员是否可以访问新的构建版本。
Swift
// Sign in a tester without automatically checking for update
if (!AppDistribution.appDistribution().isTesterSignedIn) {
AppDistribution.appDistribution().signInTester (completion: { error in
// completion block for signInTester
if (error != nil) {
// handle failed sign in
return
}
// handle successful sign in
})
}
// Only check for update if tester is already signed in - do not prompt
if (AppDistribution.appDistribution().isTesterSignedIn) {
AppDistribution.appDistribution().checkForUpdate(completion: { release, error in
// completion block for check for update
})
}
Objective-C
// Sign in a tester without automatically checking for update
if(![[FIRAppDistribution appDistribution] isTesterSignedIn]) {
[[FIRAppDistribution appDistribution]
signInTesterWithCompletion:^(NSError *_Nullable error) {
// completion block for signInTester
if (error) {
// handle failed sign in
return;
}
// handle successful sign in
}];
}
// only check for update if tester is already signed in - do not prompt
if([[FIRAppDistribution appDistribution] isTesterSignedIn]) {
[[FIRAppDistribution appDistribution]
checkForUpdateWithCompletion:^(FIRAppDistributionRelease *_Nullable release,
NSError *_Nullable error) {
// completion block for check for update
}];
}
如需了解其他方法(包括 signOutTester
),请参阅适用于 Swift 和 Objective-C 的 App Distribution 参考文档。
第 4 步:构建并测试您的实现
最后,使用 Firebase 控制台将 build 分发给测试人员,以构建应用并测试实现。
如需有关类似于以下常见问题的帮助,请访问 App Distribution 问题排查指南:
- 测试人员收不到应用内提醒
- 系统多次提示测试人员登录 Google