#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] Устройство отображает дублированное уведомление, если приложение не находится на переднем плане.
- Что я успешно получаю токен FCM устройства со следующим кодом:
Я упомянул о незначительных проблемах выше для полноты картины, но основная проблема, с которой я сталкиваюсь сейчас, заключается в том, что мое приложение просто не заметит, что уведомление прибыло. Прослушиватель не запускается.
Я попробовал как устаревший модуль уведомлений, так и новый модуль уведомлений:
// 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}
(получена в моем проекте FirebaseSettings > 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 здравствуйте, извините, все, что я знаю, находится на этой странице и по ссылкам… удачи