現在PlayマーケットにあるAndroidアプリを作成しました。随時更新します。新しいバージョンが利用可能であることをユーザーに知らせたいです。
アプリのユーザーに更新通知を送信するにはどうすればよいですか?
このために特別なことをする必要はありません。 Google Playを使用していると述べたため、更新通知はGoogle Playによって処理されます。
[〜#〜] apk [〜#〜]をより高いversionCode
に更新するだけで、残りはGoogle Playで処理されます。
Google Playによる新しいバージョンの通知を希望するかどうかは各携帯電話の所有者次第です。デフォルトで有効にする場合は、各携帯電話のメーカー次第です。
ただし、何らかの形式のプロトコルと互換性があるようにユーザーを新しいバージョンに更新する必要がある場合、またはサーバーコンポーネントをどこかに持っている同様のユースケースがある場合は、通知する必要があります。最新バージョンとは何かに関する情報に基づいて、UIで潜在的なバージョンの競合が発生するユーザー。
この情報はGoogle Playから直接取得できますが、@-Yahelが この質問 で指摘したように、Google Playは公式のAPIを持たないクローズドシステムであり、予測できない文書化されていないAPIに依存する必要があるかもしれません。 ここには非公式のAPIライブラリ があります。
これにより、この情報を独自のサーバーに保持するというオプションが1つだけ残ります。サーバーサイドがすでにある場合、これは簡単なことかもしれません。最新バージョンをXMLファイルに入れ、コードから定期的に取得するだけです。バージョンコードが古い場合は、UIで通知をトリガーします。これを行うための 例の実装 .
これがお役に立てば幸いです:-)
これは、利用可能な更新があることをユーザーに確認できるタイミングに応じて、さまざまな方法で実行できます。
アプリの起動時に更新についてユーザーに知らせたい場合は、新しいバージョンがGoogle Playで利用可能かどうかを確認するユーティリティメソッド(メイン/最初のアクティビティのonCreate
メソッド内)を作成するだけです。含まれている場合は、関連するメッセージと、ユーザーがアラートダイアログのプラスボタンをクリックするとGoogle Playでアプリを開くインテントを含むアラートダイアログを表示します。アプリを定期的に更新している場合、ユーザーはアプリを起動するたびにこの警告ダイアログを表示し続けるため、イライラする可能性があります。したがって、これは最善のアプローチではありません。
ユーザーがアプリを起動したときではなく、電話で通知を受け取るようにしたい場合は、AlarmManager
クラスを使用して、定期的に更新をチェックするバックグラウンドサービスをスケジュールできます。アップグレードが実際に利用可能であることがサービスで検出された場合、Google Playでアプリを開く目的で通知を公開します。
もちろん、別のアプローチは、OSに任せることです。ユーザーがアプリの「自動更新」設定を設定していない場合、ユーザーは、アプリや他のアプリで利用可能な更新について定期的に通知を受け取ります。ただし、すべてのユーザーがデバイスでバックグラウンドデータを有効にするわけではないため、これは完全に信頼できるものではありません。
最後に、ユーザー設定を尊重する必要があります。ユーザーがアプリを自動的に更新したくない場合、またはアプリを起動するたびにしつこいダイアログボックスを表示したくない場合は、更新についてユーザーに警告しないでください。
私の意見では、「更新を定期的に確認する」などの設定を持つPreferenceActivity
を作成する必要があります。これはアプリ内から設定できます。設定されている場合は、独自のサービスで必要なことを行います。サービスが更新を確認するまでの期間を選択するオプションをユーザーに提供することもできます。
これがお役に立てば幸いです!
これを使用してください: https://www.Push-link.com/
Google Playは、通知バーを介してアプリに更新があることをユーザーに通知します。
通知システムを自分でセットアップした場合、ユーザーにはより早く更新が通知されますが、更新をインストールするためにGoogle Playに行くと、まだ利用できません。これは、アプリ/アップデートを「公開」してからPlayに表示されるまでに時間差があるためです。更新プログラムが利用できないときに更新プログラムがあることをユーザーに伝えることは、混乱とフラストレーションにつながるだけです。
私のアドバイス:Googleの更新通知システムに固執し、15分早くユーザーに更新を取得しようとして心配する必要はありません。
また、バージョンを確認してアプリ内のユーザーに通知したり、アプリとサーバーの最初の接続を決定できる場合にアプリケーションを強制的に更新したい場合に、非常に優れたアプローチがあります。サーバーに保存されているアプリの現在のバージョン、クライアント側で適切なアクションを実行できます。このアプローチの利点-:
1-バージョン番号の追加リクエストはありません。
2-Google Playstore以外のアプリをダウンロードする場合にも適用されます。
3-アプリの特定の操作でバージョンを確認する場合にも、この考え方を使用できます。トランザクション後(新しい支払いゲートウェイを追加する場合)。
上記の@ Davek804の答えは間違っています。 Android:versionCodeは、他のバージョンと比較したアプリケーションコードのバージョンを表す整数値であるため、「1.5b」を使用すると誤りがあります。代わりに「15」(または「150」)を使用してください
一部の人々はAndroid Cloud-to-Device Messaging (C2DM)を使用してユーザーにアップデートを通知します。 Playは既に更新を通知してくれますが、C2DMを実装するとアプリの作成にまったく新しい側面が追加されます(サーバーコンポーネントが必要なため)。グーグルプレイ。
私はこれが古い質問であることを知っていますが、この質問をチェックするために人々がここに来ている場合、Googleは現在、アプリケーションの更新のためのアプリ内通知の公式サポートを提供しています完全なドキュメントを見つけることができます here
問題の解決策を見つけました:アプリの起動時にバージョンの更新を手動で確認し、ユーザーに新しい更新を通知するとします。
ステップ1: 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文字列をローカルバージョンよりも高いバージョンに変更します。
私が使用したソース比較方法は Javaの2つのバージョン文字列をどのように比較しますか?
これは、単純なWebサービスを使用することで実現できます。
つまり、アプリの起動がユーザーアプリの現在のバージョンとサーバーでそのWebサービスにヒットするたびに、新しいバージョンが利用可能かどうかを確認する必要があります(アプリの最新バージョンを維持する必要があります)に対応する応答を送信しますユーザー。新しいバージョンが利用可能な場合、ユーザーに最新バージョンのアプリケーションをダウンロードするよう促し、最新バージョンが利用できない場合は、ユーザーに続行を許可します。
少なくとも何かがあなたにとって有用でなければならないことを願っています。
追加のマイルを歩きたいかどうかわからない。アプリのバージョン番号を提供するGoogle AppEngineを試してみると、Android app AppEngineをチェックして、アプリケーションの起動時に新しいバージョンがあるかどうかを確認できます。アプリがGoogle PlayマーケットやAmazonアプリストアにあるかどうか、またサイドローディングを介してこれら2つのなしで電話にインストールされているかどうかは関係ありません。アプリのバージョン名を含む文字列...
この問題に取り組むために基本的に使用される2つのモデルがあります。
Pull Based
Push Based
プルベースまたはプッシュメカニズムのどちらを使用するかを決定する特定のシステムのアーキテクチャまたは設計に依存します。
プルベースのモデルの場合、アプリケーションの新しいバージョンに関して、関係するサーバーに1つのhttpリクエストを行うだけです。現在のアプリケーションバージョンは、SQLLiteのAndroid application。に保存できます。これはサーバーに提供でき、新しいバージョンはサーバーでチェックできます。
プッシュメカニズムの場合、C2DMプッシュ通知サービスを使用できます。詳細は http://code.google.com/Android/c2dm/
私はこれは手遅れだと思うが、それは誰かを助けることができる
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;
}
}
一般に、Google Playに新しいアプリケーションをアップロードすると、ほとんどのユーザーは更新に関する通知を受け取ります。一部のユーザーは、設定に応じて、アプリをデバイスに自動的にダウンロードします。アプリから更新を求める通知を真剣に行いたい場合(Googleプレイ設定が何であれ、誰もが通知を受け取るようにするには、最新バージョンの番号を返すWebサービスを作成する必要があります。その後、アプリ内でそれを比較して通知を投稿できます。GoogleApp Engine( https://developers.google.com/appengine/ )を使用できます。ほとんどのユーザーが既に持っているものを提供するために多くの作業を作成するため、このアプローチはお勧めしません。