Уведомление Ionic3 Firebase не получено на устройстве

Вкратце: Уведомления Firebase, отправленные через Firebase Cloud Functions, показывают, что сообщение отправлено. Однако сообщение не получено на устройство. (Проверено только на Android. Не знаю об iOS)

Здравствуйте, я работаю над проектом Ionic 3, который использует Firebase Cloud Firestore, Cloud Functions и другие службы Firebase.

Рабочий процесс приложения:

При создании нового документа (как в новом резервировании) административный SDK должен отправить push-уведомление на конкретное устройство, которое должно прибыть на устройство.

Проблема:

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

Код:

index.ts (облачные функции)

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp(functions.config().firebase);

exports.notifyOnNewBooking = functions.firestore
    .document('users/{userId}/bookings/{bookingId}')
    .onCreate( event => {
        const bookingData = event.data.data();

        // construct notification message here
        const message = {
            notification: {
                title: 'Reservation confirmed!',
                body: 'Your reservation at someplace at sometime is confirmed',
                icon: 'https://image.ibb.co/iBwekx/icon.png'
            }
        };

        // send notification with message right away
        return admin.messaging().sendToDevice(bookingData.deviceFCMToken, message, {priority: 'high'})
            .then(resp => {
                console.log("sent successfully", resp);
            })
            .catch(err => {
                console.error("could not send notification", err);
            });
    });

app.component.ts (ионный)

...
// Ionic Native wrapper
import { FCM } from '@ionic-native/fcm';
....

@Component({
  template: `
  ....
  ....
`
})
export class MyApp {
  ...
  constructor(..., private fcm: FCM) {}

  ngOnInit() {
    this.fcm.onNotification()
      .subscribe(resp => {});
  }
}

Журнал Firebase Cloud Functions показывает следующее:

введите здесь описание изображения

Информация ионного интерфейса командной строки

cli packages: (/usr/local/lib/node_modules)

    @ionic/cli-utils  : 1.19.1
    ionic (Ionic CLI) : 3.19.1

System:

    Node : v9.3.0
    npm  : 5.5.1 
    OS   : macOS High Sierra

Misc:

    backend : pro

Зависимости package.json Cloud Functions

  "dependencies": {
    "@google-cloud/functions-emulator": "^1.0.0-beta.3",
    "firebase-admin": "~5.8.1",
    "firebase-functions": "^0.8.1",
    "firebase-tools": "^3.17.4",
    "global": "^4.3.2"
  },

config.xml

<plugin name="cordova-plugin-fcm" spec="^2.1.2">
  <variable name="SENDER_ID" value="845539284400" />
</plugin>

Примечание. В корневом компоненте приложения есть только одна подписка. И я использую тарифный план Firebase Spark, который бесплатен, но часто уведомляет в журнале, что - Учетная запись для выставления счетов не настроена. Внешняя сеть недоступна, и квоты сильно ограничены. Настройте платежный аккаунт, чтобы снять эти ограничения.


person somnathbm    schedule 01.03.2018    source источник
comment
Привет, я думаю, вам не хватает важного шага регистрации токена при инициализации плагина FCM: fcm.getToken (). Then (token = ›{backend.registerToken (token);})   -  person Sergey Rudenko    schedule 06.03.2018
comment
в основном, прежде чем вы включите уведомления, вам нужно получить токен локально, а затем передать его на свой бэкэнд, чтобы логика на стороне сервера могла отправлять уведомления   -  person Sergey Rudenko    schedule 06.03.2018
comment
@SergeyRudenko - нет, я не промахнулся. Я зарегистрировал токен в другом месте, как того требует мое приложение. Недавно я попытался отправить уведомления о данных из Cloud Functions, и они отлично получаются. Но для обычного уведомления его не получают в приложении. С другой стороны, сообщение с уведомлением о данных поступает только в подписке onNotification(), а не в панели уведомлений системы, которую я хочу. Я не знаю, предполагалось ли это поведение или что.   -  person somnathbm    schedule 06.03.2018
comment
Извините, вы можете уточнить, работает ли ваше приложение на переднем плане или в фоновом режиме в ваших сценариях? в основном, если ваше приложение находится в FOREGROUND - ваше приложение может получать только полезную нагрузку, указанную объектом данных в объекте уведомлений, и не будет уведомлений на основе лотка. Но когда вкладка вашего приложения или в противном случае находится в фоновом режиме - вы будете получать данные из объекта уведомления, но не из данных - имеет смысл?   -  person Sergey Rudenko    schedule 06.03.2018


Ответы (1)


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

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp(functions.config().firebase);

exports.notifyOnNewBooking = functions.firestore
    .document('users/{userId}/bookings/{bookingId}')
    .onCreate(event => {
        const bookingData = event.data.data();

        // construct notification message here
        const message: admin.messaging.Message = {
            token: bookingData.deviceFCMToken,
            android: {
                notification: {
                    title: 'Reservation successful',
                    body: `Your reservation at ${bookingData.restaurant_name} is confirmed.`,
                    icon: 'https://image.ibb.co/iBwekx/icon.png'
                }
            },
            apns: {
                headers: {
                    'apns-priority': '10'
                },
                payload: {
                    aps: {
                        alert: {
                            title: 'Reservation successful',
                            body: `Your reservation at ${bookingData.restaurant_name} is confirmed.`,
                        },
                        badge: 1
                    }
                }
            }
        };

        // send notification with message right away
        return admin.messaging().send(message)
            .then(resp => {
                console.log("sent successfully", resp);
            })
            .catch(err => {
                console.error("could not send notification", err);
            });
    });
person somnathbm    schedule 07.03.2018