Я пытаюсь интегрировать Firebase FCM в свое приложение, но я получаю сообщения несколько раз.
Я отправляю сообщения через облачную функцию, которая срабатывает при добавлении уведомления в базу данных, например:
import { DataSnapshot } from "firebase-functions/lib/providers/database";
import { EventContext } from "firebase-functions";
import * as admin from 'firebase-admin'
import { ResolvePromise } from "./misc";
export function doSendNoticeFCM(snapshot: DataSnapshot, context?: EventContext) {
const uid = context.params.uid;
const noticeid = String(context.params.noticeid);
const notice = snapshot.val();
return admin.database().ref('device-tokens').child(uid).child('0')
.on('value', (data) => {
const token = data.val();
if (token === null) {
return ResolvePromise();
}
const title = String(notice['Title']);
const body = String(notice['Body']);
console.log("Title: " + title);
console.log("Body: " + body);
const payload: admin.messaging.Message = {
data: {
notice_id: noticeid,
title: title,
body: body
},
android: {
ttl: 0
},
token: token
};
return admin.messaging().send(payload)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
});
}
Это нормально работает. Я получаю токен устройства, отправляю сообщение и получаю его в своем приложении в службе сообщений.
using System;
using Android.App;
using Android.Support.V4.App;
using Firebase.Messaging;
using Android.Util;
using Doshi.Xamarin.Abstractions.StaticData;
using Android.Content;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using Android;
using Xamarin.Forms;
using Plugin.CurrentActivity;
using Acr.UserDialogs;
using Doshi.Xamarin.Core.Helpers;
using Doshi.Xamarin.Abstractions.Misc;
using Doshi.Xamarin.Android.Logic.Interfaces;
using Doshi.Xamarin.Android.Logic.Implementations;
namespace Doshi.Droid
{
[Service(Name = "com.doshi.droid.DoshiMessagingService")]
[IntentFilter(new[] {"com.google.firebase.MESSAGING_EVENT"})]
public class DoshiMessagingService : FirebaseMessagingService
{
INoticePresenter _noticePresenter = new DoshiNoticePresenter();
public override void OnMessageReceived(RemoteMessage message)
{
HandleNotice(message);
}
private void HandleNotice(RemoteMessage message)
{
int id = DateTime.Now.Millisecond;
//Create the hardware notice.
_noticePresenter.PresentNotice(this, message, id, Xamarin.Droid.Resource.Drawable.ic_logo, typeof(MainActivity));
}
}
Проблема возникает, когда я выхожу из системы.мое приложение и затем войдите снова те же уведомления, которые я получил ранее, получены снова.Я использую аутентификацию google с firebase в своем приложении и удаляю токен устройства из базы данных при выходе из системы и добавляю текущий токен при повторном входе в систему.Может ли это быть проблемой?
Из того, что я вижу в журналах Firebase, функция облака выполняется только один раз для каждого сообщения, поэтому я предполагаю, что что-то не так на стороне клиента.Я читал в другом посте stackoverflow, что установка ttl в 0 решит эту проблему, но это никак не повлияет на то, что я вижу.
Кто-нибудь еще сталкивался с этой проблемой или имеет представление о том, что я делаю неправильно?Я использую последнюю "стабильную" версию Xamarin.Firebase. * Nugets.