首页 > 解决方案 > 来自应用内的用户在 Android Play 商店中看不到最新版本

问题描述

我们有一个 Android 应用程序,它可以根据我们的初创公司后端检查自己的版本。基本上,我们的想法是我们强迫我们的用户使用最新版本(或者卡在启动屏幕上并显示有关更新的对话框)。我们使用它来将用户重定向到 Play 商店(当他单击此对话框上的按钮时):

startActivity(new Intent(ACTION_VIEW, parse("market://details?id=" + BuildConfig.APPLICATION_ID)));
            finish();

问题是,即使我们更新了一个版本,并且当我们搜索我们的应用程序时它会显示在 Play 商店中,但单击该按钮的用户会看到他们使用的是“最新”版本(这是现实)。

所以基本上:

  1. 用户已安装 1.0 版
  2. 我们更新到 1.1 版本,并将后端设置为 1.1 作为最低版本
  3. app on start 检查后端,并显示更新对话框(因为它的版本已过时)
  4. 用户点击更新对话框,进入 Play 商店,但商店显示当前版本为 1.0
  5. 如果您正常搜索我们的应用程序,您会看到最新版本是 1.1

这给我们带来了很多问题,因为用户基本上无法使用该应用程序并且大多数人不知道上面的区别(即他们不会手动搜索该应用程序)

是什么导致了这里的问题?有人有类似的问题吗?它是某种形式的缓存吗?我们应该使用不同的链接格式吗?

任何输入表示赞赏

标签: androidgoogle-playgoogle-play-console

解决方案


它显然是缓存问题。我认为您必须对后端版本进行更多控制,然后更新对话框不会使您的应用程序对用户无法使用。您可以应用的想法 -

  1. 创建一个名为并赋予价值的秘密要点version.json

     {
     "versioncode": "1"
     }
    

例如“1”是您的应用程序的版本代码。

如何获取链接 -https://gist.github.com/[gist_user]/[gist_id]/raw/[file_name]

例如https://gist.github.com/zahidbd2/be18d53053d23759ecb923fd84ddc23f/raw/version.json

您必须在每次应用发布/发布后编辑/更新此 json 的值。请记住,您必须等待几个小时或一天才能避免 playStore 的缓存问题。手动检查您的应用程序是否存在于 Play 商店中,然后更新 gist 。

version.json 的 versioncode 值将是您的应用程序的最新版本代码。

  1. 在客户端,我们将从 gist json 中检索版本代码,然后与设备上的旧版本代码进行比较packageInfo.versionCode

如果 oldVersion < curLiveVersion 则更新对话框将显示,否则不会。因此应用程序始终可用,用户将在 Playstore 中看到更新按钮(缓存问题已解决)。如果用户试图忽略更新,他们在更新之前不会使用该应用程序。

所以我将所有方法结合在一起,你可以检查一下。使用的依赖implementation 'com.squareup.okhttp3:okhttp:3.9.0'

 public void updateCheck() {
    OkHttpClient client = new OkHttpClient();
    okhttp3.Request request = new Request.Builder()
            .url("https://gist.github.com/zahidbd2/be18d53053d23759ecb923fd84ddc23f/raw/version.json")
            .build();
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.i("Version check", "couldn't retrieve version from url ");
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String bodyStr = response.body().string();
            try {
                JSONObject bodyJson = new JSONObject(bodyStr);
                if (bodyJson.has("versioncode")) {
                    int curLiveVersion = bodyJson.getInt("versioncode");
                    Log.i("Version check", String.valueOf(curLiveVersion));
                    PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
                    int oldVersion = packageInfo.versionCode;
                    if (oldVersion < curLiveVersion) {
                        //TODO
                        Log.i("Version check", "new version found , please update");
                        String packageName = getApplicationContext().getPackageName();
                        Looper.prepare();
                        ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
                        progressDialog.setMessage("Update Found");
                        progressDialog.setCancelable(false);
                        progressDialog.setCanceledOnTouchOutside(false);
                        progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Update", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Intent intent = new Intent(Intent.ACTION_VIEW);
                                intent.setData(Uri.parse("https://play.google.com/store/apps/details?id=" + packageName + "&hl=en"));
                                startActivity(intent);
                            }
                        });
                        progressDialog.show();
                        Looper.loop();
                    } else {
                        Log.i("Version check", "new version not available");
                    }

                }
            } catch (JSONException | NumberFormatException | PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }

        }
    });
}

测试-

  1. 在开发者控制台中创建内部测试。通过电子邮件添加测试人员,上传签名的构建并将链接分享给用户,在测试人员端接受邀请。测试者将卸载公版并安装 beta 测试版。

  2. 使用更高版本代码构建另一个应用程序并创建另一个内部测试并上传新版本。在这种情况下,不要与 tester 共享链接。等待几个小时并从 Playstore 搜索中的测试设备检查最新版本是否实际存在(实际上缓存问题仍然存在或不存在)如果存在,然后编辑要点。假设您的最新应用程序版本代码为 2,然后给出值

     {
     "versioncode": "2"
     }
    
  3. 如果测试人员现在从测试设备打开您的应用程序,这将要求强制更新。但是在更改要点之前,您的应用程序对您的用户是可用的。

在每个生产版本中只需要几次,然后更新要点。使用Jsoup类型实现也会使您的应用程序不稳定,因为您无权访问 google web,因此它们的任何更改都可能使您的应用程序不稳定/无法使用。希望这会帮助你 。谢谢

来自应用内...... 在此处输入图像描述


推荐阅读