在调试设备上测试In-App Update API时显示UPDATE_NOT_AVAILABLE

20

我正在尝试集成新的In-App Update API,但无法测试其实施。看起来我的代码没问题,因此我阅读了故障排除文档,但不理解其中的两个点:

确保你要测试的应用签名密钥与Google Play上的一致。

  1. 在安装APK时,在调试模式下如何使用相同的签名密钥进行签名?

如果你要测试的应用没有可用更新,请检查你是否正确设置了测试通道。

  1. 必须将应用程序发布到内部测试轨道才能测试实现吗?

无论如何,我只想在我的设备上测试,并将版本代码从Play商店版本递减,但始终显示“UPDATE_NOT_AVAILABLE”。

这是我的代码:

val appUpdateInfo: Task<AppUpdateInfo> = appUpdateManager.appUpdateInfo
appUpdateInfo.addOnSuccessListener {
    if (it.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && it.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
        appUpdateManager.startUpdateFlowForResult(it, AppUpdateType.FLEXIBLE, this, 2);
    }else{
        toast("Not Available")
    }
}

不,目前还没有。如果你将来解决了,请分享一下。 - gautam
到目前为止还没有。 - gautam
为我工作。使用较低版本生成已签名的apk。它会起作用!! - Dmarp
@gautamkumar 是的,我正在使用应用程序包。它不能与应用程序包一起工作吗? - Ishaan
@gautamkumar,你找到可接受的解决方案了吗? - Arbaz.in
显示剩余5条评论
12个回答

19

我也曾经为这个问题苦苦挣扎了几天,最后再一次仔细阅读文档后解决了。请阅读官方文档中有关应用内更新的这一部分

该链接描述了正确的测试步骤如下:

  1. 在您的测试设备上,请确保您已经安装了一个满足以下要求的应用程序版本:
  • 使用内部应用程序共享URL安装了应用程序
  • 支持应用内更新
  • 使用的版本代码低于您的应用程序更新版本
  1. 按照Play Console的说明进行内部分享应用程序的操作。确保上传一个使用比您已经在测试设备上安装的版本代码更高的应用程序版本。
  2. 在测试设备上,只需点击已更新版本的内部应用程序共享链接。请勿从您点击链接后看到的Google Play商店页面安装应用程序。
  3. 从设备的应用程序抽屉或主屏幕打开应用程序。现在应该可以使用应用内更新了,您可以测试您的应用程序对其的实现。

这样做也非常有帮助,因为您无需等待应用程序发布,即可立即开始测试。


欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:添加链接周围的上下文,以便您的同行用户了解它是什么以及为什么存在,然后引用您链接到的页面中最相关的部分,以防目标页面不可用。仅仅是一个链接的答案可能会被删除 - ChrisMM
@ChrisMM 感谢您的推荐,我已经相应地更新了答案。 - Johan Ferreira
1
谢谢,这个解决方案对我很有用。我想要补充的是,在你在Google Play上添加新的更新之后,请耐心等待一段时间(我不知道具体需要多长时间,对我来说大约需要5分钟),直到Google Play API开始向旧版本的应用程序发送有关新更新的信息。 - Tomas Maksimavicius
1
文档已更改,因此正确的链接为https://developer.android.com/guide/playcore/in-app-updates/test。 - om252345
谢谢@om252345,我已经在答案中更新了我的链接。 - Johan Ferreira

