Push-уведомление FCM для Android (Xamarin) OnRefreshToken не вызывается, но токен аннулирован

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

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

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

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

        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.

Имеет ли это смысл?

Привет, @Buschi Добро пожаловать в StackOverflow. Прочтите руководство по Как задать хороший вопрос по стеку, чтобы понять, как задать лучший вопрос. Пожалуйста, добавьте код к вашему вопросу

FreakyAli 30.10.2018 10:41

@Buschi Я не рекомендую использовать плагины для важных функций. Прочтите документацию Xamarin, как реализовать push-уведомления для iOS и Android с кодом платформы. Будет проще отлаживать, иначе вы полагаетесь на создателя плагина, чтобы исправить какие-либо проблемы или обновить его в случае, если iOS и / или Android изменят что-либо, касающееся работы push-уведомлений. Вот хороший учебник по push-уведомлениям, но я не думаю, что он учитывает создание каналов уведомлений для Android, начиная с Oreo, но вы можете найти это: youtube.com/watch?v=le2lDY22xwM&t=4s

Razvan Emil 08.11.2018 00:15

@Buschi, вы пытались принудительно обновить токен, удалив текущий экземпляр firebase в режиме отладки?

Razvan Emil 08.11.2018 00:23
0
3
587
1

Ответы 1

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

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

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

в Android без каких-либо XamarinForms (то есть без dependencyServices).

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

Другие вопросы по теме