Формы Xamarin с использованием плагина FirebasePushNotificationPlugin с Autofac и оболочкой не могут отображать элементы пользовательского интерфейса или перенаправлять

# #xamarin #xamarin.forms #firebase-cloud-messaging

Вопрос:

У меня возникла проблема, которую я пытался решить разными способами, но безуспешно. Всякий раз, когда вы получаете сообщение через CrossFirebasePushNotification.Текущий.OnNotificationReceived Я получаю полезную нагрузку и могу ее прочитать, но я не могу сделать ничего «визуального» в своем приложении. Другими словами, я получаю уведомление, но когда я хочу либо перенаправить на другую страницу, либо даже отобразить сообщение DisplayAlert, ничего не происходит. Центр сообщений может быть получен, но любые инструкции в рамках процедуры, связанные с перенаправлением или отображением (что-либо, изменяющее пользовательский интерфейс, который он отображает), выполняться не будут. Ищу помощь в том, как визуально показать в приложении, что пользователь получил сообщение.

Это в файле MainShell.xaml.cs (я также поместил его в App.xaml.cs тоже):

 CrossFirebasePushNotification.Current.OnNotificationReceived  = (s, p) =>
 

{

         System.Diagnostics.Debug.WriteLine("Received");  // this works
        foreach (var data in p.Data)
        {
            System.Diagnostics.Debug.WriteLine($"{data.Key} : {data.Value}"); // this works
        }

        //TODO:  Code to determine if user is signed in
        if (true)
        {
            System.Diagnostics.Debug.WriteLine("Debug:  Goto Registration page from MainShell"); // this works
            //Task.Run(async () => await Shell.Current.GoToAsync("registration"));  // this does not work (just ignores it and doesn't fire constructor)                    
            //Task.Run(async () => await Current.DisplayAlert("Request Received", "A message is waiting...", "Ok"));  // this does not work
            MessagingCenter.Send(this, "RequestReceived"); // this works, the receiver will display debug info, but will not redirect nor display any UI messages or interact with the UI.

        }

    };
 

Спасибо вам за любую помощь или руководство,

Роберт

Комментарии:

1. вам необходимо использовать MainThread, чтобы убедиться, что операции пользовательского интерфейса выполняются в потоке пользовательского интерфейса. Смотрите документы Xamarin Essentials

2. Спасибо за предупреждение, я только что обнаружил это решение вскоре после этого. Приятно знать, что я двигался в правильном направлении. Добавил его в App.xaml.cs, и все работает так, как ожидалось.