13
  • 现在,对于调试版本的应用程序无法进行内部应用更新测试。您也不需要将apk放到PlayStore来进行测试。测试 in-app-update 的最佳方法是使用 internal-app-sharing
  • 如果按照以下步骤逐一执行,您就可以成功测试。
  • 要测试应用程序,测试人员必须先在PlayStore中启用内部应用程序共享,请按照此链接进行操作:如何为Android启用内部应用程序共享?
  • 如果您勇敢地理解官方文档,则只需按照此链接设置在设备上进行 in-app-update 测试:https://developer.android.com/guide/playcore/in-app-updates#internal-app-sharing
  • 完成在 Play Store 中设置 internal-app-sharing 后,请确保您已经上传了 2 个 apk 到 Play Console 的 internal-app-sharing,并生成了 2 个链接。两个 apk 都将使用相同的签名密钥进行签名(不需要与您用于生产的签名密钥相同,任何虚假的签名密钥都可以工作)。
  • 首先,您需要将具有较低 VersionCode(例如100)并实现 In-app-update 的 apk 上传到 Play 控制台的 internal-app-sharing。
  • 如何上传 apk 到 Play 控制台的 internal-app-sharing,请参考此链接:https://support.google.com/googleplay/android-developer/answer/9844679?visit_id=637437125318137239-1277036129&rd=1

    注意:确保您已在设备上卸载了任何与包名称相同的预安装应用程序。

    1. 现在,您复制在 Play 控制台的 internal-app-sharing 上上传的应用程序的链接,并使用此链接在设备上安装应用程序。

    注意:在安装之前,请确保您在 play-store 上使用的电子邮件已添加到 Play 控制台的 internal-app-sharing 邮件列表中。

    1. 现在,一旦您使用链接安装了应用程序,就需要再次创建具有更高 VersionCode(例如101)的新签名 apk。然后将此 apk 上传到 internal-app-sharing。

    2. 现在,从 internal-app-sharing 复制具有更高 VersionCode 的链接。在设备上单击此链接,它将带您到 play-store,但是这次会启用“更新”按钮而不是“安装”按钮,因为应用程序已经以较低 VersionCode 安装在设备上。

    3. 您不需要在 PlayStore 上点击更新按钮,只需点击链接并打开 PlayStore 屏幕。现在关闭 PlayStore 应用程序。

    4. 现在,您可以从设备启动已安装的应用程序。

    如果您的应用内更新实现正确,则启动应用程序时将显示来自 PlayStore 的更新对话框。

    最后,如果它在任何方面对您有所帮助,请不要忘记点赞。继续编码!


    1
    一个能够工作但未在文档中提到的要点,第6点。感谢您的帮助。 - Khalid Saeed
    我按照步骤进行了操作,最终在使用内部应用程序共享链接进行调试时,它会重定向到Play商店并打开我的应用程序,但其中的安装按钮却不见了!我的应用程序仅支持美国地区。我正在尝试从另一个国家进行测试。这可能是原因吗?请澄清,谢谢。 - Divya
    @Abhishek 我正在使用灵活的更新,但是 Google Play 的用户界面覆盖了整个屏幕,与立即更新类型相同。我正在使用依赖项 'com.google.android.play:app-update-ktx:2.0.0',你能帮我解决这个问题吗? - Kamal Nayan

    8
    我遇到了UPDATE_NOT_AVAILABLE的类似问题。经过数小时研究,我解决了这个问题:
    1. 使用Google Play商店安装测试应用程序的某个版本(我使用了内部测试版本)

    2. 在Play控制台上推出另一个具有更高版本代码的版本(相同的内部测试轨迹)

    3. 关闭测试应用和Google Play商店(不仅仅是返回主屏幕,还要按最近使用键将其滑掉)

    4. 打开Google Play商店,确保测试应用程序有可用的更新(您可以在“我的应用和游戏”>已安装中检查)

    5. 现在打开测试应用并检查UPDATE_AVAILABLE

    此方法对我来说几乎是立竿见影的。

    7

    手动测试的基本要求

    为了在测试设备上手动执行完整的更新流程,您应该至少拥有两个具有不同版本号的应用程序版本:源版本和目标版本。

    • 具有更高版本号的源版本应发布在Google Play上,这是Google Play将识别为可用更新的版本。较低版本号且集成了IAUs(应用内更新)功能的目标版本应安装在您的设备上,这是将进行更新的版本。问题在于,当应用程序请求Google Play检查可用更新时,它会将已安装应用程序的版本号与Google Play中最后一个可用构建的版本号进行比较。因此,仅当Google Play中的版本号高于设备上实际应用程序的版本号时,才会触发IAUs功能。
    • 源版本和目标版本都需要具有相同的包名称并使用相同的发布证书进行签名。
    • Android 5.0(API级别21)或更高版本。
    • Play Core库1.5.0或更高版本。

    无法获取更新错误

    首先,请仔细检查上述要求。如果您按照所有要求成功完成上述步骤并仍然出现错误,则请注意以下技巧。 最有可能的原因是由于内部缓存机制,Google Play应用程序尚未了解更新。 为了确保在手动测试时具有新鲜缓存,您可以在Google Play应用程序的“我的应用和游戏”屏幕中刷新缓存版本。或者,作为替代方法,您可以在设置中清除Google Play应用程序的缓存。请注意,这只是测试问题,不会影响最终用户,因为缓存每天都会更新。

    注意 - IAUs不需要使用App Bundle。


    我需要上传较低版本的APK到Play Store,然后下载它进行测试吗?@Arpit - Maulik Dodia
    @MaulikDodia 应该将更高版本的APK发布到Google Play,然后在设备上安装带有IAU功能的较低版本APK。这样,只有当Google Play中的版本号高于设备上实际应用程序的版本时,IAUs功能才会被触发。 - Arpit J.
    1
    我也尝试了同样的方法,但没有成功。每次在addOnSuccessListener上都会得到UPDATE_NOT_AVAILABLE的错误。你能帮我解决一下吗?请查看我在@Oleg答案下的评论,谢谢。@Arpit - Maulik Dodia
    遇到了相同的问题,应用程序更新代码与之前完全一致,但不幸的是,即使我安装了较低版本的应用程序,仍然出现UPDATE_NOT_AVAILABLE错误。 - Anuj Vaish

    4
    我从Google Play下载了我的应用程序,然后将其删除,并安装了低版本号的已签名apk文件。
    “应用内更新仅适用于拥有该应用程序的用户帐户。 因此,请确保您使用的帐户已经至少从Google Play下载过您的应用程序,然后再使用该帐户测试应用内更新。” developer.android.com/guide/app-bundle/in-app-updates

    你是使用Android App Bundle还是Apk?安装较低版本的apk后,我收到了“This App was not installed by google with no update”的提示。 - gautam
    1
    Apk。这对我有用:1.从Google Play安装我的应用程序。2.从我的智能手机中删除此应用程序。3.安装带有较低版本代码的已签名apk。 - Oleg
    仅拥有该应用的用户帐户可以使用应用内更新。这是什么意思?我有 x 个电子邮件 ID,在 Play Store 中拥有我的应用,还有 y 个电子邮件 ID,在其他设备上。我正在 y 电子邮件 ID 设备上安装已签名的较低版本 APK(不是来自 Play Store)。但我没有收到更新对话框。我需要上传较低版本的 APK 到 Play Store 吗?谢谢@Oleg - Maulik Dodia
    首先尝试在您的y-email设备上从Google Play安装您的应用程序。然后删除您的应用程序并直接安装apk(而不是从Google Play安装)。 - Oleg

    3
    如果您按照Arpit J.的建议检测应用程序的基本要求,但仍无法成功测试该应用程序,我想添加一个最后一步,以帮助您快速测试该应用程序。请按照图像中显示的方式从设置中转到Play商店应用程序信息,并按附加屏幕截图所示清除数据。前往Play商店应用程序信息的步骤可能因设备而异。

    enter image description here

    enter image description here

    enter image description here

    enter image description here


    1
    有时候这才是真正的原因,我也遇到过这种情况。 - dicarlomagnus

    2
    此外,还有一个专门用于此类目的FakeAppUpdateManager,您可以使用它。原始答案为“最初的回答”。

    感谢您的帮助,但仍然无法从中显示UI。文档中写道:“此实现完全包含在库中,并且不与Play商店交互。因此,不会显示任何UI,也不会真正执行任何更新。” - gautam

    2
    首先,您需要将应用程序发布到Google Play。请确保:
    1. 您发布的版本代码高于您要测试更新的版本代码,否则它将无法识别为更新。然后让Google Play刷新其缓存一段时间(在我的情况下,我等了12个小时才能第一次使其正常工作)。
    2. 您已使用相同的签名对两个apk进行了签名。
    如果您想拥有一个可工作的演示应用程序,我已上传了一个git存储库,其版本代码低于我在Google Play上发布的版本代码

    Working in-app updates UI


    我尝试了你的GitHub项目,但它抛出了AppUpdateService: Failed to bind to the service错误。 - Magesh Pandian
    1
    您可以使用调试版本测试您的实现,但startUpdateFlowForResult不会打开“更新流程”屏幕。 - ViramP
    1
    @kevintresuelo,我尝试了你在Github上的apk链接,但仍然没有显示任何更新。 - gautam
    3
    那么选择了 Google 登录的应用程序怎么办?我们使用上传密钥进行签名和上传 APK,但是 Google Play 使用唯一的签名密钥来分发我们的应用程序。我们无法访问该签名密钥。 - nitinkumarp
    我也遇到了同样的问题,在仔细检查其他所有内容后,可能是因为我选择了Google登录。@nitinkumarp 你是否设法解决了这个问题? - Filippo Vigani
    显示剩余5条评论

    1

    最终解决方法是从Play Store的“我的应用和游戏”中删除该应用程序 -> 库。

    • 您必须使用与先前版本相同的密钥库安装发布应用程序。

    当您在设备上或任何共享相同gmail地址的设备上以更高的版本代码安装了相同的应用程序时,就会发生这种情况。


    1

    当内部应用程序共享不起作用时

    在真实设备上,内部应用程序共享无法正常工作。我测试了几个小时,总是得到最新版本的内部测试版,而不是我期望的内部应用程序共享版

    解决方案是使用带有Play商店的模拟器。

    我描述一下步骤:

    1. 创建具有Google Play的虚拟设备大于或等于API Level 21 5.0。
    2. 打开模拟器,并使用在内部测试人员列表中的谷歌账号登录。
    3. 构建两个具有不同版本的APK。每个APK都要暂时设置相同的versionCode和versionName以便在进行安装时进行检查。例如:

    APK 1: versionCode and versionName: 100
    
    APK 2: versionCode and versionName: 101
    

    1. 将APK 1上传到internalappsharing并设置版本号和版本名称为100。

    2. 复制并粘贴APK 1的共享链接到Keep Notes web应用程序。

    3. 使用来自模拟器Keep Notes应用程序的链接安装具有版本号100的APK 1。
    4. 最重要的是:检查已安装的应用程序版本名称是否为100。
    5. 如果此时打开APK 1,除非我们上传具有更大版本的APK 2,否则不会提供更新。
    6. 将带有代码101的APK 2上传到internalappsharing
    7. 将APK 2的链接复制并粘贴到Keep Notes web应用程序中。
    8. 不要从链接安装APK 2。只需输入APK 2链接以检查Play商店是否描述了更新的存在。
    9. 在模拟器上安装了APK 1的应用程序中打开并在应用内安装更新。

    最后,每当他们进入一个版本代码大于从模拟器安装的上一个版本的链接时,他们将看到新更新的存在,这应该在应用内安装而不是从Play商店安装。

    enter image description here


    值得一提的是,Logcat 与内部应用程序共享兼容。
    祝好,

    来源


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接