Xamarin Android Firebase с Центром уведомлений Azure, ключ регистрации становится недействительным при закрытии приложения - PullRequest
0 голосов
/ 16 января 2019

Мое приложение получит одно уведомление, прежде чем токен регистрации 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 и получаю токен в консоли при каждом запуске приложения, так что я знаю, что получаю токен,Будем весьма благодарны за любую помощь в понимании того, почему токен идет, когда я закрываю приложение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...