у нас есть приложение 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 Я не рекомендую использовать плагины для важных функций. Прочтите документацию Xamarin, как реализовать push-уведомления для iOS и Android с кодом платформы. Будет проще отлаживать, иначе вы полагаетесь на создателя плагина, чтобы исправить какие-либо проблемы или обновить его в случае, если iOS и / или Android изменят что-либо, касающееся работы push-уведомлений. Вот хороший учебник по push-уведомлениям, но я не думаю, что он учитывает создание каналов уведомлений для Android, начиная с Oreo, но вы можете найти это: youtube.com/watch?v=le2lDY22xwM&t=4s
@Buschi, вы пытались принудительно обновить токен, удалив текущий экземпляр firebase в режиме отладки?
пока приложение работало, все работало нормально, только не пока оно не работало.
Кажется, что служба может выполнять код Android только без XamarinForms. Мы решили это, реализовав
CrossPushNotification.Current.OnTokenRefresh += (s, p) =>
{
SendToken(p.Token);
};
в Android без каких-либо XamarinForms (то есть без dependencyServices).
Спасибо за ответ.
Привет, @Buschi Добро пожаловать в StackOverflow. Прочтите руководство по Как задать хороший вопрос по стеку, чтобы понять, как задать лучший вопрос. Пожалуйста, добавьте код к вашему вопросу