Хранилище сеансов Webview теряется при переходе между страницами Xamarin

#xamarin #xamarin.forms

#xamarin #xamarin.forms

Вопрос:

У меня есть Xamarin.Формирует приложение с двумя страницами, одна из которых содержит WebView, а другая — просто текст.

Хранилище сеансов теряло данные при переходе между страницами.

//APage.xaml

 <WebView x:Name="webView" WidthRequest="1000" HeightRequest="1000" Navigated="webView_Navigated">
  <WebView.Source>
    <UrlWebViewSource />
  </WebView.Source>
</WebView>
 

//BPage.xaml

 <Span Text="Hi B Page"/>
 

//APage.xaml.cs

 ...

 public BPage()
  {
            InitializeComponent();

            (webView.Source as UrlWebViewSource).Url = "mytestsite.com";

  }

private async void webView_Navigated(object sender, WebNavigatedEventArgs e)
  {
            var webView = sender as WebView;
          
            var token = await webView.EvaluateJavaScriptAsync("window.sessionStorage.getItem('token')");

            System.Console.WriteLine(token); //Every time I Go to BPage and back, it is null.
  }
 

Мой веб-сайт возвращает ошибку «Токен не найден в sessionstorage».

Ответ №1:

// Каждый раз, когда я перехожу на страницу B и обратно, оно равно нулю.

Когда вы navigate from B to A , страница B будет выпущена, и каждый раз, когда вы navigate from A to B , вы переходите на новую страницу (не одну и ту же страницу каждый раз).

Каждый используемый вами веб-просмотр находится на другой странице B, и именно поэтому вы получаете null.

Вот документ о навигации.

Вы можете использовать Xamarin.Основы: настройки для сохранения токена в приложениях.

Сохранить:

 Preferences.Set("my_key", "my_value");
 

Читать:

 var myValue = Preferences.Get("my_key", "default_value");
 

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

1. При навигации я использую AppShell.xaml или Shell.Current.GoToAsync . Тогда он не создает экземпляр новой страницы. Он использует ту же страницу. (точка останова в конструкторе просто останавливается один раз. Я обнаружил проблему в github, которая указывает, что это ошибка в github.com/xamarin/Xamarin . Формы / проблемы /9073

2. Настройки. Set не работает, потому что sessionstorage остается внутри webview.

3. Меняется ли токен каждый раз? Вы можете получить токен и сохранить его с настройками. Устанавливается при выходе со страницы.

4. Как я могу установить токен в webview? Я считаю, что с помощью javascript, но это не кажется правильным способом сделать это. в дополнение к токену в хранилище сеансов есть другие данные, такие как токен обновления, утверждения, имя пользователя, лицензия и т. Д. Xamarin не должен удалять хранилище сеансов при переходе между страницами.

5. Ваш случай отличается от проблемы в ссылке проблема при переходе между страницами. Переход к новой страницеb, вероятно, создает новую страницу вместо использования старой страницы. Вы тестируете на Android или iOS?