#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. Я отредактирую сообщение с помощью некоторого кода, спасибо!