Мое приложение получит одно уведомление, прежде чем токен регистрации GCM удалит регистрацию с ошибкой «Дескриптор системы push-уведомлений для регистрации больше не действителен».То, с чем я борюсь, - это когда он теряет токен.Если я оставлю приложение открытым, токен останется, и когда я закрою его, я смогу получить 1 уведомление, прежде чем токен перестанет действовать.Я чувствую, что он теряет ссылку на токен где-то по пути, и я не совсем уверен, где.
Класс FireMessagingService:
[Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class MyFirebaseMessagingService : FirebaseMessagingService
{
const string TAG = "MyFirstBaseMessagingService";
private int Notification_ID = 2;
public override void OnMessageReceived(RemoteMessage message)
{
try
{
Log.Debug(TAG, "From: " + message.From);
if (message.GetNotification() != null)
{
Log.Debug(TAG, "Notification Message Body: " + message.GetNotification().Body);
SendNotification(message.Data);
}
else
{
SendNotification(message.Data);
}
} catch (Exception e)
{
}
}
void SendNotification(IDictionary<string,string> message)
{
try
{
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.ClearTop);
var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
Drawable drawable = ContextCompat.GetDrawable(this, Resource.Drawable.lsbu);
Bitmap bitmap = ((BitmapDrawable)drawable).Bitmap;
string title = message["title"];
string body = message["body"];
NotificationManager notificationManager = GetSystemService(NotificationService) as NotificationManager;
string ChannelID = GetString(Resource.String.LocalChannelID);
string AppName = GetString(Resource.String.AppName);
NotificationImportance Importance = NotificationImportance.Default;
NotificationChannel mChannel = new NotificationChannel(ChannelID, AppName, Importance);
notificationManager.CreateNotificationChannel(mChannel);
Notification.Builder builder = new Notification.Builder(this, ChannelID)
.SetWhen(DateTime.Now.Millisecond)
.SetSmallIcon(Resource.Drawable.miniwozzad)
.SetLargeIcon(bitmap)
.SetContentTitle(title)
.SetContentIntent(pendingIntent)
.SetContentText(body)
.SetChannelId(ChannelID);
var notification = builder.Build();
notificationManager.Notify(Notification_ID, notification);
Notification_ID++;
} catch (Exception e)
{
Console.WriteLine($"Error: {e.Message}");
}
}
}
И мой класс FirebaseRegistration:
[Service]
[IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
public class MyFirebaseIIDService : FirebaseInstanceIdService
{
const string TAG = "MyFirebaseIIDService";
public MyFirebaseIIDService()
{
OnTokenRefresh();
}
public override void OnTokenRefresh()
{
var refreshedToken = FirebaseInstanceId.Instance.Token;
Log.Debug(TAG, "FCM token: " + refreshedToken);
SendRegistrationToServer(refreshedToken);
}
void SendRegistrationToServer(string token)
{
Task.Run(() =>
{
try
{
NotificationHub hub = new NotificationHub(Constants.NotificationHubName, Constants.ListenConnectionString, this.ApplicationContext);
var tags = new List<string>() { };
var registration = hub.Register(token, tags.ToArray());
var regID = registration.RegistrationId;
Log.Debug(TAG, $"Successful registration of ID {regID}");
}
catch (Exception e)
{
}
});
}
}
И, наконец, мой AndroidManifest.xml
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" 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="${applicationId}" />
</intent-filter>
</receiver>
Я в последний раз запускаю службу в MainActivity и получаю токен в консоли при каждом запуске приложения, так что я знаю, что получаю токен,Будем весьма благодарны за любую помощь в понимании того, почему токен идет, когда я закрываю приложение!