DevGang
Авторизоваться

React Native: Как я создаю функцию Push Notifications за 10 минут

В своем первом посте я хочу показать вам, как я могу создать функцию уведомлений React Native всего за 10 минут. Я знаю, что интеграция нативных функций может быть сложной задачей для тех, кто разрабатывает приложения с использованием React Native framework. Потому что вы должны знать больше об Android и IOS.

ШАГ 0: Обзор системы Push-уведомлений

Один из наиболее распространенных вопросов, с которыми я сталкиваюсь на собеседованиях, звучит так: «Вы понимаете, как работают push-уведомления?»

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

ШАГ 1: Создайте новый проект Firebase и настройте его для Android и iOS

Вы можете перейти по этим ссылкам:

1/ Создайте новый проект firebase: https://rnfirebase.io/

2/ Настройте для IOS: https://rnfirebase.io/messaging/usage/ios-setup

Примечание: вы должны создать новый проект, загрузить эти файлы JSON, а затем правильно добавить их в свой проект.

ШАГ 2: Добавьте необходимые библиотеки

# Install & setup the app module
yarn add @react-native-firebase/app

# Install the messaging module
yarn add @react-native-firebase/messaging

yarn add @notifee/react-native

Прежде чем перейти к следующему шагу, важно понять, зачем нужен Notifee.

https://rnfirebase.io/messaging/usage
https://rnfirebase.io/messaging/usage

Начиная с версии 6, Firebase больше не поддерживает отображение уведомлений на переднем плане, поэтому для реализации функции уведомлений нам нужны такие библиотеки, как локальное push-уведомление или Notifee.

ШАГ 3: Код

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

1/ Настройка фонового обработчика

// index.js
import { AppRegistry } from 'react-native';
import messaging from '@react-native-firebase/messaging';
import App from './App';

// Register background handler
messaging().setBackgroundMessageHandler(async remoteMessage => {
  console.log('Message handled in the background!', remoteMessage);
});

AppRegistry.registerComponent('app', () => App);

2/ CustomHook

import notifee, { AndroidImportance, EventType } from '@notifee/react-native';
import messaging, { FirebaseMessagingTypes } from '@react-native-firebase/messaging';
import { useEffect } from 'react';

const useNotification = () => {
  const addDeviceToken = () =>{
 // call api send token to Provider server here
    }; 

  const handleNavigateNotification = (data) => {
  // handle navigate here
}

  messaging().onNotificationOpenedApp(remoteMessage => {
    if (remoteMessage.data) {
      handleNavigateNotification(remoteMessage.data);
    }
  });

  const handleBackgroundPress = () => {
    messaging()
      .getInitialNotification()
      .then(remoteMessage => {
        if (remoteMessage) {
          if (remoteMessage.data) {
            handleNavigateNotification(remoteMessage.data);
          }
        }
      });
  };

  async function createChannelToken() {
    await notifee.createChannel({
      id: 'default',
      name: 'Default Channel',
      importance: AndroidImportance.HIGH,
    });
    // get token && handle post token => server
    const token = await messaging().getToken();
    // Create a channel (required for Android)
    if (token) {
      addDeviceToken(token); 
    }
    handleBackgroundPress();
  }

  const onDisplayNotification = async (remoteMessage: FirebaseMessagingTypes.RemoteMessage) => {

    await notifee.displayNotification({
      title: remoteMessage.notification?.title,
      body: remoteMessage.notification?.body,
      data: remoteMessage.data,
      android: {
        channelId: 'default', // android need channelId , don't forget add channelId
        // pressAction is needed if you want the notification to open the app when pressed
        pressAction: {
          id: 'default',
        },
        smallIcon: 'ic_small_icon',
      },
    });
  };

  useEffect(() => {
    const unsubscribe = messaging().onMessage(remoteMessage => {
      onDisplayNotification(remoteMessage);
    });
    return unsubscribe;
  }, []);

  useEffect(() => {
    createChannelToken();
    return notifee.onForegroundEvent(({ type, detail }) => {
      switch (type) {
        case EventType.DISMISSED:
          break;
        case EventType.PRESS:
          handleNavigateNotification(detail.notification?.data as NotificationProps);

          break;
        default:
          break;
      }
    });
  }, []);
};

export default useNotification;

3/ Обработка выхода пользователя из системы

  await messaging().deleteToken();

4/ Я предполагаю, что после входа в систему вы перейдете на главный экран. На этом этапе на главном экране вам нужно только:

 useNotification();

Распространенные ошибки, с которыми вы можете столкнуться:

  • Уведомления не работают при подключении к серверной части

Пожалуйста, используйте этот веб-сайт, чтобы убедиться, что вы правильно настроили мобильную версию: https://testfcm.com/

  • Уведомления не работают на виртуальной машине.

Для Android убедитесь, что на вашей виртуальной машине установлен Google Play Store.

Для iOS есть несколько способов получения уведомлений на симуляторе, но я думаю, что вам следует использовать реальное устройство, чтобы протестировать функцию уведомлений.

  • Если у вас нет учетной записи разработчика Apple, можете ли вы реализовать функцию уведомлений для iOS?

На мой взгляд, нет, потому что вам нужно настроить шаги, как я упоминал в шаге 1, и для этого требуется учетная запись разработчика

  • Уведомления о предупреждениях не используются по умолчанию на Android в фоновом режиме?

Недавно я столкнулся с проблемой, касающейся всплывающих уведомлений в фоновом режиме, который используется по умолчанию в iOS. Я изучил некоторые руководства и выяснил, что на некоторых устройствах Android пользователям необходимо вручную включать этот режим на своих устройствах. Однако я считаю, что мы можем справиться с этим в рамках нашего кода

Вы можете ознакомиться с методом обработки здесь: https://github.com/invertase/react-native-firebase/issues/2791#issuecomment-955418367

Источник

#ReactNative
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу