【问题标题】:Force app to update when new version of app is available in android play store当 android play store 中有新版本的应用程序可用时强制应用程序更新
【发布时间】:2015-04-11 06:53:13
【问题描述】:

我在 Playstore 上有一个应用程序。知道我想要的是当 Playstore 上有新的更新可用时,用户应该在尝试使用该应用程序时弹出一个更新应用程序的窗口。如果他不更新应用程序,它应该关闭应用程序。例如:我想强制用户更新应用以继续使用。

【问题讨论】:

标签: android auto-update


【解决方案1】:

据我所知,Google Play 没有为此提供任何类型的 API,因此您必须手动检查。

但我可以告诉你一种强制用户更新最新版本的方法。

  1. 一种方法是向用户发送推送通知,并在收到通知时将用户重定向到 Playstore。

  2. 第二种方法较长,但这是一种适当的确定方法。 您在服务器上创建了一个 Web 服务,该服务器存储了该应用程序的最新版本。 每当您的应用运行时,

    • MainActivity 上,您向网络服务发出请求并检查应用程序中的版本是否是最新的
    • 如果不是最新版本,可以根据 webservice 的响应将用户重定向到 playstore

【讨论】:

    【解决方案2】:

    您不需要直接强制更新,当您推出更新时,Play 商店实际上会自动为用户更新您的应用程序。除非您更改了权限,否则用户无需执行任何操作。

    我绝对会建议让 Play 商店自己做它的事情......但我确实在一个应用中做了类似的事情。

    类似这样的内容应该会告诉您 Play 商店的更新日期和版本:

    SimpleDateFormat formatter = Dates.getSimpleDateFormat(ctx, "dd MMMM yyyy");
    String playUrl = "https://play.google.com/store/apps/details?id=" + appPackageName;
    RestClient restClient = /* Some kind of rest client */
    
    try {
        String playData = restClient.getAsString(playUrl);
        String versionRaw = findPattern(playData, "<([^>]?)*softwareVersion([^>]?)*>([^<]?)*<([^>]?)*>");
        String updateRaw = findPattern(playData, "<([^>]?)*datePublished([^>]?)*>([^<]?)*<([^>]?)*>");
        Date updated = formatter.parse(updateRaw.replaceAll("<[^>]*>", "").trim());
        String version = versionRaw.replaceAll("<[^>]*>", "").trim();
    
        _currentStatus = new PlayStatus(version, updated, new Date());
    } catch (Exception e) {
        _currentStatus = new PlayStatus(PlayStatus.UNKNOWN_VERSION, new Date(0), new Date(0));
    }
    

    我的 PlayStatus 类有如下方法:

        public boolean hasUpdate() {
            int localVersion = 0;
            int playVersion = 0;
    
            if (! versionString.equals(UNKNOWN_VERSION)) {
                localVersion = Integer.parseInt(BuildConfig.VERSION_NAME.replace(".",""));
                playVersion = Integer.parseInt(versionString.replace(".",""));
            }
    
            return (playVersion > localVersion);
        }
    

    您显然无法直接更新应用,但如果您确定版本已过期,您可以向用户展示一个 Intent,将其带到 Play 商店:

    public static void updateApp(final Activity act) {
        final String appPackageName = BuildConfig.APPLICATION_ID;
        AlertDialog.Builder builder = new AlertDialog.Builder(act);
        builder
                .setTitle(act.getString(R.string.dialog_title_update_app))
                .setMessage(act.getString(R.string.dialog_google_credentials_message))
                .setNegativeButton(act.getString(R.string.dialog_default_cancel), null)
                .setPositiveButton(act.getString(R.string.dialog_got_it), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        try {
                            act.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
                        } catch (ActivityNotFoundException anfe) {
                            act.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName;)));
                        }
                    }
                });
        AlertDialog dialog = builder.create();
        dialog.show();
    }
    

    我相信这是针对 API 21 编译的,因此可能会对 22 进行一些小调整。

    【讨论】:

    • 我专门阻止 Play 商店执行自动应用更新 - 我想在允许之前知道发生了什么变化。因此,依赖于自动更新功能无法达到目的。
    • 这就是为什么我包含了我过去用来执行“强制更新”的代码。从那时起,该应用程序的工作已被一些比我更了解移动设备的人接管,我相信他们现在也在使用推送更新来推动应用程序版本向前发展。不过,它确实打破了通常的 Play 商店体验。我很长一段时间都不会打开我的许多应用程序,但是当我看到自动更新通过时,我有时会打开它们。我想要感觉“可以控制”您自己的设备,但阻止自动更新您的用户真正想要的内容?
    【解决方案3】:

    我刚刚编写了一个类,可以帮助您了解 Google Play 商店何时发布了您的应用的新版本。

    使用该类,您将能够实现一些非常简单的东西,如下所示:

    new CheckNewAppVersion(yourContext).setOnTaskCompleteListener(new CheckNewAppVersion.ITaskComplete() {
        @Override
        public void onTaskComplete(CheckNewAppVersion.Result result) {
    
            //Checks if there is a new version available on Google PlayStore.
            result.hasNewVersion();
    
            //Get the new published version code of the app.
            result.getNewVersionCode();
    
            //Get the app current version code.
            result.getOldVersionCode();
    
            //Opens the Google Play Store on your app page to do the update.
            result.openUpdateLink();
        }
    }).execute();
    

    您可以download the class here 并在您的项目中使用。 基本上,您使用Jsoup lib 通过向 Google Play 商店页面发出请求来获取实际发布的版本。

    【讨论】:

      【解决方案4】:

      以编程方式从清单中获取版本号和版本代码,例如:

      String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
      

      int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
      

      通过共享首选项将它们存储在您的应用程序中。现在,每当用户打开应用程序时,请检查当前版本代码与前一个版本代码。如果它们匹配,则让用户使用该应用程序。但如果它们不匹配,则显示弹出要求用户更新您的应用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多