У меня есть приложение, которое разрешает push-уведомления, и я использую один сигнал с xamarin sdk.
Мое приложение использует prism.forms 7.2 и xamarin.forms 4.3.x
Я хочуНавигация, когда я открываю уведомление, и я разработал некоторый код, но у меня проблема с навигацией. Это не работает, как ожидалось. особенно приложение не работает в фоновом режиме.
Я могу получить push-уведомление, но при открытии уведомление не перемещается, я хочу перейти на главную страницу, а не на страницу сведений о продукте.
не перейдет на нужную страницу.
Вот мой код app.cs
protected override async void OnInitialized()
{
InitializeComponent();
XF.Material.Forms.Material.Init(this);
if (Helpers.AppConstants.DebugMode)
{
// Handle Xamarin Form Logging events such as Binding Errors
Log.Listeners.Add(new Services.TraceLogListener());
}
InitAkavache();
InitGoogleAnalytics();
OneSignal.Current.StartInit(Helpers.AppConstants.OneSignalKey)
.Settings(new Dictionary<string, bool>()
{
{IOSSettings.kOSSettingsKeyAutoPrompt, false },
{IOSSettings.kOSSettingsKeyInAppLaunchURL, true },
})
.InFocusDisplaying(OSInFocusDisplayOption.Notification)
.UnsubscribeWhenNotificationsAreDisabled(true)
.HandleNotificationReceived((result) => HandleNotificationReceived(result))
.HandleNotificationOpened((result) => HandleNotificationOpened(result))
.EndInit();
if (!IsNotification)
{
await NavigationService.NavigateAsync(Screens.SplashScreenPage);
}
else
{
IsNotification = false;
}
}
private void HandleNotificationOpened(OSNotificationOpenedResult result)
{
IsNotification = true;
OSNotificationPayload payload = result.notification.payload;
Dictionary<string, object> additionalData = payload.additionalData;
if (additionalData.ContainsKey("type") && additionalData.ContainsKey("product"))
{
var productId = Convert.ToString(additionalData["product"]);
var id = Convert.ToInt64(productId);
NavigationService.NavigateAsync($"myapp:///{Screens.NavigationPage}/{Screens.MainTabbedPage}?{Prism.Navigation.KnownNavigationParameters.SelectedTab}={Screens.MainPage}", ("productId", id)).GetAwaiter().GetResult();
return;
}
else if (additionalData.ContainsKey("type") && additionalData.ContainsKey("category"))
{
var categoryId = Convert.ToString(additionalData["category"]);
var id = Convert.ToInt32(categoryId);
NavigationService.NavigateAsync($"myapp:///{Screens.NavigationPage}/{Screens.MainTabbedPage}?{Prism.Navigation.KnownNavigationParameters.SelectedTab}={Screens.MainPage}", ("categoryId", id)).GetAwaiter().GetResult();
return;
}
else if (additionalData.ContainsKey("type") && Convert.ToString(additionalData["type"]) == "open")
{
NavigationService.NavigateAsync($"myapp:///{Screens.NavigationPage}/{Screens.MainTabbedPage}?{KnownNavigationParameters.SelectedTab}={Screens.MainPage}").GetAwaiter().GetResult();
return;
}
else if (additionalData.ContainsKey("type") && additionalData.ContainsKey("coupon"))
{
IsNotification = false;
var coupon = Convert.ToString(additionalData["coupon"]);
if (!string.IsNullOrWhiteSpace(coupon))
{
Xamarin.Essentials.Clipboard.SetTextAsync(coupon).GetAwaiter().GetResult();
}
return;
}
}
private void HandleNotificationReceived(OSNotification notification)
{
OSNotificationPayload payload = notification.payload;
string message = payload.body;
Dictionary<string, object> additionalData = payload.additionalData;
if (additionalData != null && additionalData.ContainsKey("type"))
{
var item = new Data.Entity.Notification
{
Title = notification.payload.title,
SubTitle = notification.payload.subtitle,
Body = notification.payload.body,
AdditionalData = additionalData.Select(s => new Data.Entity.AdditionalData
{
Type = s.Key,
Value = Convert.ToString(s.Value)
}).ToList()
};
if (additionalData.ContainsKey("product"))
{
item.Type = Enums.NotificationType.Product;
}
else if (additionalData.ContainsKey("category"))
{
item.Type = Enums.NotificationType.Category;
}
else if (Convert.ToString(additionalData["type"]) == "open")
{
item.Type = Enums.NotificationType.Open;
}
else if (additionalData.ContainsKey("coupon"))
{
item.Type = Enums.NotificationType.Coupon;
}
else
{
item.Type = Enums.NotificationType.Unknown;
}
using (var notificationService = new NotificationLiteDbService())
{
notificationService.CreateItem(item);
}
}
}
РЕДАКТ. 1:
Если приложение работает на переднем плане илифон, я могу получать уведомления и перемещаться. Но если приложение закрывается, я могу получить уведомление, но не могу ориентироваться.