Android (Xamarin) FCM Push-уведомление OnRefreshToken не вызывается, но токен становится недействительным - PullRequest
0 голосов
/ 30 октября 2018

у нас есть кроссплатформенное приложение (Xamarin). Для push-уведомлений мы используем Plugin.PushNotification 1.3.0. На iOS все вроде работает абсолютно нормально. Но на Android у нас иногда возникает проблема: наш регистрационный идентификатор становится недействительным или, по крайней мере, кажется, что это так Когда наш сервер отправляет сообщение в FCM, мы получаем ответ, что регистрационный идентификатор больше не зарегистрирован. Это происходит только с некоторыми устройствами. И время истечения не имеет смысла, потому что в одном случае оно произошло через 3 дня.

Не было также события OnTokenRefresh. Мы всегда отправляем текущий идентификатор на сервер при открытии приложения и, конечно, если будет запущен OnTokenRefresh.

Кто-нибудь имеет идею или хотя бы знает проблему? Что произойдет, если приложение будет закрыто, а идентификатор был признан недействительным по какой-либо причине? Или может быть отношение к Android Oreo? Мы пытаемся проверить, но на данный момент кажется, что это происходит только с последними устройствами.

Мы немного сузили проблему. В Android событие называется, но не в формах Xamarin. Так что это работает:

        public override void OnCreate()
        {
            base.OnCreate();

            AppContext = this.ApplicationContext;

            if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
            {
                PushNotificationManager.DefaultNotificationChannelId = "myEvents";
                PushNotificationManager.DefaultNotificationChannelName = "myChannel";
            }

            PushNotificationManager.SoundUri = Uri.Parse($"{ContentResolver.SchemeAndroidResource}://{AppContext.PackageName}/raw/alarm");

            // this seems to get called
            CrossPushNotification.Current.OnTokenRefresh += (s, p) =>
            {
                System.Diagnostics.Debug.WriteLine($"TOKEN : {p.Token}");
            };


    #if DEBUG
            PushNotificationManager.Initialize(this, true);
    #else
                  PushNotificationManager.Initialize(this,false);
    #endif
        }

А это OnTokenRefresh не делает:

    public partial class App : Application
{
    public new static App Current;
    public App()
    {
        InitializeComponent();
        Current = this;

        MainPage = new MainPage();
        var crossPushListener = CrossPushNotificationListener.Instance;
    }
}

CrossPushNotificationListener:

namespace MobileApp1
{
    public class CrossPushNotificationListener
    {
        private static CrossPushNotificationListener _instance;

        public static CrossPushNotificationListener Instance
        {
            get { return _instance ?? (_instance = new CrossPushNotificationListener()); }
            private set { _instance = value; }
        }

        public CrossPushNotificationListener()
        {
            CrossPushNotification.Current.OnTokenRefresh += OnTokenRefreshNotify;
        }

        // this function is not executed. Does that make sense?
        private async void OnTokenRefreshNotify(object sender, PushNotificationTokenEventArgs args)
        {
            System.Diagnostics.Debug.WriteLine($"TOKEN : {args.Token}");
            Upload(args.Token);
        }
    }
}

Пока приложение работает, оба работают. Но если приложение закрыто, выполняется только код Android.

Имеет ли это какой-то смысл?

1 Ответ

0 голосов
/ 08 ноября 2018

, пока приложение работало, все работало нормально, просто нет, пока оно не работало.

Похоже, что сервис может выполнять только код Android без XamarinForms. Мы решили это путем реализации

        CrossPushNotification.Current.OnTokenRefresh += (s, p) =>
        {
            SendToken(p.Token);
        };

в Android без каких-либо XamarinForms (поэтому также нет зависимости от сервисов).

Спасибо за отзыв.

...