Сделать push-уведомления всплывающими, когда приложение находится в фоновом режиме с помощью firebase

Я настраиваю push-уведомления с помощью своего родного приложения для пользователей Android, использующих Firebase Cloud Messaging. До сих пор я следил за в основном этого руководство. Мне удалось сделать push-уведомления для отображения на экране блокировки и работать с ними, когда приложение находится на переднем плане. Однако, когда приложение находится в фоновом режиме, мне не удается показать уведомление в виде всплывающего окна. Он появляется на панели уведомлений, но не показывает всплывающее окно, как уведомления Gmail или WhatsApp.

Я считаю, что моя проблема в том, что я не отправляю правильные параметры с сообщением. Я использую консоль Firebase, поэтому она не очень гибкая. Как я могу настроить (программно) уведомление, чтобы оно отображалось как всплывающее окно при получении?

Обновлено:

Настройка канала уведомлений работает для более новых устройств Android — протестировано на Android 8.1 (уровень API 27).

На старых устройствах — тестирование на Android 6.0 (уровень API 23) — всплывающие уведомления по-прежнему не появляются. Я отправляю следующее сообщение с помощью консоли aws sns:

{ 
  priority: 'high',
  content_available: true,
  notification: { 
     title: 'hello',
     body: 'Just test',
     android_channel_id: 'test-channel',
     sound: 'default' 
  },
  data: { title: 'title', body: 'body', sound: 'default' }
}

Я также отправлял сообщения, используя настройки консоли Firebase High Priority и Sound Enabled, с идентификатором канала Android и без него. Ничего из этого не сработало. Уведомление тихо появляется на панели задач. Этот обсуждение показывает те же проблемы, но решение, указанный одним человеком, у меня не сработал. Я не много редактировал код библиотеки для реагирования. Я пробовал секцию Проблемы со старой версией Android (передний план), она заставляла хедз-ап появляться на переднем плане, но не на заднем плане, как здесь и предполагалось.

Кроме того, кажется, что это нерешенная проблема для многих людей, использующих этот родной пакет реагирования (проблема с гитхабом, проблема с гитхабом).

Итак, я думаю, что я должен переформулировать свой вопрос. Для Android 7.1 или ниже (тестирование на 6.0):

  1. Достаточно ли установки priority='high' и уведомления.sound='default' для отображения уведомлений? (Из моего исследования должно быть)

  2. Нужно ли мне делать какие-либо дополнительные настройки в моем коде приложения, чтобы перейти от уведомления, которое тихо появляется на панели задач, к тому, чтобы оно появлялось в качестве предупреждения?

Вы действительно используете GCM? Это устарело. Вместо этого вы должны использовать FCM. Кроме того, документация FCM объясняет, как делать то, что вы описываете. Вы ознакомились с этой документацией?

Doug Stevenson 16.06.2019 20:16

Я действительно использую FCM. Я перепутал понятия. Спасибо за ваш комментарий. Я исправлю это в своем посте.

Vinicius 16.06.2019 20:20

И вы просмотрели документацию FCM, чтобы выяснить, говорит ли она вам, что вам нужно делать?

Doug Stevenson 16.06.2019 20:22

Я нашел этот страница, который указывает свойства сообщения для FCM. Однако я не вижу никакого свойства, связанного с отображением всплывающих окон на фоне или нет. Я также проверил документы firebase и firebase-react-native, соответствуют ли инструкции по установке инструкциям в учебнике.

Vinicius 16.06.2019 20:42

пожалуйста, проверьте мой ответ

ismail alaoui 17.06.2019 18:34

@ismailalaoui У меня еще не было времени протестировать ваше решение. Я вернусь к вам, как только сделаю это.

Vinicius 17.06.2019 18:43
4
6
11 944
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

чтобы отображать уведомление во всплывающем окне, например WhatsApp, вы должны установить важность канала уведомлений с помощью IMPORTANCE_HIGH

из официальной документации здесь

Makes a sound and appears as a heads-up notification

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance)

Редактировать :

для устройства, работающего под управлением леденец --> Нуга , вам необходимо установить вибрацию или мелодию звонка, чтобы функция Heads-up работала. Тем не менее, вот быстрый хак, который не требует разрешения VIBRATE для создания предварительного уведомления. связь

notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
if (Build.VERSION.SDK_INT >= 21) notificationBuilder.setVibrate(new long[0]);

Спасибо за Ваш ответ. Это работало для Android 8.1. Для Android 6.0 уведомления по-прежнему не отображаются в виде заголовков. Я отредактировал свой вопрос, пожалуйста, посмотрите.

Vinicius 17.06.2019 22:11

Для справки в будущем: это — это то, как каналы уведомлений создаются в React Native с помощью React-Native-Firebase.

