ионное push-уведомление, когда приложение находится на переднем плане

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

Home.ts

import { AngularFireDatabase } from 'angularfire2/database';
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import firebase from 'firebase';

declare var FCMPlugin;

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {

  firestore = firebase.database().ref('/pushtokens');
  firemsg = firebase.database().ref('/messages');
  constructor(public navCtrl: NavController,public afd:AngularFireDatabase) {
    this.tokensetup().then((token)=>{
      this.storeToken(token);
    })

  }
  ionViewDidLoad() {
    FCMPlugin.onNotification(function (data) {
      if (data.wasTapped) {
        //Notification was received on device tray and tapped by the user.
        alert(JSON.stringify(data));
      } else {
        //Notification was received in foreground. Maybe the user needs to be notified.
        alert(JSON.stringify(data));
      }
    });
    FCMPlugin.onTokenRefresh(function (token) {
      alert(token);
    });

  }

  tokensetup(){
    var promise = new Promise((resolve,reject)=>{
      FCMPlugin.getToken(function(token){
         resolve(token);
        },(err)=>{
          reject(err);
        });
    })
    return promise;
  }
  storeToken(token){
    this.afd.list(this.firestore).push({
       uid: firebase.auth().currentUser.uid,
       devtoken: token
    }).then(()=>{
      alert('Token stored')
    }).catch(()=>{
      alert('Token not stored');
    })
    // this.afd.list(this.firemsg).push({
    //   sendername:'adirzoari',
    //   message: 'hello for checking'
    // }).then(()=>{
    //   alert('Message stored');
    // }).catch(()=>{
    //   alert('message not stored');
    // })
  }
}

облако функций для уведомлений

  var functions = require('firebase-functions');
var admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);
var wrotedata;
exports.Pushtrigger = functions.database.ref('/messages/{messageId}').onWrite((event) => {
    wrotedata = event.data.val();

    admin.database().ref('/pushtokens').orderByChild('uid').once('value').then((alltokens) => {
        var rawtokens = alltokens.val();
        var tokens = [];
        processtokens(rawtokens).then((processedtokens) => {

            for (var token of processedtokens) {
                tokens.push(token.devtoken);
            }

        var payload = {

                "notification":{
                    "title":"From" + wrotedata.sendername,
                    "body":"Msg" + wrotedata.message,
                    "sound":"default",
                    },
                "data":{
                    "sendername":wrotedata.sendername,
                    "message":wrotedata.message
                }
        }

            return admin.messaging().sendToDevice(tokens, payload).then((response) => {
                console.log('Pushed notifications');
            }).catch((err) => {
                console.log(err);
            })


        })    
    })
})

function processtokens(rawtokens) {
    var promise = new Promise((resolve, reject) => {
         var processedtokens = []
    for (var token in rawtokens) {
        processedtokens.push(rawtokens[token]);
    }
    resolve(processedtokens);
    })
    return promise;    

}

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


person Manspof    schedule 27.09.2017    source источник
comment
Есть новости по этому поводу? Похоже, я тоже зациклился на этом!   -  person Hardeep Mehta    schedule 12.11.2017
comment
Любые обновления по этому поводу ??? был поражен   -  person Nicks    schedule 13.02.2018


Ответы (2)


Вам необходимо отредактировать файлы плагина FCM. Я нашел решение только для андроида сейчас.

Я использую https://github.com/fechanique/cordova-plugin-fcm это Плагин FCM для android и ios в кордове.

Вам необходимо отредактировать файл MyFirebaseMessagingService.java в строке 53 (строка может отличаться).

В этом файле есть метод onMessageReceived, в конце метода есть строка с комментариями, эта строка вызывает другой метод, то есть sendNotification(....).

sendNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody(), data);

Вы должны раскомментировать эту строку и изменить последний параметр с remoteMessage.getData() to data (переменная данных уже есть в коде).

И прокомментируйте эту строку FCMPlugin.sendPushPayload( data );

Теперь можно идти. Теперь вы можете получать уведомления, даже когда приложение открыто (на переднем плане), вы будете получать баннерные (плавающие) уведомления.

Если вы нашли что-нибудь для IOS, дайте мне знать !!!

person Kushal Jain    schedule 02.08.2018

Я использую плагин firebase для ionic 3. Есть проверка, содержат ли данные уведомления «notification_foreground» или нет, и сохраняет их в переменной foregroundNotification.

  if(data.containsKey("notification_foreground")){
            foregroundNotification = true;
        }

затем он создает переменную showNotification, которая решает, нужно ли нам показывать уведомление или нет, и передает это в sendMessage (функция показа уведомления).

  if (!TextUtils.isEmpty(body) || !TextUtils.isEmpty(title) || (data != null && !data.isEmpty())) {
        boolean showNotification = (FirebasePlugin.inBackground() || !FirebasePlugin.hasNotificationsCallback() || foregroundNotification) && (!TextUtils.isEmpty(body) || !TextUtils.isEmpty(title));
        sendMessage(data, messageType, id, title, body, showNotification, sound, vibrate, light, color, icon, channelId, priority, visibility);
    }

ваша полезная нагрузка должна содержать notification_foreground, notification_title и notification_body.

person Zeeshan Anjum    schedule 03.10.2019