Отсутствие уведомлений при закрытии приложения FCM с облачными функциями для Firebase

В настоящее время Firebase развернула облачные функции с Firebase для добавления кода на стороне сервера.

В настоящее время я использую этот подход для уведомлений о получении сообщения от отправителя.

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

Я видел несколько ответов относительно этого, что я должен использовать только сообщение с данными и получать в onMessageReceived(), но его не работает для убитого приложения. Что я должен делать?

NodeJS Index.js

exports.sendNewMessageNotification = functions.database.ref('/rootssahaj/authGplus/users/{userTorS}/{userTeacherUID}/messages/{chatWithOthUser}/{messageUID}').onWrite(event => {
console.log('called1 ');
const TeacherUid = event.params.userTeacherUID;
const whoTorS=event.params.userTorS;
var whoOppTorS=null;
if (whoTorS=="teachers") {
    whoOppTorS="students";
}else{
    whoOppTorS="teachers";
}
var StudentUid = event.params.chatWithOthUser;
StudentUid=StudentUid.substring(8);

console.log('called2 ')

if (!event.data.val()) {
return console.log('No Change ');
}

console.log('Event data: ',StudentUid, event.data.val());
if (StudentUid!=event.data.val().sender) {
return console.log('Different sender ',event.data.val().sender);
}

// Get the list of device notification tokens.
const getDeviceTokensPromise = admin.database().ref(`/rootssahaj/authGplus/users/${whoTorS}/${TeacherUid}/profile/fcmtoken`).once('value');

// Get the follower profile.
const getFollowerProfilePromise = admin.database().ref(`/rootssahaj/authGplus/users/${whoOppTorS}/${StudentUid}/profile`).once('value');

return Promise.all([getDeviceTokensPromise, getFollowerProfilePromise]).then(results => {
const tokensSnapshot = results[0];
const follower = results[1];
console.log('Token: ', tokensSnapshot.val(),' ',follower.val());
// Check if there are any device tokens.
if (tokensSnapshot.val()==null) {
  return console.log('There are no notification tokens to send to.');
}
console.log('There are', tokensSnapshot.numChildren(), tokensSnapshot,'tokens to send notifications to.');
console.log('Fetched follower profile', follower.val().userNAME);

// Notification details.
const payload = {
  data: {
    body: `new message: ${event.data.val().text}`,
    title: `${follower.val().userNAME}`,
  }
};
var options = {
priority: "high"
};

// Listing all tokens.
//const tokens = Object.keys(tokensSnapshot.val());
// console.log('tokens', tokens);

// Send notifications to all tokens.
return admin.messaging().sendToDevice(tokensSnapshot.val(), payload,options).then(response => {
  // For each message check if there was an error.
  const tokensToRemove = [];
  response.results.forEach((result, index) => {
    const error = result.error;
    if (error) {
      console.error('Failure sending notification to', tokens[index], error);
      // Cleanup the tokens who are not registered anymore.
      if (error.code === 'messaging/invalid-registration-token' ||
          error.code === 'messaging/registration-token-not-registered') {
        //tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
      }
    }
  });
  return Promise.all(tokensToRemove);
});
});
});

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

W / GCM-DMM (29459): обратный вызов намерения широковещательной передачи: результат = ОТМЕНЕН forIntent {act = com.google.android.c2dm.intent.RECEIVE flg = 0x10000000 pkg = com.rana.sahaj.myyu (имеет дополнительные функции)}


person Sahaj Rana    schedule 18.03.2017    source источник


Ответы (2)


Убедитесь, что токен устройства, который вы получаете в обещании, актуален. Токен устройства может быть изменен / обновлен в эмуляторе или устройстве Android по ряду причин.

Убедитесь, что у вас нет журналов ошибок для облачной функции на вкладке ЖУРНАЛЫ в функциях в Firebase.

Я МОГУ ПОДТВЕРДИТЬ, когда вы убиваете приложение (смахните приложение в Android), вы все равно будете получать уведомления.

РЕДАКТИРОВАТЬ: добавлен манифест

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.quickstart.fcm">
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/app_logo"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <!-- [START fcm_default_icon] -->

        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/ic_stat_ic_notification" />

        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/colorAccent" />
        <!-- [END fcm_default_icon] -->
        <activity
            android:name="com.google.firebase.quickstart.fcm.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity
            android:name="com.google.firebase.quickstart.fcm.CalendarActivity"
            android:label="@string/calendar_activity_label">
        </activity>

        <!-- [START firebase_service] -->
        <service
            android:name=".MyFirebaseMessagingService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
        <!-- [END firebase_service] -->
        <!-- [START firebase_iid_service] -->
        <service
            android:name=".MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
        <!-- [END firebase_iid_service] -->
    </application>

</manifest>
person user3414265    schedule 19.03.2017
comment
В настоящее время я получаю уведомления, когда приложение не убито, и я также сделал код для обновления токена в базе данных этого пользователя, чтобы его можно было напрямую получить оттуда. так что проблема не в этом, а также на вкладке журналов ошибок нет. Не могли бы вы рассказать мне, что вы сделали в своих Manfiest и Receiver? - person Sahaj Rana; 19.03.2017
comment
и на какой версии андроида вы тестировали - person Sahaj Rana; 19.03.2017
comment
Я использую firebase-database и firebase-messages как 10.0.1. Просто укажите, что вы отправляете сообщение с типом данных, поэтому на панели задач не будет никаких уведомлений о любом полученном сообщении. - person user3414265; 19.03.2017
comment
Дааа, но onMessageReceived () должен быть запущен. Раньше я использовал тип уведомлений, но результат был таким же, поэтому я искал решение, и в большинстве из них было написано, что это просто тип сообщения с данными. - person Sahaj Rana; 19.03.2017
comment
Я расширил FirebaseInstanceIdService и FirebaseMessagingService и реализовал необходимые методы в службе, объявив службы в AndroidManifest. Надеюсь, вы используете приложение для быстрого запуска обмена сообщениями, размещенное на Github. Это хорошая отправная точка - person user3414265; 19.03.2017
comment
Просто чтобы подтвердить, что вы имеете в виду под убитым приложением - вы проводите пальцем по приложению из списка последних приложений ИЛИ принудительно останавливаете приложение? Если вы остановите приложение принудительно, вы не будете получать уведомления, пока не запустите приложение снова. - person user3414265; 19.03.2017
comment
и это больше похоже на удаление приложения из системного трея - person Sahaj Rana; 19.03.2017
comment
Обратите внимание, что он может работать в предыдущих версиях Android, но не работает с Lollipop на палатах, только что протестированных на моем устройстве Android. - person user3414265; 19.03.2017

Firebase поддерживает два типа уведомлений:

  1. Уведомление
  2. Сообщение с данными

Сообщение с данными должно обрабатываться на стороне клиента и не будет получено при закрытии приложения.

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

Из облачной функции вам нужно отправить уведомление, чтобы получить enen, когда приложение убито

//Notification message
var patyload = {
    notification: {
       title: "title"
  }
};

//Data Message
var payload = {
    data: {
      title: "title"
  }
};

admin.messaging().sendToTopic(topic, payload,options)

Подробнее об уведомлении здесь

https://firebase.google.com/docs/cloud-messaging/concept-options

person Shruti    schedule 11.12.2017
comment
разве не наоборот ?? см. stackoverflow.com/a/39777696 - person Derlin; 14.10.2020