Vinicius 17.06.2019 22:13

Где я должен поместить этот код? На моем клиенте или на моем сервере? Потому что при получении уведомлений только сообщения на фоне он идет прямо в системный трей. Взаимодействует ли какая-либо часть кода с сообщением только об уведомлении при получении? Если вы хотели включить этот код на сервер при отправке сообщения, разве настройка звука не включена с высоким приоритетом на консоли Firebase, достаточной для этого?

Vinicius 18.06.2019 23:49

Вы должны поместить это в свой конструктор уведомлений на мобильной стороне!

ismail alaoui 18.06.2019 23:58

Можете ли вы быть более конкретным об этом? Я поместил ваш код в конструктор уведомлений, который можно использовать во время работы приложения. Это ничего не сделало для уведомления в фоновом режиме. Я не совсем знаком с кодом Android. Я заглядываю внутрь и могу внести изменения, но мне нужно знать, что я ищу. Я использую react-native-firebase, поэтому много библиотечного кода можно потерять.

Vinicius 19.06.2019 00:26

Ах, хорошо, если вы создадите уведомление с помощью компоновщика, вы можете использовать код, который написал вам! И я также добавляю ссылку на официальный документ, который может вам помочь :)

ismail alaoui 19.06.2019 00:28
Ответ принят как подходящий

Спасибо @ismailalaoui за участие в этом вопросе. Я не мог делать уведомления для шоу в качестве заголовка при получении в системном трее, поэтому мне пришлось пойти на обходной путь. Я покажу, как я это сделал с помощью react-native-firebase.

Для новых устройств Android вы должны создать канал уведомлений. Добавьте следующее в свой App.js

componentDidMount(){
  ...
  const channel = new firebase.notifications.Android.Channel('test-channel', 'Test Channel', firebase.notifications.Android.Importance.Max).setDescription('My apps test channel'); //add this line

  firebase.notifications().android.createChannel(channel); //add this line
}

Для старых устройств мне пришлось обходиться. Вместо использования уведомлений я использовал сообщения с данными, чтобы вы могли слушать их в фоновом режиме. См. пункт 4.

Сначала создайте новый файл bgMessaging.js:

import firebase from 'react-native-firebase';

export default async (message) => {
  // handle your message
  const notification = new firebase.notifications.Notification()
  .setNotificationId(message.messageId)
  .setTitle(message.data.title)
  .setBody(message.data.body)
  .android.setChannelId('test-channel')
  .android.setSmallIcon('ic_launcher')
  .android.setPriority(firebase.notifications.Android.Priority.Max)
  .setSound('default');

  await firebase.notifications().displayNotification(notification);
  console.info({message})
  return Promise.resolve();
}

В файле index.js добавьте:

import bgMessaging from './src/bgMessaging'; // <-- Import the file you just created

...

AppRegistry.registerHeadlessTask('RNFirebaseBackgroundMessage', () => bgMessaging); 

react-native-firebase использует Headless JS для запуска кода javascript, который вы определили в bgMessaging. Согласно документы вам необходимо добавить службу в AndroidManifest.xml. В android/app/src/main/AndroidManifest.xml добавьте:

<application>
  ...
  <service android:name = "io.invertase.firebase.messaging.RNFirebaseBackgroundMessagingService" /> <!--Add this-->
  ...
</application>

Для реакции на родную базу огня v6:

Чтобы создать канал, добавьте следующие строки в MainActivity.java

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.os.Build;

protected void onCreate(Bundle savedInstanceState) {
// any other code goes here
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel("500", "MainChannel", NotificationManager.IMPORTANCE_HIGH);
            notificationChannel.setShowBadge(true);
            notificationChannel.setDescription("Test Notifications");
            notificationChannel.enableVibration(true);
            notificationChannel.enableLights(true);
            notificationChannel.setVibrationPattern(new long[]{400, 200, 400});
            //notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(notificationChannel);
        }
}

Это сообщение отправлено с сервера

const message = {
notification: {
    title: data.subject,
    body: data.message,
},
data: {
    id: data.id,
    title: data.subject,
    body: data.message,
    origin: 'chat',
    request: 'test'
},
android: {
    priority: 'high',
    notification: {
        title: data.subject,
        body: data.message,
        sound: 'default',
        priority: 'high',
        channelId: '500'
    }
},
token: "TOKEN"
};
//firebase admin
admin.messaging().send(message)
            .then((response) => {
                // Response is a message ID string.
                console.info('Successfully sent message:', response);
            })
            .catch((error) => {
                console.info('Error sending message:', error);
            });

Нашел этот ответ в теме Гитхаб. Вся заслуга принадлежит им. Проверено на Android-нуга (v7) и пирог(v9)

Другие вопросы по теме