7

アプリケーションは PhoneGap にあります。https://github.com/marknutter/GCM-Cordovaでプッシュ通知機能を使用しています

機能全体を実装しましたが、昨日までは正常に機能していました。先日アプリを確認したところ、アプリが起動していないときにプッシュ通知が機能していませんでした。すべての通知がデバイスで受信され、メッセージをクリックするとアプリが開きます。

しかし、コントロールは、メッセージ通知が処理される JavaScript 部分で受信していません。

ファイル GCMIntentService.java からのコード:

JSONObject json;
json = new JSONObject().put("event", "message");

json.put("message", extras.getString("message"));
json.put("link", extras.getString("link"));

Log.v(ME + ":onMessage ", json.toString());

GCMPlugin.sendJavascript( json );
// Send the MESSAGE to the Javascript application

このコードは、メッセージが受信されたときに機能します。しかし、その時、アプリは実行されていません。

通知メッセージをクリックすると、アプリは通常どおり開き、メッセージ イベントは登録されません。そのため、JavaScript でプッシュ通知を処理するためのコントロールを取得できません。

CORDOVA_GCM_script.js のコードは、次の場所で入手できます。

https://github.com/marknutter/GCM-Cordova/blob/master/assets/www/CORDOVA_GCM_script.js

:アプリの実行中は問題なく動作します。

編集: 通知が時々実行されます。JavaScript がランダムにメッセージ イベントを取得しています。

編集2:

私は間違いなく問題を知っています。

Java ファイルから、プッシュ通知メッセージをクリックしてアプリを開くと、javascript コードがトリガーされます。しかし、その時点では WebView がロードされていないため、スクリプト (イベント トリガー) を実行できません。これが条件ですか、プラグインを使用するすべての人が同じことを経験します。回避策または修正方法はありますか?

私は何か間違ったことをしていますか?

4

3 に答える 3

4

アプリケーションが実行されていない場合、GCM-Cordova プラグインを使用すると、通知が正しく処理されません。これは、プラグインが JavaScript を開始した時点で WebView がロードされていなかったためです。

解決:

  • 通知が届いたときにメッセージ データを一時的に保存するようにプラグイン コードを変更しました。
  • このロードされたデータを読み取り、データをクリアするメソッドを備えた別のプラグインを作成しました。
  • deviceready でカスタム プラグイン メソッドを呼び出し、データがあるかどうかを確認しました。
  • 存在する場合は、ローカルに保存されたデータをクリアし、メソッドを呼び出して通知メッセージを表示します。

最後に、2 つのプラグイン (GCM-Cordova とカスタム プラグイン) の助けを借りて、この問題を解決することができました。

于 2012-11-08T19:01:00.933 に答える
3

IvenMS - 私も同じ問題を抱えているので、あなただけではありません。praneetloke を正しく理解していれば、プッシュ通知は、現在実行されていない PhoneGap アプリでは機能しません。

于 2012-10-29T01:51:02.560 に答える
3

私は簡単な解決策を見つけました。GCMIntentService では、javascript を送信する直前に、webview が読み込まれているかどうかを確認します。

while (GCMPlugin.gwebView == null || GCMPlugin.gwebView.webView == null || !GCMPlugin.gwebView.webView.isEnabled()) {
    // Wait until webView is enabled
}
GCMPlugin.sendJavascript(json);

これは私にとってはうまくいきます...無限ループを防ぐためにタイムアウトも追加するのが良い選択かもしれません(それは起こらないはずですが...)

ダビデ

于 2013-02-03T11:19:05.243 に答える