У меня есть небольшое приложение, в котором я получаю сообщение от Обмен сообщениями Firabase Cloud нормально, пока приложение работает, а пока находится в фоновом режиме. Я много ищу по этому поводу, и я не смог найти правильный ответ о том, как получать / создавать уведомления в Android, когда приложение закрыто, поэтому, пожалуйста, не думайте, что это повторяющийся вопрос. Может ли кто-нибудь показать мне пример об этом и о том, как это делается?
Это мой класс службы обмена сообщениями Firebase.
public class MyFirebaseMessagingService extends FirebaseMessagingService {
public static final String tag = "TAG";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(tag,"FROM"+remoteMessage.getFrom());
//check if message contains data
if (remoteMessage.getData().size()>0){
Log.d(tag,"Message Data" + remoteMessage.getData());
}
//check if message constains notification
if (remoteMessage.getNotification() != null){
sendNotification(remoteMessage.getNotification().getBody());
}
}
private void sendNotification(String body){
Intent i = new Intent(this,MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Firebase CLoud Messaging")
.setAutoCancel(true)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0,notificationBuilder.build());
}
}
Это мой манифест
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:roundIcon = "@mipmap/ic_launcher_round"
android:supportsRtl = "true"
android:theme = "@style/AppTheme">
<activity android:name = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name = ".MyFirebaseMessagingService">
<intent-filter>
<action android:name = "com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
Было бы полезно, если бы вы предоставили пример своего json-файла, который вы отправляете через FCM.
Секундочку !!
Я не думаю, что вижу JSON в FCM
Вы отправляете сообщение вручную в консоли? Вы уверены, что сообщение содержит полезные данные? Если полезные данные отсутствуют, MyFirebaseMessagingService не запускается. Думаю, в консоли вам нужно будет заполнить раздел «Дополнительные параметры».
Да, я передаю параметры. И да, я отправляю сообщение в консоли
Согласно документы, есть два типа уведомлений, которые вы можете отправлять через FCM.
Консоль firebase может отправлять сообщения только первого типа. И сообщение с уведомлением будет обрабатываться системой, если ваше приложение находится в фоновом режиме, но оно не будет работать, если ваше приложение остановлено.
Переключитесь на свой собственный API и отправьте сообщения с данными.
Итак, какие изменения мне нужно внести в свой код?
Я редактирую свой ответ, чтобы лучше разобраться в проблеме.
Хорошо, но в этом случае моей серверной стороной является облачная служба Firebase, и я не вижу возможности изменить тип сообщения там, я думаю
Вы имеете в виду консоль firebase?
и я думаю, что уже использую remoteMessage.getNotification (). getBody ())
Моя беда, я увидел первую строчку с getData() и мой мозг обошел все остальное :)
Итак, в этом случае вы знаете, в чем проблема? :)
Позвольте нам продолжить обсуждение в чате.
Итак, после нескольких часов работы с этой проблемой и с помощью @Mauker я, наконец, сделал это. Это шаги, которые я предпринял, и вся информация, которую я получил из Интернета.
Прежде всего забудьте Firebase Cloud Message, чтобы отправлять уведомления в мобильное приложение. Во-вторых, используйте почтальона для выполнения этих действий.
Уведомления бывают двух типов: групповые уведомления, когда все люди получают уведомление одновременно, и прямые уведомления, когда само уведомление предназначено только для просмотра пользователем.
1º Если вам нужны групповые уведомления, вы должны сделать это в своем классе средства запуска приложений:
FirebaseMessaging.getInstance().subscribeToTopic("groupNameChoosenByYou");
2º Затем вам нужно создать класс, чтобы справиться с этим.
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
String myCustomKey = data.get("title"); //received from postman POST as you can see above
Intent i = new Intent(this,MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(myCustomKey)
.setContentText(myCustomKey+myCustomKey)
.setAutoCancel(true)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0,notificationBuilder.build());
}
}
3º Сходите к почтальону и проделайте это в своем теле.
Это должен быть ваш URL:https://fcm.googleapis.com/fcm/send
{
"to":"/topics/groupNameChoosenByYou",
"data":
{
"title":"Your title",
"message":"Your message"
}
}
4º В почтальоне и сделайте это в заголовках
Authorization -> Project settings in Firebase -> Cloud Messaging and take the Server key
Content-type -> application/json
5º Если вы хотите сделать прямое уведомление для определенного пользователя в
"to":"/topics/groupNameChoosenByYou", замените идентификатором токена устройства, который создается при первом подключении к firebase (когда приложение установлено)
6º Если вы хотите отправлять уведомления, когда заявка закрыта некоторые ПЗУ не позволяют этого, кроме facebook, whatsapp (золотые приложения) и т. д., Вы должны перейти к оптимизации заряда батареи и поместить свое приложение в защищенное приложение (это меняется от бренда к бренду). Идеальный подход - дать пользователю начальное всплывающее окно, которое поможет ему в этом.
Это то, чему я научился, и это работает для меня. Любой вопрос, размещенный выше, я постараюсь больше узнать об этом и обновлять, пока я получу дополнительную информацию.
Мое обходное решение заключалось в том, чтобы включить уведомление в сообщения, которые я отправляю, потому что если это просто сообщение FCM, а приложение спит, сообщения теряются, установка высокого приоритета сообщения должна работать, но это не работает все время.