Элегантная обработка ответов на уведомления — React Native

#firebase #react-native #events #push-notification #firebase-cloud-messaging

#firebase #react-native #Мероприятия #push-уведомление #firebase-облако-обмен сообщениями

Вопрос:

Я пытаюсь настроить уведомления в React Native (0.55.4), я использую react navigation для отображения своих экранов. Все настроено, я получаю уведомления и могу считывать полезную нагрузку

Я сослался на следующую страницу, чтобы понять, как получен ответ —
https://rnfirebase.io/docs/v5.x.x/notifications/receiving-notifications

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

В настоящее время она выполняется только в конструкторе и componentWillMount и других общих обратных вызовах, но я бы хотел, чтобы эта функция вызывалась каждый раз, когда я получаю уведомление, независимо от того, на какой странице я нахожусь.

Ответ №1:

То, что вы ищете, — это концепция субъекта. По сути, вам нужно транслировать события в том месте вашего приложения, где вы получаете уведомление. Все настроенные вами экраны, которые заинтересованы в уведомлениях, могут затем зарегистрироваться для прослушивания этих событий. Вот базовая тема, реализованная в JS, которую я использую в производстве, чтобы делать именно то, что вы описываете.

 const _handlers = {}

const Subject = {
  subscribe (...args) {
    const [event, handler] = args

    if (!_handlers[event]) _handlers[event] = []
    _handlers[event].push(handler)
  },
  unsubscribe (...args) {
    const [event, handler] = args

    if (!_handlers[event]) return
    _handlers[event] = _handlers[event].filter(func => func !== handler)
  },
  next (...args) {
    const [event, value] = args

    if (!_handlers[event]) return
    _handlers[event].forEach(handler => {
      if (typeof handler === 'function') {
        handler(value)
      }
    })
  }
}

Object.freeze(Subject)

module.exports = Subject
  

Вы можете использовать ее в своих компонентах следующим образом:

 notificationHandler = (payload) => {
  // Do something with the payload in your screen
}

componentDidMount () {
  Subject.subscribe('notification_received', this.notificationHandler)
}

componentWillUnmount () {
  Subject.unsubscribe('notification_received', this.notificationHandler)
}
  

При получении уведомления ваш прослушиватель уведомлений может вызвать Subject.next('notification_received', payload)