当用户设备上安装的是最新版的应用时,他们可以试用新功能,并从性能提升和问题修复中获益。虽然一些用户会在设备连接到不按流量计费的连接时启用后台更新,但还有一些用户可能需要收到提醒来决定是否安装更新。应用内更新是 Google Play Core 库的一项功能,用于提示活跃用户更新您的应用。
应用内更新功能适用于搭载 Android 5.0(API 级别 21)或更高版本的设备。此外,只有 Android 移动设备、Android 平板电脑以及 Chrome OS 设备支持应用内更新。
注意:应用内更新与使用 APK 扩展文件(.obb 文件)的应用不兼容。
官方地址
开发环境
dependencies {
// So, make sure you also include that repository in your project's build.gradle file.
implementation 'com.google.android.play:app-update:2.0.0'
// For Kotlin users also add the Kotlin extensions library for Play In-App Update:
implementation 'com.google.android.play:app-update-ktx:2.0.0'
}
检查是否有可用更新
在请求更新之前,请检查您的应用是否有可用更新。您可以使用 AppUpdateManager
检查是否有更新:
m_appUpdateManager = AppUpdateManagerFactory.create(mContext);
// Returns an intent object that you use to check for an update.
Task<AppUpdateInfo> appUpdateInfoTask = m_appUpdateManager.getAppUpdateInfo();
// Checks that the platform will allow the specified type of update.
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
// This example applies an immediate update. To apply a flexible update
// instead, pass in AppUpdateType.FLEXIBLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
// Request the update.
try {
m_appUpdateManager.startUpdateFlowForResult(appUpdateInfo,AppUpdateType.FLEXIBLE,mContext,9001);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
});
返回的 AppUpdateInfo
实例包含更新可用性状态。该实例也会包含以下内容,具体取决于更新的状态:
- 如果有可用更新且允许更新,该实例也会包含一个用于启动更新的 intent。
- 如果应用内更新已在进行中,该实例也会报告正在进行的更新的状态。
检查更新是否已过时
除了检查是否有可用更新之外,您可能还需要检查自通过 Play 商店通知用户更新以来已经过了多长时间。这可帮助您决定应发起灵活更新还是立即更新。例如,您可能需要等待几天后再通知用户进行灵活更新,在此之后再等待几天,然后再要求用户立即更新。
您可以使用 clientVersionStalenessDays()
检查自 Play 商店中提供更新以来已经过了多少天:
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.clientVersionStalenessDays() != null
&& appUpdateInfo.clientVersionStalenessDays() >= 0
// This example applies an immediate update. To apply a flexible update
// instead, pass in AppUpdateType.FLEXIBLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
// Request the update.
try {
//灵活更新
m_appUpdateManager.startUpdateFlowForResult(appUpdateInfo,AppUpdateType.FLEXIBLE,mContext,9001);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
启动更新
在确认有可用更新后,您可以使用 AppUpdateManager.startUpdateFlowForResult()
请求更新:
appUpdateManager.startUpdateFlowForResult(
// Pass the intent that is returned by 'getAppUpdateInfo()'.
appUpdateInfo,
// Or 'AppUpdateType.FLEXIBLE' for flexible updates.
AppUpdateType.IMMEDIATE,
// The current activity making the update request.
this,
// Include a request code to later monitor this update request.
MY_REQUEST_CODE);
注意:请注意请求更新的频率,以免给用户造成烦恼或令用户感到厌烦。您应仅在相应更改对应用的核心功能至关重要时请求应用内更新。
获取更新状态的回调
启动更新后,您可以使用 onActivityResult()
回调来处理更新失败或取消:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_REQUEST_CODE) {
if (resultCode != RESULT_OK) {
log("Update flow failed! Result code: " + resultCode);
// If the update is cancelled or fails,
// you can request to start the update again.
}
}
}
您可能会从 onActivityResult()
回调收到以下几个值:
-
RESULT_OK
:用户已接受更新。对于立即更新,您可能不会收到此回调,因为在将控制权交还给您的应用之前,更新应该已经完成了。 -
RESULT_CANCELED
:用户已拒绝或取消更新。 -
ActivityResult.RESULT_IN_APP_UPDATE_FAILED
:发生了一些其他错误,使得用户无法同意更新或更新无法继续进行。
灵活更新
灵活更新提供后台下载和安装,同时妥善监控状态。如果让用户可以在下载更新的同时使用应用,这种用户体验流程非常合适。例如,您可能希望鼓励用户试用对应用的核心功能而言并不是至关重要的新功能。
当您启动灵活更新时,系统会先向用户显示一个对话框以征得用户同意。如果用户同意,那么系统会在后台启动下载,用户可以继续与您的应用互动。本部分介绍了如何监控和完成灵活的应用内更新。
监控灵活更新状态
对于灵活更新,下载开始后,您的应用需要监控更新状态以了解何时可以安装更新并在应用的界面中显示进度。
您可以通过注册监听器来安装状态更新,从而监控正在进行的更新的状态。您还可以在应用的界面中提供一个进度条,以告知用户下载的进度。
安装灵活更新
在检测到 InstallStatus.DOWNLOADED 状态时,您需要重启应用以安装更新。
与立即更新不同,Google Play 不会为灵活更新自动触发应用重启。这是因为,在灵活更新期间,用户希望在他们决定想要安装更新之前能够继续与应用互动。
建议您提供通知(或其他一些界面指示)以告知用户更新已可供安装,并在重启应用之前请求用户确认。
appUpdateManager.completeUpdate();
立即更新
立即更新属于全屏用户体验流程,要求用户更新并重启应用才能继续使用应用。当更新对应用的核心功能至关重要时,这种用户体验流程最为合适。用户接受立即更新后,Google Play 会处理更新安装和应用重启。
在您启动立即更新且用户同意开始更新后,Google Play 会在整个更新期间在应用界面顶部显示更新进度。如果用户在更新期间关闭或终止您的应用,更新应继续在后台下载并安装,无需额外得到用户确认。
不过,当您的应用返回到前台时,您应确认更新未在 UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
状态下停止。如果更新在此状态下停止,请继续更新:
appUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener(
appUpdateInfo -> {
...
if (appUpdateInfo.updateAvailability()
== UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
// If an in-app update is already running, resume the update.
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
IMMEDIATE,
this,
MY_REQUEST_CODE);
}
});
如果要使用灵活更新,下载任务放在后台进行,那么startUpdateFlowForResult应该指定AppUpdateType.FLEXIBLE参数,依然需要用户确定更新,然后更新UI隐藏,用户可以继续操作App。
测试应用内更新
使用内部应用分享功能进行测试
您可以使用内部应用分享功能测试应用内更新,具体执行步骤如下所示:
- 确保您的测试设备安装了支持应用内更新的应用版本,且应用是使用内部应用分享网址安装的。
- 按照 Play 管理中心内的说明在内部分享应用。上传应用的某个版本,其版本号应高于测试设备上所安装的应用。
- 在测试设备上,点击更新后的应用版本对应的内部应用分享链接,但请勿从点击该链接后显示的 Play 商店页面安装应用。
- 从设备的应用抽屉或主屏幕打开应用。更新现在应可供您的应用使用,您可以测试应用内更新的实现。
问题排查
本部分介绍了当应用内更新在测试期间可能无法按预期运行时的一些可行性解决方案:
测试应用内更新实战
主要记录下测试过程中遇到的坑
获授权测试人员如何开启内部应用分享功能
获授权测试人员必须先在 Google Play 商店应用中开启内部应用分享功能,然后才能使用这项功能下载应用。
打开 Google Play 商店应用 。
依次点按“菜单”图标 > 设置。
-
在“关于”部分,点按 Play 商店版本 7 次。
-
在系统显示内部应用分享设置后,请点按开关以开启内部应用分享功能。
点按开启。
- 注意:一定要在测试机上执行上述步骤,否则无法正常测试。
坑1:当执行到上述步骤第三点的时候“3. 在测试设备上,点击更新后的应用版本对应的内部应用分享链接,但请勿从点击该链接后显示的 Play 商店页面安装应用。”,点击分享链接并没有跳转到内部分享的下载地址而是直接跳转到了play 商店的产品页(很奇怪不知道是什么原因,三部手机只有一步手机可以正常跳转到分享链接安装地址),链接安装地址界面如下:
坑2:后台上传了比测试机更高的版本,但是连真机调试看日志,一直检测不到更新。此时需要在手机浏览器中点击高版本的分享链接,点击后出现下面信息后说明有可用更新了,这时候再打开应用就会有更新提示。