WebView и Cookies на Android
У меня есть приложение на appspot, которое отлично работает через обычный браузер, однако при использовании через Android WebView он не может устанавливать и читать файлы cookie. Я не пытаюсь получить файлы cookie "за пределами" этого веб-приложения BTW, как только URL-адрес посетит WebView, вся обработка, идентификаторы и т.д. Могут остаться там, все, что мне нужно, - это управление сеансом внутри этого приложения. Первый экран также загружается отлично, поэтому я знаю, что интерактивность WebView + не нарушена.
Я просмотрел класс WebSettings, не было вызова типа setEnableCookies.
Я загружаю url следующим образом:
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webview = new WebView(this);
setContentView(webview);
webview.loadUrl([MY URL]);
}
..
}
Любые идеи?
Ответы
Ответ 1
Я понял, что происходит.
Когда я загружаю страницу с помощью действия на стороне сервера (URL-адрес) и просматриваю html, возвращенный из этого действия внутри Webview, это первое действие/страница выполняется внутри этого Webview. Однако, когда вы нажимаете на любую ссылку, которая является командами действий в вашем веб-приложении, эти действия запускают новый браузер. Вот почему информация о файлах cookie теряется, потому что первая информация о cookie, которую вы установили для Webview, ушла, у нас есть отдельная программа.
Вы должны перехватывать клики по Webview, чтобы браузер никогда не покидал приложение, все остается в одном и том же Webview.
WebView webview = new WebView(this);
webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url); //this is controversial - see comments and other answers
return true;
}
});
setContentView(webview);
webview.loadUrl([MY URL]);
Это устраняет проблему.
Ответ 2
Если вы используете Android Lollipop i.e SDK 21, то:
CookieManager.getInstance().setAcceptCookie(true);
не будет работать. Вам необходимо использовать:
CookieManager.getInstance().setAcceptThirdPartyCookies(true);
Я столкнулся с той же проблемой, и вышеприведенная строка работала как прелесть.
Ответ 3
Из Документация для Android:
CookieSyncManager
используется для синхронизации файлов cookie браузера хранить между ОЗУ и постоянным хранилищем. Чтобы получить максимальную производительность, куки файлы браузера сохраняются в ОЗУ. Отдельная нить сохраняет файлы cookie между, управляемым таймером.
Чтобы использовать CookieSyncManager
, хост-приложение должно вызвать после запуска приложения:
CookieSyncManager.createInstance(context)
Чтобы настроить синхронизацию, хост-приложение должно вызвать
CookieSyncManager.getInstance().startSync()
в Activity.onResume() и вызовите
CookieSyncManager.getInstance().stopSync()
в Activity.onPause().
Чтобы получить мгновенную синхронизацию вместо ожидания запуска таймера, хост может вызвать
CookieSyncManager.getInstance().sync()
Интервал синхронизации составляет 5 минут, поэтому вы хотите принудительно синхронизировать вручную в любом случае, например, в onPageFinished (WebView, String). Заметка что даже sync() происходит асинхронно, поэтому не делайте этого так же, как ваш активность закрывается.
Наконец-то должно получиться что-то вроде этого:
// use cookies to remember a logged in status
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
WebView webview = new WebView(this);
webview.getSettings().setJavaScriptEnabled(true);
setContentView(webview);
webview.loadUrl([MY URL]);
Ответ 4
Моя проблема заключается в том, что файлы cookie не работают "внутри" того же сеанса. -
Бурак: У меня была такая же проблема. Включение cookie исправило проблему.
CookieManager.getInstance().setAcceptCookie(true);
Ответ 5
CookieManager.getInstance().setAcceptCookie(true);
Обычно он должен работать, если ваш веб-просмотр уже инициализирован
или попробуйте следующее:
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
cookieManager.setAcceptCookie(true);