【问题标题】:How to notify users about an Android app update?如何通知用户有关 Android 应用程序更新?
【发布时间】:2012-04-08 15:27:22
【问题描述】:

我已经构建了一个 Android 应用程序,它现在在 Play Market 上。我会不时对其进行更新,并希望让用户知道有新版本可用。

如何向应用的用户发送更新通知?

【问题讨论】:

  • 据我所见,它通常是在应用程序内完成的,即。当应用启动时,它会自行检查新版本并向用户显示更新通知。
  • 这个开源 GitHub 项目 (MAHAndroidUpdater) 完全提供更新功能。试试看,很简单。 github.com/hummatli/MAHAndroidUpdater

标签: android google-play


【解决方案1】:

【讨论】:

  • 此方法不会在我的应用中添加广告或其他内容?
  • 据我所知不会有广告
【解决方案2】:

您不需要为此做任何具体的事情。由于您提到您使用的是 Google Play,因此更新通知由 Google Play 处理。

您只需将 APK 更新为更高的versionCode,剩下的工作由 Google Play 完成。

【讨论】:

  • 每次修改代码时,我都会更改AndroidManifest.xml文件中的android:versionCode属性,但手机上没有任何通知。
  • @doledoug,确保 1. Google Play 中的通知 - 设置已勾选。 2. 手机设置中的背景日期 - 帐户和同步已打勾。
  • @doledoug:您可能不会立即收到通知,因为它取决于 Android Play。确保您已连接到互联网。
  • @yorkw Google Play 中的这些通知在哪里?
  • 打开 Google Play,点击硬菜单按钮,然后点击设置。您将在常规类别下看到通知。
【解决方案3】:

您可以通过多种方式执行此操作,具体取决于您希望用户何时能够看到有可用更新。

如果您希望用户在应用启动时知道更新,只需创建一个实用方法(在您的主/第一个 Activity 的 onCreate 方法中)检查 Google Play 中是否有更新的版本。如果是这样,当用户单击警报对话框的肯定按钮时,显示一个带有相关消息和意图的警报对话框,该意图会在 Google Play 中打开您的应用程序。 如果您定期更新应用程序,用户将在每次启动应用程序时不断收到此警报对话框,因此可能会感到烦躁。因此,这不是最好的方法。

如果您希望用户在手机上收到通知(而不是在用户启动应用程序时),您可以使用AlarmManager 类来安排后台服务,该服务会定期检查更新。如果服务发现升级确实可用,请发布通知,意图在 Google Play 中打开您的应用。

当然,另一种方法是将其留给操作系统本身。如果用户没有为您的应用设置“自动更新”首选项,用户将定期收到有关您以及任何其他应用可用更新的通知。 但并非所有用户都在其设备上启用后台数据,因此这并不完全可靠。

最后,您必须尊重用户的偏好。如果用户不想自动更新应用程序,或者不想在启动应用程序时看到烦人的对话框,请不要提醒用户有关更新。

在我看来,您应该创建一个PreferenceActivity,它具有“定期检查更新”之类的首选项,可以在您的应用程序中进行设置。如果已设置,请在您自己的服务中做必要的事情。甚至可以让用户选择服务检查更新的时间段。

我希望这会有所帮助!

【讨论】:

  • 真的不鼓励使用 AlarmManager 在后台运行您的应用程序以检查更新。想象一下,如果用户安装的每个应用程序都这样做。您的应用程序并不那么重要,像这样浪费用户设备的资源是不礼貌的。如果您将该首选项默认为 true,请不要以添加首选项为借口允许您执行此操作。大多数用户永远不会寻找这一点,尤其是那些用户,他们最容易受到滥用应用开发者糟糕的设备性能的摆布。
  • 您如何建议“检查 Google Play 中是否有更新的版本”可靠。据我所知,除了非官方版本,API 不公开?
【解决方案4】:

不知道你是否想多走几英里。你可以试试 google appengine,它为你的应用提供版本号,让你的 android 应用在应用启动时检查 appengine 以查看是否有新版本。这样一来,无论您的应用程序是在 google play 市场还是亚马逊应用程序商店中,还是在没有这两者的情况下通过侧载安装在手机上,都无关紧要。设置 appengine 只是为了在 json 中提供您的应用程序版本并不难。将“Hello World”字符串替换为您的应用版本名称...

