Я не знаю, какова ваша настоящая реализация Firebase, но это может вам помочь.
В Xamarin Forms есть хороший пакет для Firebase
, который мы используем в нашем производственном приложении, разработанном командой CrossGeeks. Он отлично работает и имеет все handlers
для ваших нужд. Это работает с iOS и Android, и вам не нужно писать код для конкретной платформы, только конфигурацию и некоторый код в AppDelegate.cs
и MainActivity.cs
https://github.com/CrossGeeks/FirebasePushNotificationPlugin/blob/master/docs/FirebaseNotifications.md#notification-events
Я написал простой PushNotificationService, который обрабатывает автоматическое обновление и / или загружает новые страницы с учетом данных push-уведомлений.
Когда приложение закрывается и пользователь нажимает на уведомление, я сохраняю данные push-уведомления, используя Akavache .
CrossFirebasePushNotification.Current.OnNotificationOpened += async (s, p) =>
{
if (App.AppBeenResumed)
{
await BlobCache.UserAccount.InsertObject("pushNotifData", p.Data);
}
else
{
await ProcessReceivedPushNotification(p.Data);
}
};
И на целевой странице приложения я проверяю, существуют ли в методе OnAppearing
страницы существующие данные push-уведомлений.
protected override void OnAppearing()
{
base.OnAppearing();
App.AppBeenResumed = false;
HandlePushNotificationIfExists();
}
private async void HandlePushNotificationIfExists()
{
IDictionary<string, object> pushNotifData;
try
{
pushNotifData = await BlobCache.UserAccount.GetObject<IDictionary<string, object>>("pushNotifData");
}
catch (KeyNotFoundException)
{
pushNotifData = null;
}
if (pushNotifData == null) return;
await BlobCache.UserAccount.InvalidateAllObjects<IDictionary<string, object>>();
await PushNotificationService.ProcessReceivedPushNotification(pushNotifData);
}
В ProcessReceivedPushNotification
вы можете делать все, что захотите ... прямо нажимать на страницу или как угодно ... вызывать другую службу, которая выполнит работу по переносу новой страницы и некоторого бизнес-процесса.
Обратите внимание, что App.AppBeenResumed
является статическим логическим параметром, определяющим, было ли приложение запущено или возобновлено для правильной обработки процесса обработки push-уведомления (обработайте его мгновенно или сохраните в blobcache для его обработки). позже, когда появится целевая страница).
In MainActivity.cs
:
protected override void OnCreate(Bundle bundle)
{
...
LoadApplication(new App(true));
}
В App.cs
:
public App(bool beenResumedOrStarted)
{
...
AppBeenResumed = beenResumedOrStarted;
...
}
protected override void OnResume()
{
AppBeenResumed = false;
}
protected override void OnSleep()
{
//iOS states are not the same so always false when device is iOS
AppBeenResumed = Device.RuntimePlatform != Device.iOS;
}