Файлы cookie Xamarin forms WebView удаляются при закрытии приложения

#xamarin #xamarin.forms #xamarin-studio

Вопрос:

У меня есть приложение Xamarin Forms WebView для Android. Я могу прекрасно использовать приложение при первом входе в систему. Но если я снова открою файлы cookie веб-просмотра приложения, и пользователю потребуется снова войти в систему. Я хочу, чтобы пользователю не нужно было входить в систему после того, как он вошел в систему один раз, даже если он закроет приложение. Вот мой код:

 var wbURL = "https://www.example.com/login/";  webrowser.Source = wbURL;  

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

1. Я также добавил возможное решение для Android. Используете ли вы пользовательские средства визуализации для своего веб-представления? Вы запускаете в них какой-то код, который может повлиять на сохраняемость файлов cookie?

2. В приложении предоставьте пользователю возможность выйти из системы, а затем снова войти в систему — без закрытия веб-представления или приложения. Это делается для того, чтобы убедиться, что не сервер делает файлы cookie недействительными. Если это не удается, то это не webview — сервер не распознает, что файлы cookie все еще действительны. если это удастся, то действительно каким-то образом webview или приложение удаляют их, как вы в настоящее время подозреваете.

Ответ №1:

На Android файлы cookie должны храниться автоматически, если вы не удалите их вручную с помощью пользовательского средства визуализации.

Для iOS вы можете сохранять файлы cookie и восстанавливать их позже, примерно так:

Сохраните файлы cookie (Вызовите этот метод после входа пользователя в систему, этот код будет помещен в пользовательский визуализатор WebView):

 public async Task SaveCookies() {  // For iOS lt; 10, cookies are saved in NSHTTPCookieStorage.sharedHTTPCookieStorage(), coojies should work withouth this  if (!UIDevice.CurrentDevice.CheckSystemVersion(11, 0))  {  return;  }   try  {  var cookies = await Configuration.WebsiteDataStore.HttpCookieStore.GetAllCookiesAsync();  var cachedCookies = cookies.Select(c =gt; new Cookie(c.Name, c.Value, c.Path, c.Domain)  {  Secure = c.IsSecure,  Version = Convert.ToInt32(c.Version)  }).ToList();   //TODO: Save the cachedCookies into app cache. You can create a service in the shared project  }  catch (Exception e)  {    } }  

Восстановление файлов cookie (Вызовите это в методе OnElementChanged пользовательского средства визуализации WebView):

 var store = WKWebsiteDataStore.NonPersistentDataStore; await RestoreCookies(store);  private async Task RestoreCookies(WKWebsiteDataStore store) {  // For iOS lt; 10, cookies are saved in NSHTTPCookieStorage.sharedHTTPCookieStorage(), coojies should work withouth this  if (!UIDevice.CurrentDevice.CheckSystemVersion(11, 0))  {  return;  }   if (store == null)  {  return;  }   await ClearCookies(store);  var storedCookies = //TODO: Retreive cookies from where you sotred them   foreach (Cookie cookie in storedCookies)  {  await store.HttpCookieStore.SetCookieAsync(new NSHttpCookie(cookie));  } }  private async Task ClearCookies(WKWebsiteDataStore store) {  var cookies = await store.HttpCookieStore.GetAllCookiesAsync();  if (cookies?.Any() ?? false)  {  foreach (NSHttpCookie cookie in cookies)  {  await store.HttpCookieStore.DeleteCookieAsync(cookie);  }  } }  

Редактировать: Если у вас также возникли проблемы с Android, попробуйте этот код в своем пользовательском рендере WebView:

 var cookieManager = CookieManager.Instance;  cookieManager.SetAcceptCookie(true);  cookieManager.AcceptCookie();  cookieManager.Flush(); // Forces cookie sync  

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

1. ПРИМЕЧАНИЕ: ОП говорит, что у них возникла эта проблема на Android . Я не знаком с webview — у вас есть какие-либо идеи, что может быть не так? Или добавьте комментарии к вопросу о другой информации, которую вы могли бы предоставить, чтобы помочь понять, что происходит?

2. Ах да, я неправильно понял. Я работал с веб-просмотром, и у меня никогда раньше не было проблем с сохранением файлов cookie на Android. Я отредактирую сообщение с помощью некоторого кода, спасибо!