【讨论】:

    【解决方案5】:

    Google Play 会通过通知栏通知您的用户该应用有更新。

    如果您自己设置了一个通知系统,可能的结果是,虽然用户会更快地收到更新通知,但当他/她去 Google Play 安装更新时,该更新将不可用。这是因为从您“发布”应用程序/更新到它出现在 Play 上的时间之间存在延迟。在更新不可用时告诉您的用户有更新只会导致混乱和沮丧。

    我的建议:坚持使用 Google 的更新通知系统,不要担心提前 15 分钟让用户收到更新。

    【讨论】:

    • 当我用较新的 versionCode 更新我的 apk 文件时,我没有收到来自 Google Play 的通知...不明白为什么,我检查了所有设置等。
    【解决方案6】:

    这可以使用简单的网络服务,这是实现的方法之一。

    即,当应用程序启动时使用当前版本的用户应用程序和服务器上的网络服务,您需要检查是否有任何新版本可用(必须保持应用程序的最新版本)并发送给用户相应的响应。如果有任何更新的版本可用,则提示用户下载应用程序的最新版本,如果没有可用的最新版本,则允许用户继续。

    希望至少有一些东西对你有用。

    【讨论】:

      【解决方案7】:
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      android:versionCode="1.5b" 
      android:versionName="1.5b">
      

      当您将应用重新上传到 Google Play 时,如果这两个属性与之前的上传相比发生了变化,Google Play 会自动向已安装您应用的用户发送通知。这是 AndroidManifest 文件。

      【讨论】:

        【解决方案8】:

        有些人使用 Android Cloud-to-Device Messaging (C2DM) 来通知用户更新。我不认为我会打扰,因为我认为 Google Play 在通知我更新方面做得很好,并且实施 C2DM 为编写应用程序增加了一个全新的维度(因为它需要一个服务器组件)。但也许您想为您的用户提供比从 Google Play 获得的更丰富的更新通知。

        【讨论】:

          【解决方案9】:

          是否希望通过 google play 收到新版本通知取决于每个手机所有者,是否默认启用此功能取决于每个手机的制造商。

          但是,如果您“要求”用户更新到新版本以与某种形式的协议兼容,或者您​​有类似的用例,在某处有服务器组件,您可能希望根据最新版本信息通知用户 UI 中可能存在版本冲突。

          这些信息可以直接从 google play 获取,但是正如 @Yahel 在 this question 中指出的那样,google play 是一个没有官方 API 的封闭系统,您可能需要依赖不可预测的未记录 API。有一个unofficial API library here

          这只剩下一个选项,就是将此信息保存在您自己的服务器上。如果您已经拥有服务器端,这可能是微不足道的。只需将最新版本放入 XML 文件中,并定期从您的代码中检索它。如果版本代码已过时,请在您的 UI 中触发通知。这是一个 example implementation 用于这样做。

          我希望这会有所帮助:-)

          【讨论】:

            【解决方案10】:

            通常,当您将新应用程序上传到 Google Play 时,大多数用户都会收到有关更新的通知,其中一些用户会自动将应用程序下载到他们的设备上,具体取决于他们的设置。 如果您真的想从您的应用发出通知以要求他们更新(以便每个人都收到通知,无论他们的 Google Play 设置是什么,那么您将必须创建一个返回最新版本号的网络服务。您然后可以在您的应用程序中进行比较并发布通知。您可以使用 Google App Engine (https://developers.google.com/appengine/),因为它适用于您可能已经拥有的 eclipse 和 java。 我不推荐这种方法,因为它会为您提供很多工作来提供大多数用户已经拥有的东西。

            【讨论】:

              【解决方案11】:

              基本上有两种模型可以用来解决这个问题。

              Pull Based
              Push Based
              

              它取决于特定系统的架构或设计来决定是使用基于拉还是推机制。

              对于基于拉取的模型,您只需向相关服务器发出一个关于新版本应用程序的 http 请求。当前应用程序版本号可以保存在 android 应用程序的 SQLLite 中。这可以提供给服务器,并且可以在服务器上检查新版本。

              对于推送机制,您可以使用 C2DM 推送通知服务。详细信息在 http://code.google.com/android/c2dm/ 中提供

              【讨论】:

                【解决方案12】:

                @Davek804 上面的回答是错误的。 android:versionCode 是一个整数值,表示应用代码的版本,相对于其他版本,所以使用“1.5b”是不正确的。改用“15”(或“150”)

                【讨论】:

                  【解决方案13】:

                  为您的问题找到了一个很好的解决方案: 假设您想在应用启动时手动检查版本更新,并通知您的用户有新的更新。

                  第 1 步:Download android-market-api(不是 .jar 文件,是完整的项目!)

                  第 2 步:将其导入 eclipse 后,在您的活动中写入以下代码:

                  MarketService ms = new MarketService(activity);
                  ms.level(MarketService.REVISION).checkVersion();
                  

                  现在,我们需要修改MarketService.java,因为它好像坏了。

                  第三步:重写回调方法并添加以下方法

                  protected void callback(String url, JSONObject jo, AjaxStatus status){      
                          if(jo == null) return;
                          String googlePlayversion = jo.optString("version", "0");
                          String smartphone_version = "";
                  
                          PackageInfo pInfo;
                          try {
                              pInfo = act.getPackageManager().getPackageInfo(act.getPackageName(), 0);
                              smartphone_version = pInfo.versionName;
                          } catch (NameNotFoundException e) {}
                          boolean new_version_avaible = compare(smartphone_version, googlePlayversion);
                          if(new_version_avaible){
                              showUpdateDialog(jo);
                          }
                      }
                  
                      private static boolean compare(String v1, String v2) {
                          String s1 = normalisedVersion(v1);
                          String s2 = normalisedVersion(v2);
                          int cmp = s1.compareTo(s2);
                          String cmpStr = cmp < 0 ? "<" : cmp > 0 ? ">" : "==";
                          System.out.printf("result: "+"'%s' %s '%s'%n", v1, cmpStr, v2);
                          if(cmpStr.contains("<")){
                              return true;
                          }
                          if(cmpStr.contains(">")||cmpStr.contains("==")){
                              return false;
                          }
                          return false;
                      }
                  
                      public static String normalisedVersion(String version) {
                          return normalisedVersion(version, ".", 4);
                      }
                  
                      public static String normalisedVersion(String version, String sep, int maxWidth) {
                          String[] split = Pattern.compile(sep, Pattern.LITERAL).split(version);
                          StringBuilder sb = new StringBuilder();
                          for (String s : split) {
                              sb.append(String.format("%" + maxWidth + 's', s));
                          }
                          return sb.toString();
                      }
                  

                  如果要测试,请将 googlePlayversion 字符串修改为高于本地版本。

                  我使用的源码比较方法来自How do you compare two version Strings in Java?

                  【讨论】:

                  • 既然可以直接比较版本代码,为什么还要比较版本名称?
                  【解决方案14】:

                  如果您可以决定您的应用程序与服务器的第一次连接,那么还有一种非常好的方法可以检查版本并在应用程序通知中向用户提供通知,或者当您想要强制更新应用程序时。在第一个请求的响应中,您可以发送存储在您的服务器上的当前版本的应用程序,然后在客户端您可以采取适当的措施。 这种方法的优点-:
                  1-没有额外的版本号请求。
                  2-如果您正在下载谷歌Playstore以外的应用程序,它也适用。
                  3-如果您想在应用程序交易的特定操作中检查版本(如果您添加新的支付网关),您也可以使用这个想法。

                  【讨论】:

                    【解决方案15】:

                    我认为这为时已晚,但它可以帮助一些人

                    public enum AppVersionUpgradeNotifier {
                    INSTANCE;
                    
                    private static final String TAG = "AppVersionUpdateManager";
                    
                    private static final String PREFERENCES_APP_VERSION = "pref_app_version_upgrade";
                    private static final String KEY_LAST_VERSION = "last_version";
                    
                    private SharedPreferences sharedPreferences;
                    private VersionUpdateListener versionUpdateListener;
                    private boolean isInitialized;
                    
                    public static synchronized void init(Context context, VersionUpdateListener versionUpdateListener) {
                        if (context == null || versionUpdateListener == null) {
                            throw new IllegalArgumentException(TAG + " : Context or VersionUpdateListener is null");
                        }
                    
                        if (!INSTANCE.isInitialized) {
                            INSTANCE.initInternal(context, versionUpdateListener);
                        } else {
                            Log.w(TAG, "Init called twice, ignoring...");
                        }
                    }
                    
                    private void initInternal(Context context, VersionUpdateListener versionUpdateListener) {
                        this.sharedPreferences = context.getSharedPreferences(PREFERENCES_APP_VERSION, Context.MODE_PRIVATE);
                        this.versionUpdateListener = versionUpdateListener;
                        this.isInitialized = true;
                        checkVersionUpdate();
                    }
                    
                    private void checkVersionUpdate() {
                        int lastVersion = getLastVersion();
                        int currentVersion = getCurrentVersion();
                    
                        if (lastVersion < currentVersion) {
                            if (versionUpdateListener.onVersionUpdate(currentVersion, lastVersion)) {
                                upgradeLastVersionToCurrent();
                            }
                        }
                    }
                    
                    private int getLastVersion() {
                        return sharedPreferences.getInt(KEY_LAST_VERSION, 0);
                    }
                    
                    private int getCurrentVersion() {
                        return BuildConfig.VERSION_CODE;
                    }
                    
                    public void upgradeLastVersionToCurrent() {
                        sharedPreferences.edit().putInt(KEY_LAST_VERSION, getCurrentVersion()).apply();
                    }
                    
                    public interface VersionUpdateListener {
                        boolean onVersionUpdate(int newVersion, int oldVersion);
                    }
                    

                    }

                    使用它

                    public class MyApplication extends Application implements AppVersionUpgradeNotifier.VersionUpdateListener {
                    
                    @Override
                    public void onCreate() {
                        super.onCreate();
                    
                        AppVersionUpgradeNotifier.init(this,this);
                    }
                    
                    @Override
                    public boolean onVersionUpdate(int newVersion, int oldVersion) {
                        //do what you want
                    
                        return true;
                    }
                    

                    }

                    【讨论】:

                      【解决方案16】:

                      我知道这是一个老问题,但如果有人来这里检查这个问题,谷歌现在为应用程序更新的应用程序内通知提供官方支持,完整的文档可以在here

                      【讨论】:

                        【解决方案17】:

                        2020 年更新:现在您可以使用应用内更新机制

                        文档:https://developer.android.com/guide/playcore/in-app-updates

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-11-23
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2013-12-04
                          相关资源
                          最近更新 更多