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-уведомление?
Нажатие первого открывает игру единства, как и ожидалось, но нажатие на пустое - нет.
Куда я иду с этим не так?
Спасибо!
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.
Есть два варианта, чтобы это исправить.
- Снимите трубку, если она вам не нужна.
- добавлять
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 и протестируйте его снова.