Firebase показывает два уведомления на Android

Я изо всех сил пытаюсь найти причину для дублирующего уведомления на Android с помощью Firebase, Unity и отправки с nodejs с помощью node-gcm.

Вот весь относительный код:

Unity3d на стороне клиента я получил:

 public class PushServiceManager : MonoBehaviour
    {
        public string Identifier;
        public string SkuId;

        public SQSParameters sqsOptions;
        private SQSManager sqs;

        // Use this for initialization
        void Start()
        {
            sqs = new SQSManager(this.sqsOptions);
            sqs.Initialize(this.gameObject);

            Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
            Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
        }

        public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token)
        {
            Debug.Log("Received Registration Token: " + token.Token);

            RegistrationToken t = new RegistrationToken();
            t.id_token = token.Token;

            // sends token to node server
            sqs.SendRegistrationToken(t);
        }

        public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e)
        {
            Debug.Log(e.Message.Data.ToString());
        }
    }

Сторона сервера Nodejs:

pushNotification(pushRequest, tokens, callback) {

        // This is an array of firebase tokens
        let registrationTokens = tokens.map(function (token) {
            return token.token;
        });

        let message = new gcm.Message({
            timeToLive: pushRequest.ttl
        });

        let note = {

           title: 'Message title',
           icon: 'none',
           sound: 'none',
           body: 'message text'
        };

        message.addNotification(note);

        let payload = {
           data: {foo: "foo"}
        }

        message.addData(payload);

        this.sender.send(message, {registrationTokens}, callback);
    }

Результат на устройстве:
push-уведомления на устройстве

Вопрос:
Почему я получаю второе пустое push-уведомление?
Нажатие первого открывает игру единства, как и ожидалось, но нажатие на пустое - нет.
Куда я иду с этим не так?

Спасибо!

01.31.17 ОБНОВЛЕНИЕ:
Отключение в службу поддержки Firebase для изучения этой проблемы...

3 ответа

Решение

У меня та же проблема с дубликатами уведомлений в моем проекте, и ниже приведено решение.

Проверьте созданный вами файл AndroidManifest.xml с помощью Unity build в папке [Папка проекта Unity]\Temp\StagingArea.

Ищите все получатели, которые имеют нижнюю строку:

<action android:name="com.google.android.c2dm.intent.RECEIVE" />

В моем случае ниже добавлен плагин Amazon AWS Unity.

<receiver android:name="com.amazonaws.unity.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
    <category android:name="com.amazonaws.unity" />
  </intent-filter>
</receiver>

и ниже из плагина Firebase

<receiver android:exported="true" android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:permission="com.google.android.c2dm.permission.SEND">
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
    <category android:name="com.bbbbbttttttgggg.sssssstttt" />
  </intent-filter>
</receiver>

Дублированное уведомление вызвано amazon AWS GCMBroadcastReceiver.

Есть два варианта, чтобы это исправить.

  1. Снимите трубку, если она вам не нужна.
  2. добавлять android:exported="false" получателю.

Пример:

   <receiver android:exported="false" android:name="com.amazonaws.unity.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
      <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="com.amazonaws.unity" />
      </intent-filter>
    </receiver>

Не забудьте внести изменения в исходный файл AndroidManifest.xml, содержащий получатель. Не тот в Temp \ StagingArea. Это должен быть один из файлов AndroidManifest.xml в папке [Папка проекта вашего единства]\Assets\Plugins\Android или ее подпапке.

Я нашел причину этой проблемы...

В проект был включен модуль AWS, у которого был собственный файл манифеста. В нем было объявление получателя для "GCMBroadcastReceiver" в сочетании с объявлением службы для "GCMIntentService".

Удаление тех решило проблему

Я сталкиваюсь с той же проблемой с Firebase. Я использую Firebase вместе с Microsoft Azure Notification Hub. Если я отправляю тестовое сообщение через Microsoft Notification Hub, я получаю только одно сообщение, и это сообщение обрабатывается моим Push-обработчиком. В противном случае, если я отправляю push-уведомления через консоль Firebase, я получаю два сообщения, как вы (также одно пустое). Одно сообщение обрабатывается моей push-службой, а второе каким-то образом обрабатывается "без кода"! Я не могу найти в своем коде, где обрабатывается push-уведомление, отправленное firebase? В фоновом режиме должен быть метод OnReceiveMessage, который обрабатывает уведомление. Для меня пришло следующее решение: я просто раскомментировал свой обработчик push-уведомлений, и теперь я получаю только одно уведомление, но это без звука... каким-то образом я должен переопределить эту функцию и реализовать поведение звука. Вы нашли решение для этого? Пустое сообщение вызвано вашим обработчиком push, второе полное сообщение обрабатывается в фоновом режиме firebase.

Я также получаю два разных типа сообщений в моем методе onReceive():

Microsoft: Bundle [{google.sent_time = 1484748187461, от =230XXXXXXXXXX, google.message_id=0:1484748187469719%8a1048bff9fd7ecd, сообщение = тестирование через Microsoft, collapse_key = do_not_collapse}]

Firebase: Bundle [{google.caudt=0, google.sent_time=1484748603664, gcm.notification.e=1, google.cac_id=3001008833206773803, google.cats=1484748604, gcm.ne = 1, от = 230XXXXXXssXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEX =0:1484748603943016%8a1048bf8a1048bf, gcm.notification.body= Тестирование через firebase, google.cae=1, collapse_key=com.sub_zero.ipostcard}]

Таким образом, сообщение, полученное через firebase, обрабатывается один раз в фоновом режиме, может быть, через библиотеку firebase, и второй раз, как я полагаю, вашим обработчиком. Вот почему вы получаете два из них... Просто раскомментируйте ваш обработчик push и протестируйте его снова.

Другие вопросы по тегам