Прослушивание доставки push-уведомлений FCM с помощью Expo react native (Android)

#android #react-native #push-notification #firebase-cloud-messaging #expo

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

Вопрос:

Я столкнулся с проблемой, очень похожей на эту.

  • Я использую Expo (SDK38) для управляемого рабочего процесса
  • Я создаю автономные сборки APK с помощью Turtle CLI на CI
  • У меня есть проект FCM, который почти идеально работает с автономным приложением. Почти идеально я имею в виду:
    • Что я успешно получаю токен FCM устройства со следующим кодом:
       import { Notifications } from 'expo';
      
      await Notifications.getDevicePushTokenAsync(); // Gives the token successfully
        
    • Что я отправляю push-уведомление при запуске следующего скрипта NodeJS, но:
       const admin = require('firebase-admin');
      
      admin.initializeApp({
          credential: require('./my-credentials.json'),
          databaseURL: 'https://MY_URL_HERE'
      });
      
      admin.messaging.send({
          notification: { title: 'Foo', body: 'Bar' },
          android: { ttl: 86400 },
          token: 'THE_FCM_TOKEN_HERE'
      });
        
      • [Незначительная проблема 1] Устройство не отображает никаких уведомлений, если приложение находится на переднем плане;
      • [Незначительная проблема 2] Устройство отображает дублированное уведомление, если приложение не находится на переднем плане.

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

Я попробовал как устаревший модуль уведомлений, так и новый модуль уведомлений:

 // Attempt using Legacy Notifications
// https://docs.expo.io/versions/v38.0.0/sdk/legacy-notifications/
import { Notifications as LegacyNotificationsModule } from 'expo';

// Attempt using New Notifications Module
// https://docs.expo.io/versions/v38.0.0/sdk/notifications/
import * as NewNotificationsModule from 'expo-notifications';

LegacyNotificationsModule.addListener(() => {
    // Make any UI change just for we to see it happening
});

NewNotificationsModule.addNotificationReceivedListener(() => {
    // Make any UI change just for we to see it happening
});

// I also tried commenting and uncommenting the code below
NewNotificationsModule.setNotificationHandler({
    handleNotification: async () => ({
        shouldShowAlert: true,
        shouldPlaySound: false,
        shouldSetBadge: false,
    }),
});
  

Напомним, что, как и в аналогичной проблеме, на которую я ссылался выше, я не использую токены уведомлений Expo (формы ExponentPushToken[xxxxxx] ). Я использую стандартные токены FCM, полученные через Notifications.getDevicePushTokenAsync() .

Как я могу заставить это работать?

Ответ №1:

Я, наконец, понял это.

Я отправил PR в Expo, чтобы улучшить документацию по этому вопросу.

Короче говоря, цитируя мой комментарий на GitHub:

Чтобы приложение правильно реагировало на уведомление, в нем должно быть дополнительное специальное поле под названием experienceId . Я не смог найти способ отправить это поле через интерфейс консоли Firebase для отправки тестовых сообщений; вместо этого я заставил его работать, выполняя HTTP POST вызов с:

  • Заголовки:
    • Авторизация: key=${FIREBASE_SERVER_KEY_TOKEN} (получена в моем проекте Firebase Settings > Cloud Messaging )
    • Тип содержимого: application/json
  • Тело:
     {
        "to": "<DEVICE_PUSH_NOTIFICATION_TOKEN>",
        "priority": "normal",
        "data": {
            "experienceId": "@anonymous/my-project-slug",
            "title": "Hello",
            "message": "World"
        }
    }
      

Ключевая информация, которая не была задокументирована, заключается в том, что для таких людей, как я, у которых нет учетной записи expo (и которые создают все независимо от expo), идентификатор опыта должен начинаться с @anonymous . Полная благодарность @awinograd в GitHub за то, что выяснил это.

Комментарии:

1. Привет ~ Педро. Не могли бы вы задать мне вопрос об уведомлении expo?

2. @cYee Не стесняйтесь спрашивать!

3. Я думаю, что я уже нашел проблему. хотел спросить вас о несоответствии идентификатора отправителя в fcm. Но обнаружил, что он не может использовать expo client с токеном устройства, но с автономной сборкой. Спасибо, Педро.

4. Привет, @PedroA Я использую веб-конфигурацию из firebase, но мой токен API принадлежит Android. Я не могу получить сообщение. Метод post возвращает 200.

5. @AyushKumar здравствуйте, извините, все, что я знаю, находится на этой странице и по ссылкам… удачи