Firebase Cloud Messaging を使用してプッシュ通知を送信しています。
これが私のですFirebaseMessageService
:
public class FireBaseMessageService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.e("TAG", "From: " + remoteMessage.getFrom());
Log.e("TAG", "Notification Message Body: " + remoteMessage.getData().get("CardName")+" : "+remoteMessage.getData().get("CardCode"));
sendNotification(remoteMessage.getNotification().getBody());
}
private void sendNotification(String messageBody) {
Intent intent = new Intent(this, StartActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher_final)
.setContentTitle("Notification")
.setContentText(messageBody)
.setTicker("Test")
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
そしてFirebaseInstanceServer
:
public class FirebaseInstanceService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.e("TAG", "Refreshed token: " + refreshedToken);
// TODO: Implement this method to send any registration to your app's servers.
sendRegistrationToServer(refreshedToken);
}
private void sendRegistrationToServer(String token) {
// Add custom implementation, as needed.
Log.e("TAG", "Refreshed token2: " + token);
}
}
これは で宣言されていますAndroidManifest
:
<service
android:name=".util.notifications.FireBaseMessageService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".util.notifications.FirebaseInstanceService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
問題は、アプリが実行中のときはticker
通知が正しく表示され、デフォルトのサウンドが鳴るが、アプリがバックグラウンドにあるか実行されていないときは通知が音なしで届き、ticker
ステータス バーに表示されないことです。
なぜこのようなことが起こるのでしょうか。どうすれば修正できますか。
ベストアンサー1
FCM では、 に送信する POST ペイロードを指定しますhttps://fcm.googleapis.com/fcm/send
。そのペイロードでは、data
またはnotification
キー、あるいはその両方を指定できます。
ペイロードにdata
キーのみが含まれている場合、アプリはすべてのプッシュ メッセージ自体を処理します。つまり、それらはすべてハンドラーに配信されますonMessageReceived
。
ペイロードにnotification
キーが含まれている場合、アプリはプッシュメッセージを自ら処理します。のみアプリがアクティブ/フォアグラウンドにある場合。そうでない場合 (つまり、バックグラウンドにあるか、完全に閉じられている場合)、FCM はキーnotification
ペイロードに入力した値を使用して通知の表示を処理します。
コンソール (Firebase コンソールなど) から送信される通知には、常にnotification
キーが含まれることに注意してください。
FCM メッセージを自分で処理して、通知をもう少しカスタマイズできるようにしたいようですので、notification
すべてのプッシュ メッセージが に配信されるように、POST ペイロードにキーを含めない方がよいでしょうonMessageReceived
。
詳細については、こちらをご覧ください:
高度なメッセージングオプション
ダウンストリームメッセージの構文