Я настраиваю 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):
Достаточно ли установки priority='high' и уведомления.sound='default' для отображения уведомлений? (Из моего исследования должно быть)
Нужно ли мне делать какие-либо дополнительные настройки в моем коде приложения, чтобы перейти от уведомления, которое тихо появляется на панели задач, к тому, чтобы оно появлялось в качестве предупреждения?
Я действительно использую FCM. Я перепутал понятия. Спасибо за ваш комментарий. Я исправлю это в своем посте.
И вы просмотрели документацию FCM, чтобы выяснить, говорит ли она вам, что вам нужно делать?
Я нашел этот страница, который указывает свойства сообщения для FCM. Однако я не вижу никакого свойства, связанного с отображением всплывающих окон на фоне или нет. Я также проверил документы firebase и firebase-react-native, соответствуют ли инструкции по установке инструкциям в учебнике.
пожалуйста, проверьте мой ответ
@ismailalaoui У меня еще не было времени протестировать ваше решение. Я вернусь к вам, как только сделаю это.
чтобы отображать уведомление во всплывающем окне, например 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 уведомления по-прежнему не отображаются в виде заголовков. Я отредактировал свой вопрос, пожалуйста, посмотрите.
Для справки в будущем: это — это то, как каналы уведомлений создаются в React Native с помощью React-Native-Firebase.
Где я должен поместить этот код? На моем клиенте или на моем сервере? Потому что при получении уведомлений только сообщения на фоне он идет прямо в системный трей. Взаимодействует ли какая-либо часть кода с сообщением только об уведомлении при получении? Если вы хотели включить этот код на сервер при отправке сообщения, разве настройка звука не включена с высоким приоритетом на консоли Firebase, достаточной для этого?
Вы должны поместить это в свой конструктор уведомлений на мобильной стороне!
Можете ли вы быть более конкретным об этом? Я поместил ваш код в конструктор уведомлений, который можно использовать во время работы приложения. Это ничего не сделало для уведомления в фоновом режиме. Я не совсем знаком с кодом Android. Я заглядываю внутрь и могу внести изменения, но мне нужно знать, что я ищу. Я использую react-native-firebase, поэтому много библиотечного кода можно потерять.
Ах, хорошо, если вы создадите уведомление с помощью компоновщика, вы можете использовать код, который написал вам! И я также добавляю ссылку на официальный документ, который может вам помочь :)
Спасибо @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)
Вы действительно используете GCM? Это устарело. Вместо этого вы должны использовать FCM. Кроме того, документация FCM объясняет, как делать то, что вы описываете. Вы ознакомились с этой документацией?