#android #react-native #push-notification #foreground #react-native-firebase
#Android #react-native #push-уведомление #передний план #react-native-firebase
Вопрос:
Я использую react-native-firebase для настройки push-уведомлений на переднем плане и в фоновом режиме в своем приложении. Я настроил его в соответствии с документами: https://rnfirebase.io/docs/v4.3.x/notifications/receiving-notifications#App-in-Foreground-and-background
К приложению firebase.messaging().onMessage()
подключен прослушиватель, и когда он получает уведомление на переднем плане, я использую firebase.notifications.displayNotification(notification)
его для отображения уведомления.
Затем onNotificationOpened
слушатель получает уведомление и переводит пользователя на другой экран.
Проблема в том, что объект уведомления, полученный от onNotificationOpened
, имеет действие android.intent.action.VIEW
, которое запускает MainActivity при каждом нажатии. Я понятия не имею, откуда берется эта строка действия, поскольку ни клиентское приложение, ни серверная часть не устанавливают никакого действия щелчка. Также это android.intent.action.VIEW
действие фильтра намерений для моего MainActivity
.
Я не хочу, чтобы действие contentIntent было привязано к моему уведомлению, я хочу, чтобы мое приложение обрабатывало навигацию к правильному компоненту.
Также существует проблема, связанная с тем, что нажатие на уведомление отключает и повторно монтирует мой основной компонент, что приводит к удалению прослушивателей уведомлений.
Я попытался установить MainActivity android:launchMode=singleTop
в AndroidManifest, но действие по-прежнему перезапускается. Я также пробовал использовать singleTask
, singleInstance
и standard
Это моя функция отображения уведомлений, которая вызывается onMessage
export async function displayNotification(message: RemoteMessage) {
try {
const notification = new firebase.notifications.Notification();
const { title, message: messageBody, ...messageData } = message.data;
notification
.setNotificationId(message.messageId)
.setTitle(title)
.setBody(messageBody)
.setData({
...messageData
})
.setSound('default');
if (isAndroid) {
// Build a channel for notifications on Android
const channel = await createAndroidChannel();
notification.android
.setBigText(messageBody)
.android.setChannelId(channel.channelId)
.android.setAutoCancel(true) // Remove on press
}
await notifications.displayNotification(notification);
return notification;
} catch (error) {
}
}
Ожидаемый результат: у пользователя есть приложение на переднем плане> пользователь получает push-уведомление> нажимает на уведомление> НЕ перезапускает основное действие, а перенаправляет на определенный экран, если это необходимо, через onNotificationOpened
прослушиватель
Фактический результат таков: после того, как пользователь нажимает на уведомление переднего плана> Основное действие перезапускается, а главный экран перемонтируется, что приводит к удалению прослушивателей уведомлений.
Ответ №1:
Проблема здесь в том, что экземпляр вашего приложения уже запущен, когда ваше приложение находится на переднем плане или в фоновом режиме. Поэтому, когда вы нажимаете на уведомление, оно снова создает другой экземпляр MainActivity и перезапускает его.Чтобы решить эту проблему, вы должны понимать режимы запуска Android
Пожалуйста, обратитесь к этой ссылке для описания
Попробуйте установить launchMode как singleTop в AndroidManifest.xml досье. Затем переустановите и протестируйте приложение. И это должно решить вашу проблему.!