Google Play Android应用内更新

当用户设备上安装的是最新版的应用时,他们可以试用新功能,并从性能提升和问题修复中获益。虽然一些用户会在设备连接到不按流量计费的连接时启用后台更新,但还有一些用户可能需要收到提醒来决定是否安装更新。应用内更新是 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:发生了一些其他错误,使得用户无法同意更新或更新无法继续进行。

灵活更新

灵活更新提供后台下载和安装,同时妥善监控状态。如果让用户可以在下载更新的同时使用应用,这种用户体验流程非常合适。例如,您可能希望鼓励用户试用对应用的核心功能而言并不是至关重要的新功能。


image.png

当您启动灵活更新时,系统会先向用户显示一个对话框以征得用户同意。如果用户同意,那么系统会在后台启动下载,用户可以继续与您的应用互动。本部分介绍了如何监控和完成灵活的应用内更新。

监控灵活更新状态
对于灵活更新,下载开始后,您的应用需要监控更新状态以了解何时可以安装更新并在应用的界面中显示进度。

您可以通过注册监听器来安装状态更新,从而监控正在进行的更新的状态。您还可以在应用的界面中提供一个进度条,以告知用户下载的进度。
安装灵活更新
在检测到 InstallStatus.DOWNLOADED 状态时,您需要重启应用以安装更新。

与立即更新不同,Google Play 不会为灵活更新自动触发应用重启。这是因为,在灵活更新期间,用户希望在他们决定想要安装更新之前能够继续与应用互动。

建议您提供通知(或其他一些界面指示)以告知用户更新已可供安装,并在重启应用之前请求用户确认。

appUpdateManager.completeUpdate();

立即更新

立即更新属于全屏用户体验流程,要求用户更新并重启应用才能继续使用应用。当更新对应用的核心功能至关重要时,这种用户体验流程最为合适。用户接受立即更新后,Google Play 会处理更新安装和应用重启。

image.png

在您启动立即更新且用户同意开始更新后,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。

测试应用内更新

使用内部应用分享功能进行测试

您可以使用内部应用分享功能测试应用内更新,具体执行步骤如下所示:

  1. 确保您的测试设备安装了支持应用内更新的应用版本,且应用是使用内部应用分享网址安装的。
  2. 按照 Play 管理中心内的说明在内部分享应用。上传应用的某个版本,其版本号应高于测试设备上所安装的应用。
  3. 在测试设备上,点击更新后的应用版本对应的内部应用分享链接,但请勿从点击该链接后显示的 Play 商店页面安装应用。
  4. 从设备的应用抽屉或主屏幕打开应用。更新现在应可供您的应用使用,您可以测试应用内更新的实现。

问题排查

本部分介绍了当应用内更新在测试期间可能无法按预期运行时的一些可行性解决方案:

  • 只有拥有应用的用户帐号可以使用应用内更新。因此,在使用帐号测试应用内更新之前,请确保您目前使用的帐号至少从 Google Play 下载过一次应用。
  • 确保您用于测试应用内更新的应用与 Google Play 中提供的应用版本具有相同的应用 ID签名密钥
  • Google Play 只能将应用更新到更高版本。因此,请确保您要测试的应用的版本号低于更新后的版本号。
  • 将应用上传到内部应用分享渠道时,不支持 inAppUpdatePriority 字段。

测试应用内更新实战

主要记录下测试过程中遇到的坑
获授权测试人员如何开启内部应用分享功能
获授权测试人员必须先在 Google Play 商店应用中开启内部应用分享功能,然后才能使用这项功能下载应用。

  1. 打开 Google Play 商店应用 。

  2. 依次点按“菜单”图标 > 设置

  3. 在“关于”部分,点按 Play 商店版本 7 次。


    image.png
  4. 在系统显示内部应用分享设置后,请点按开关以开启内部应用分享功能。

    image.png

  5. 点按开启

  • 注意:一定要在测试机上执行上述步骤,否则无法正常测试。

坑1:当执行到上述步骤第三点的时候“3. 在测试设备上,点击更新后的应用版本对应的内部应用分享链接,但请勿从点击该链接后显示的 Play 商店页面安装应用。”,点击分享链接并没有跳转到内部分享的下载地址而是直接跳转到了play 商店的产品页(很奇怪不知道是什么原因,三部手机只有一步手机可以正常跳转到分享链接安装地址),链接安装地址界面如下:


image.png

坑2:后台上传了比测试机更高的版本,但是连真机调试看日志,一直检测不到更新。此时需要在手机浏览器中点击高版本的分享链接,点击后出现下面信息后说明有可用更新了,这时候再打开应用就会有更新提示。


image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容