Я не получаю push-уведомления FCM при закрытом приложении. Ионный 3 и угловой

Доброго времени суток, ребята, это моя первая публикация на сайте, прошу прощения, если я не соблюдаю все правила публикации, потому что не знаю их подробно.

Шаг, чтобы прокомментировать мою проблему. У меня есть приложение, созданное с использованием ionic 3 и angular, которое работает с уведомлениями между пользователями, чтобы вызвать действие, исследовать форумы firebase и несколько других мест и пробовать несколько кодов, но я не мог это исправить. Приложение отправляет данные и уведомление на конкретный токен, устройство, зарегистрированное токеном, получает данные, но не уведомление. Ни когда он открыт, ни когда приложение открыто, ни когда оно находится в фоновом режиме, ни когда оно закрыто. Это код, который вы используете:

1) Чтобы получить токен

 this.fcm.getToken (). then (token => {

         alert ('token' + JSON.stringify (token))

         // Here I save the token I receive from the device
      })

Это работает .. Я могу получить токен устройства.

2) Чтобы получить уведомление:

this.fcm.onNotification (). subscribe (data => {
        if (data.wasTapped) {
          alert ("Received in background")
        } else {
          alert ("Received in foreground")
        };
      })

Это также работает, когда я отправляю уведомление с консоли firebase, я получаю его отлично .. проблема в том, что я отправляю его с сервера

3) Код для уведомления:

SendNotific ()
{
let keytoken = 'fqN5yelN7gk: APA91bGT0 ......'
let keyserver = 'AAAA4oCrTNk: APA91bHLBWcyQimF ....'
let headers = {'Authorization': 'key =' + keyserver,
'Content-Type': 'application / json'};
let url = 'https://fcm.googleapis.com/fcm/send';
let body = {
"notification":{
"title": "notification title",
"body": "notification body"
},
"data":{
"key1": "value1",
"key2": "value2"
},
"to": keytoken,
"priority": "high",
"content_available": true
}

this.http.post (url, body, headers) .then (data =>
{
alert (JSON.stringify (data))

}). then (error => {
alert ('error' + JSON.stringify (error))
})
}

Если приложение находится на переднем плане устройства, предупреждение становится видимым, то есть я получаю данные, которые отправил в разделе «Данные». (В этом случае это будут «key1» и «key2»), но я не получаю никаких уведомлений. Если приложение работает в фоновом режиме или закрыто, уведомления не отображаются, а когда я снова открываю приложение, отображаются предупреждающие сообщения с полученными «данными».

Как я уже говорил, если вы отправили уведомление из консоли Firebase, оно работает нормально ..

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

Могу ли я пропустить определенные данные в уведомлении, чтобы их можно было увидеть?

Нужно ли пользователю принимать какое-либо разрешение для получения уведомления?

Большое спасибо и извините, если я не смог четко объяснить

С уважением,

Джулиан.


person julián telgarecz    schedule 15.02.2018    source источник


Ответы (1)


Итак, первое, что я отмечаю в вашем коде, это то, что Sender отсутствует в headers. заголовки должны быть примерно такими:

let headers = {
               'Authorization': 'key=' + keyserver,
               'Content-Type': 'application / json',
               'Sender': 'id=' + senderId
              };

В теле будет to или token для device token, то есть получателя. Итак, тело будет примерно таким:

let body = {
  "token": keytoken,
  "notification":{
    "title": "notification title",
    "body": "notification body"
  },
  "data":{
    "key1": "value1",
    "key2": "value2"
  },
  "priority": "high",
  "content_available": true
}

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

this.http.post(url, body, headers).toPromise().then(data =>
{
  alert (JSON.stringify(data));
}).catch( error => {
  alert ('error' + JSON.stringify (error));
})
person RKalra    schedule 15.02.2018
comment
Привет, спасибо за ответ, попробуйте, и это не сработает. Добавьте идентификатор отправителя в заголовки. Я не решаю свою проблему и ничего не сломал. Также поменяйте на токен, и он не работает. Если я сделаю это изменение, данные тоже не появятся. - person julián telgarecz; 16.02.2018
comment
Еще одно уточнение: вы говорите, что вы отлично получили push-уведомление на устройстве, когда приложение было в фоновом режиме (и даже закрыто), когда вы отправили уведомление с помощью консоли, но не получили, когда вы отправили его с сервера? - person RKalra; 16.02.2018
comment
Точно, когда я отправляю с консоли тестирования cordova-plugin-fcm.appspot.com или из консоли firebase работает корректно. Моя проблема в том, что когда я отправляю уведомление с сервера, очевидно, что моя ошибка находится в отправленном мной json. Уточняю: при отправке уведомления функция this.http.post () работает корректно. Если у меня есть приложение на переднем плане, я получаю данные, которые отправляю в параметре data. Если приложение работает в фоновом режиме или закрыто, ничего не происходит, пока я не открою приложение вручную. Когда я открываю его, я получаю отправленные данные, но не уведомление. - person julián telgarecz; 16.02.2018
comment
Внутри функции: this.fcm.onNotification (). subscribe (data = ›{if (data.wasTapped) {alert (Получено в фоновом режиме)} else {alert (Получено на переднем плане)};}) Данные WasTapped всегда поступают в ложном - person julián telgarecz; 16.02.2018
comment
WasTapped будет ложным, это ожидается .. Вам необходимо добавить "click_action":"FCM_PLUGIN_ACTIVITY" Check github.com/fechanique/ - person RKalra; 16.02.2018
comment
Вы получаете уведомления, когда открываете приложение, но платформа не может обрабатывать отображение уведомлений, или приложение каким-то образом теряет регистрацию приложения, что маловероятно, поскольку оно работает с консоли firebase. Удалите пробелы из токена, то есть идентификатора регистрации устройства, и добавьте поле значка перед повторной попыткой. - person RKalra; 16.02.2018
comment
Если описанное выше не работает, попробуйте его на другом устройстве и посмотрите, что произойдет. - person RKalra; 16.02.2018
comment
Спасибо за вашу помощь, я попробую то, что вы предлагаете. Раньше мне рекомендовали добавить click_action, но у меня это не работает. Я продолжу тестировать и комментировать свои результаты. Ранее я упоминал WasTapped, потому что, когда у меня есть приложение в фоновом режиме и я получаю уведомление от тестера, WasTapped приходит в ИСТИНА. Сделаю тесты и выложу с изображениями, спасибо за помощь - person julián telgarecz; 16.02.2018