web-dev-qa-db-ja.com

Firebaseプッシュ通知はDBを更新します

新しいFirebaseプッシュ通知サービスを介してユーザーにデータを送信しようとしています。

「メッセージテキスト」(「dbupdate」)を使用して「キー値」カスタムデータ項目を追加し、ユーザーに表示する更新メッセージか通常のプッシュ通知かを検出します。

受信機で、カスタムデータがあることを確認し、trueの場合は更新を実行します。そうでない場合は、テキストメッセージで通常の通知を表示します。

アプリケーションを開いたときにのみ機能します。アプリケーションが閉じている場合は、とにかく通知が表示され、チェックが実行されていない場合は

いくつかのコード:

public class PushMessageService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        Map<String,String> data = remoteMessage.getData();
        String link = data.get("link");
        String name = data.get("name");
        if (link!=null) {
            Log.d("link",link);
            Log.d("name",name);
            UpdateHelper.Go(this, link, name);
        }
        else {
            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.ic_shop_white_24dp)
                            .setAutoCancel(true)
                    .setContentTitle(remoteMessage.getNotification().getTitle())
                   .setContentText(remoteMessage.getNotification().getBody());
            NotificationManager mNotificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            mNotificationManager.notify(5, mBuilder.build());
        }
    }
}

通知の例 ここ

どうしてこんなことに?アプリケーションが閉じている場合でもコードを実行するにはどうすればよいですか?

6
Nirel

Firebase Pushでの私の経験によると:

問題:「Firebaseconsole」を介してプッシュ通知を送信すると、アプリケーションがフォアグラウンドにある場合にのみ通知が受信されます。アプリケーションが強制終了またはバックグラウンドで実行された場合、PendingIntentで別のアクティビティを定義した場合でも、通知はバージョン> = Lollipopでのみ表示され、通知アイコンが正しくないか、アプリでデフォルトのランチャーアクティビティが開かれます。

Firebaseのドキュメントによると、プッシュメッセージは2つのパーに分割され、次のように呼ばれます:- ドキュメントリンクはこちら

  1. お知らせ
  2. データペイロード

enter image description here

解決:

「プッシュ」メッセージを送信する方法は2つあります。

1。 Firebaseコンソール

Console

2。メッセージングAPI-高度なRESTクライアントを使用したリクエストを示す画像

Curl Request

プッシュメッセージはonMessageReceived(...)メソッドで受信されます。 Firebase onMessageReceived(...)メソッドはnot呼び出されますifメッセージがFirebaseConsoleを介して送信された場合にのみ、アプリはバックグラウンドまたはkillになります。

APIを介してメッセージを送信する場合は、正常に機能します。メッセージは、アプリがバックグラウンド、フォアグラウンド、または強制終了されているかどうかに関係なく、onMessageReceived(...)メソッドで配信されます。 (注意:これは>=Lollipopで正常に機能しています-Android 4.4以下の動作はまだ予測できません。

更新:

次のようにAPIからプッシュメッセージを送信できます(firebaseはそれをダウンストリームメッセージと呼びます) https://firebase.google.com/docs/cloud-messaging/downstream

サーバーからのダウンストリームメッセージの送信

ダウンストリームメッセージをアドレス指定または「ターゲット」にするために、アプリサーバーは受信クライアントアプリの登録トークンを使用してに設定します。事前定義されたフィールドを含む通知メッセージ、またはカスタムデータメッセージを送信できます。ペイロードのサポートの詳細については、メッセージペイロードの通知とデータを参照してください。このページの例は、HTTPおよびXMPPプロトコルでデータメッセージを送信する方法を示しています。

HTTP POSTリクエスト

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
25
Hisham Muneer

アプリケーションがフォアグラウンドにある場合、通知はFirebaseMessagingService.onMessageReceived()に渡されます。アプリがフォアグラウンドにない場合、通知はデフォルトの通知センターによって処理されます。

参照:

2

Androidの場合、アプリがフォアグラウンド/バックグラウンド/終了状態にあるかどうかにかかわらず、アプリの一部を更新する場合は、通知ペイロードを削除してデータペイロードのみを送信するのが最善の方法です

_{ 
 "to" : "ee8....DYarin",
    "data" : {
         "key" : "value"
    }   
}
_

この場合、onMessageReceived()が実行されます。 (一部のAndroidデバイスでは、アプリケーションが終了状態でプッシュを処理するために自動起動を有効にする必要があります)

この場合、どのようにユーザーに通知を表示しますか?タイトルと本文をカスタムタグとしてデータペイロードに渡し、プログラムで通知を生成できます。したがって、Androidでは、通知ペイロードがなくてもすべてうまくいきます。


また、Androidに通知ペイロードがある場合、問題は次のとおりです。

  • アプリがフォアグラウンドにある場合、すべてがうまくいくと、通知が表示され、onMessageReceived()が実行されます
  • アプリがバックグラウンド/終了状態の場合、通知はデバイスに表示されますが、onMessageReceived()は通知をクリックした場合にのみ機能します。ユーザーはそれらを頻繁にクリアする傾向があり、onMessageReceived()のコードは実行されません。

また、通知時にこのクリック機能を有効にするには、通知ペイロードに_click_action_という名前のキーが含まれている必要があります。

_"notification":{
        "title":"Prime",
        "body" : "test",
         "click_action": "my_click_action_name"
}
_

そして、あなたはあなたの活動にintent_filterとしてアクションを登録する必要があります

_ <intent-filter>
                <action Android:name="my_click_action_name" />
                <category Android:name="Android.intent.category.DEFAULT" />
 </intent-filter>
_

ユーザーが通知をクリックすると、対応するアクティビティのonNewIntent()メソッドが呼び出され、データペイロードが対応するintent.getExtras()で使用可能になります。

1
mustaq