Android GooglePlay 应用内更新简介

3,393 阅读3分钟

在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时会报错。
image.png
  • 在Google Play Console后台应用中的设置->内部应用分享中阅读并同意协议。
image.png image.png image.png

WeChat70691ad55e4ed010c28317032fe38691.png

测试更新

测试机上需要打开Play商店的内部应用分享,步骤为:

  1. 设置->关于->点击7次商店版本进入开发者模式
  2. 设置->常规->开启内部应用分享

WeChatb127df86aa62e49b6b0f0763a9d12cb3.png

开启内部应用分享后,在浏览器中先打开版本较低的测试包的链接。

WeChat68f7473af697104834c512e01b36b8a0.png

点击OPEN IN PLAY STORE APP进入商店安装测试包。

WeChat59ec982972053ac18a9c7e49c3424ef4.png

在浏览器中打开较高版本的测试包的链接,进入商店,但不要点击更新按钮。

WeChatdabfbc8a5777eca06cf9b007a5bfba09.png

打开之前安装的较低版本的测试包,就可以接收到更新信息。

WeChata030d2cd1e1e00c95ad3404f727033a5.png