在App的开发中,应用内更新是必不可少的,国内常见的做法是在App中实现下载apk并安装。但是如果要上架Google Play,这种做法会导致过不了审。本篇文章简单介绍一下Goolge Play官方实现应用内更新的API。
集成更新库
在项目app module的build.gradle中的dependencies中添加依赖:
dependencies {
implementation("com.google.android.play:app-update:2.1.0")
//若使用kotlin同时导入
implementation("com.google.android.play:app-update-ktx:2.1.0")
}
获取更新信息
可以通过如下代码获取更新信息:
val appUpdateManager = AppUpdateManagerFactory.create(context)
appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
when (appUpdateInfo.updateAvailability()) {
UpdateAvailability.UPDATE_AVAILABLE -> {
//有可用更新
//更新优先级(0-5)
val updatePriority = appUpdateInfo.updatePriority()
//商店提供更新后过去了几天
val stalenessDays = appUpdateInfo.clientVersionStalenessDays() ?: -1
//可用版本号
val availableVersionCode = appUpdateInfo.availableVersionCode()
}
UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS -> {
//正在更新
}
UpdateAvailability.UPDATE_NOT_AVAILABLE -> {
//无可用更新
}
UpdateAvailability.UNKNOWN -> {
//未知错误
}
}
}
代码中的updatePriority表示本次更新的优先级,谷歌是这样分类的:
- 细微的界面改进:低优先级更新;既不请求灵活更新,也不请求立即更新。仅在用户没有与您的应用互动时进行更新。(0、1)
- 性能提升:中优先级更新;请求灵活更新。(2、3)
- 关键安全更新:高优先级更新;请求立即更新。(4、5)
如需设置更新的优先级,请使用 Google Play Developer API 中 Edits.tracks.releases 下的 inAppUpdatePriority 字段。发布版本中的所有新增版本都被视为与发布版本具有相同的优先级。只有在发布新版本时才能设置优先级,且以后无法更改。
启动更新
可以通过如下代码启动更新:
//IMMEDIATE(立即更新,会打断用户与app的交互)
val appUpdateManager = AppUpdateManagerFactory.create(context)
appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&
appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
) {
appUpdateManager?.startUpdateFlowForResult(appUpdateInfo, activity, AppUpdateOptions.defaultOptions(AppUpdateType.IMMEDIATE), UPDATE_REQUEST_CODE)
}
}
//FLEXIBLE(灵活更新,不会打断用户与app的交互)
val appUpdateManager = AppUpdateManagerFactory.create(context)
val installListener = object : InstallStateUpdatedListener {
override fun onStateUpdate(installState: InstallState) {
when (installState.installStatus()) {
InstallStatus.DOWNLOADING -> {
//下载中,可以在此获取进度
//已下载字节
val bytesDownloaded = installState.bytesDownloaded()
//需要下载的字节
val totalBytesToDownload = installState.totalBytesToDownload()
}
InstallStatus.DOWNLOADED -> {
//通知用户更新已下载完毕,重启以安装应用
appUpdateManager?.unregisterListener(this)
appUpdateManager?.completeUpdate()
}
lse -> {}
}
}
}
appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&
appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)
) {
appUpdateManager?.registerListener(installListener)
appUpdateManager?.startUpdateFlowForResult(appUpdateInfo, activity, AppUpdateOptions.defaultOptions(AppUpdateType.FLEXIBLE), UPDATE_REQUEST_CODE)
}
}
测试应用内更新
Google Play提供了测试应用内更新的方法,下面简单介绍下。
前置条件
- 要使用内部应用分享功能需要先发布一次应用,否则上传aab时会报错。
- 在Google Play Console后台应用中的设置->内部应用分享中阅读并同意协议。
- 在Play Internal App Sharing中上传用于测试的包,上传完成后复制链接,如图:
测试更新
测试机上需要打开Play商店的内部应用分享,步骤为:
- 设置->关于->点击7次商店版本进入开发者模式
- 设置->常规->开启内部应用分享
开启内部应用分享后,在浏览器中先打开版本较低的测试包的链接。
点击OPEN IN PLAY STORE APP进入商店安装测试包。
在浏览器中打开较高版本的测试包的链接,进入商店,但不要点击更新按钮。
打开之前安装的较低版本的测试包,就可以接收到更新信息。