android - 来自应用内的用户在 Android Play 商店中看不到最新版本
问题描述
我们有一个 Android 应用程序,它可以根据我们的初创公司后端检查自己的版本。基本上,我们的想法是我们强迫我们的用户使用最新版本(或者卡在启动屏幕上并显示有关更新的对话框)。我们使用它来将用户重定向到 Play 商店(当他单击此对话框上的按钮时):
startActivity(new Intent(ACTION_VIEW, parse("market://details?id=" + BuildConfig.APPLICATION_ID)));
finish();
问题是,即使我们更新了一个版本,并且当我们搜索我们的应用程序时它会显示在 Play 商店中,但单击该按钮的用户会看到他们使用的是“最新”版本(这是现实)。
所以基本上:
- 用户已安装 1.0 版
- 我们更新到 1.1 版本,并将后端设置为 1.1 作为最低版本
- app on start 检查后端,并显示更新对话框(因为它的版本已过时)
- 用户点击更新对话框,进入 Play 商店,但商店显示当前版本为 1.0
- 如果您正常搜索我们的应用程序,您会看到最新版本是 1.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 值将是您的应用程序的最新版本代码。
- 在客户端,我们将从 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();
}
}
});
}
测试-
在开发者控制台中创建内部测试。通过电子邮件添加测试人员,上传签名的构建并将链接分享给用户,在测试人员端接受邀请。测试者将卸载公版并安装 beta 测试版。
使用更高版本代码构建另一个应用程序并创建另一个内部测试并上传新版本。在这种情况下,不要与 tester 共享链接。等待几个小时并从 Playstore 搜索中的测试设备检查最新版本是否实际存在(实际上缓存问题仍然存在或不存在)如果存在,然后编辑要点。假设您的最新应用程序版本代码为 2,然后给出值
{ "versioncode": "2" }
如果测试人员现在从测试设备打开您的应用程序,这将要求强制更新。但是在更改要点之前,您的应用程序对您的用户是可用的。
在每个生产版本中只需要几次,然后更新要点。使用Jsoup
类型实现也会使您的应用程序不稳定,因为您无权访问 google web,因此它们的任何更改都可能使您的应用程序不稳定/无法使用。希望这会帮助你 。谢谢
推荐阅读
- numpy - Gaussian 的 Numpy FFT 不给出 Gaussian
- python - 使用 getRequests 设置异步
- python - 当firestore on_snapshot不可等待时如何将_message写入websocket?
- objective-c - Xcode 未检测到任何 NeXTSTEP / Foundation / Cocoa 类(无自动完成)
- java - 在 JSP 视图中显示递归模型时如何修复“无法从类型 java.lang.String 转换为类型 @javax.persistence.Id”
- c# - 如何确保不再调用 RhinoMocks 中的方法?
- r - 如何使用 mapply 或任何循环将变量导入和分配到 R 中?
- sql-server - SQL从日期+时间跨度插入日期时间
- c# - 如何使用 Asp.net Core MVC(Missing Namespace for .Net Core)在共享点上创建文档
- artifactory - 尝试上传已有版本时强制 JFrog Artifactory 失败