我已经建立了一个Android应用程序,现在在Play Market上。我不时会对它进行更新,我想让用户知道有新版本可用。
如何向应用用户发送通知更新?
答案 0 :(得分:65)
您无需为此做任何具体操作。由于您提到您使用的是Google Play,因此Google Play会对更新通知进行处理。
您只需要使用较高的versionCode
更新 APK ,Google Play就应该完成剩下的工作。
答案 1 :(得分:11)
如果她想通过谷歌播放获得新版本的通知,则由每个手机所有者决定,如果默认情况下启用此功能,则取决于每个手机的制造商。
如果您遇到“需要”用户更新到新版本以与某种形式的协议兼容的情况,或者您有一个类似的用例,在某个地方有服务器组件,您可能需要根据有关最新版本的信息通知用户UI中可能存在的版本冲突。
此信息可以直接从谷歌播放中获取,但正如@Yahel在this question指出的那样google play是一个没有官方API的封闭系统,您可能需要依赖不可预测的未记录的API。有unofficial API library here。
这只留下一个选项,即将此信息保存在您自己的服务器上。如果你已经有了服务器端,这可能是微不足道的。只需将最新版本放在XML文件中,然后定期从代码中进行检索即可。如果版本代码已过时,请在UI中触发通知。这样做是example implementation。
我希望这有用: - )
答案 2 :(得分:9)
您可以通过多种方式执行此操作,具体取决于您希望用户何时能够看到可用的更新。
如果您希望用户在启动应用时了解更新,只需创建一个实用工具方法(在您的主/第一个活动的onCreate
方法内),检查Google中是否有更新的版本玩。如果是,则显示包含相关消息的警报对话框和当用户单击警报对话框的正面按钮时在Google Play中打开应用程序的意图。
如果您要定期更新应用程序,则每次启动应用程序时,用户都会不断收到此警报对话框,因此可能会感到烦躁。因此,这不是最好的方法。
如果您希望用户在手机上收到通知(而不是用户启动应用程序时),您可以使用AlarmManager
类来安排后台服务,该服务会定期检查更新。如果服务发现升级实际可用,请发布具有在Google Play中打开您应用的意图的通知。
当然,另一种方法是将其留给操作系统本身。如果用户尚未为您的应用设置“自动更新”偏好设置,则用户将定期收到有关您和其他任何应用的更新的通知。 但并非所有用户都在其设备上启用后台数据,因此这并不完全可靠。
最后,您必须尊重用户偏好。如果用户不想自动更新应用程序,或者不想在他/她启动应用程序时看到唠叨对话框,请不要提醒用户有关更新的信息。
在我看来,您应该创建一个PreferenceActivity
,其偏好设置为“定期检查更新”,可以在您的应用中进行设置。如果已设置,请在您自己的服务中做必要的事情。甚至可以让用户选择服务检查更新的时间段。
我希望这有帮助!
答案 3 :(得分:5)
答案 4 :(得分:4)
答案 5 :(得分:3)
Google Play会通过通知栏通知您的用户该应用有更新。
如果您自己设置了通知系统,可能的结果是,虽然用户会收到更新通知,但当他/她进入Google Play安装更新时,它将无法使用。这是因为从“发布”应用/更新时间到播放时出现的时间都有滞后。告诉您的用户在更新不可用时有更新只会导致混淆和沮丧。
我的建议:坚持使用Google的更新通知系统,不要担心尝试提前15分钟更新用户。
答案 6 :(得分:2)
有些人使用Android Cloud-to-Device Messaging(C2DM)通知其用户更新。我认为我不会打扰,因为我认为Google Play在通知我已有更新方面做得非常好,并且实施C2DM为编写应用程序增加了一个全新的维度(因为它需要服务器组件)。但也许您希望为用户提供比Google Play更丰富的更新通知。
答案 7 :(得分:2)
@ Davek804上面的回答是错误的。 android:versionCode是一个整数值,表示相对于其他版本的应用程序代码的版本,因此使用“1.5b”是不正确的。使用“15”(或“150”)代替
答案 8 :(得分:2)
为您的问题找到了一个很好的解决方案: 假设您要在应用启动时手动检查版本更新,并通知您的用户新的更新。
第1步:Download android-market-api(不是.jar文件,完整项目!)
步骤2:将其导入eclipse后,在活动中输入以下代码:
MarketService ms = new MarketService(activity);
ms.level(MarketService.REVISION).checkVersion();
现在,我们需要修改MarketService.java,因为它似乎已被破坏。
步骤3:重写回调方法并添加以下方法
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?
答案 9 :(得分:2)
如果您可以决定应用程序与服务器的第一次连接,还有一种非常好的方法可以检查版本并为用户提供应用程序通知或强制更新应用程序。在第一次请求的响应中可以发送存储在您服务器上的当前版本的应用程序,然后在客户端,您可以采取适当的操作。
这种方法的优点 - :
1 - 没有版本号的额外请求。
2 - 如果您要下载谷歌Playstore以外的应用程序,它也适用。
3 - 如果您想在应用交易的特定操作中检查版本(如果您添加新的支付网关),也可以使用此提示。
答案 10 :(得分:1)
不知道你是否想要多走几英里。您可以试用谷歌appengine,它为您的应用程序提供版本号,让你的Android应用程序检查appengine,看看是否有一个新版本的应用程序启动时。这样,无论你的应用程序是在谷歌游戏市场还是亚马逊应用程序商店,也不管它是否安装在手机上而没有这两个通过侧载。仅仅为了在json中提供应用程序版本而设置appengine并不是很困难。将“Hello World”字符串替换为您的应用版本名称...
答案 11 :(得分:1)
这可以使用简单的Web服务,这是实现这一目标的方法之一。
即,当应用程序启动使用当前版本的用户应用程序访问该Web服务时,您需要检查是否有任何新版本可用(必须维护应用程序的最新版本)并发送对用户的相应响应。如果有任何新版本可用,则提示用户下载最新版本的应用程序,如果没有最新版本,则允许用户继续。
希望至少有些东西对你有用。
答案 12 :(得分:1)
有两种模式基本上用于解决这个问题。
Pull Based
Push Based
它取决于特定系统的体系结构或设计,决定是使用基于拉动还是推动机制。
对于基于拉取的模型,您只需向相关服务器发出一个关于新版本应用程序的http请求。当前的应用程序版本no可以保存在Android应用程序的SQLLite中。这可以给服务器,并且可以在服务器上检查新版本。
对于推送机制,您可以使用C2DM推送通知服务..详情请见http://code.google.com/android/c2dm/
答案 13 :(得分:1)
我知道这是一个古老的问题,但是如果有人来这里检查这个问题,Google现在为应用程序内通知提供官方支持以进行应用程序更新,完整文档可在here
答案 14 :(得分:0)
通常,当您将新应用程序上传到Google Play时,大多数用户都会收到有关更新的通知,有些用户会自动将应用下载到他们的设备,具体取决于他们的设置。 如果你真的想通过你的应用程序发出通知要求他们更新(这样每个人都可以获得通知,无论他们的Google游戏设置是什么,那么你必须制作一个返回最新版本号的网络服务。你然后可以比较您的应用内部并发布通知。您可以使用Google App Engine(https://developers.google.com/appengine/),因为它适用于您可能已经拥有的eclipse和java。 我不推荐这种方法,因为它为您提供了大量工作,以提供大多数用户已经拥有的东西。
答案 15 :(得分:0)
我认为这为时已晚,但可以帮助一些人
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 :(得分:-7)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1.5b"
android:versionName="1.5b">
当您将应用重新上传到Google Play时,如果这两个属性已从之前的上传更改,Google Play会自动向已安装您应用的用户发送通知。这是AndroidManifest文件。