6

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

ユーザーに表示したい更新メッセージまたは通常のプッシュ通知であるかどうかを検出するために、「メッセージ テキスト」-「dbupdate」を含む「キーと値」のカスタム データ項目をいくつか追加しています。

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

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

いくつかのコード:

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());
        }
    }
}

通知の例は こちら

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

4

3 に答える 3

26

Firebase push に関する私の経験によると:

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

Firebase docs に従って、プッシュ メッセージは 2 つの部分に分割され、それらを呼び出します: Docs Link here

  1. 通知
  2. データペイロード

ここに画像の説明を入力

解決:

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

1. Firebase コンソール

コンソール

2. Messaging API - Advanced REST Client を使用したリクエストを示す画像

カールリクエスト

メソッドでプッシュ メッセージを受信しonMessageReceived(...)ます。アプリがバックグラウンドにある場合、またはメッセージが Firebase コンソールを介して送信されたときにのみ強制終了された場合、 FirebaseonMessageReceived(...)メソッドは呼び出されません。

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

アップデート:

次のように API からプッシュ メッセージを送信できます (firebase ではダウンストリーム msg と呼びます): 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..."
}
于 2016-06-15T19:07:30.200 に答える
1

Androidで、アプリが forground/background/terminated 状態にあるかどうかにかかわらず、アプリ内の何かを更新する場合、最善の方法は、通知ペイロードを削除して、データ ペイロードのみを送信することです。

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

この場合onMessageReceived()、実行されます。(xiomi などの一部の 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()

于 2016-11-10T06:42:51.197 に答える