у нас есть кроссплатформенное приложение (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.
Имеет ли это какой-то смысл?