У меня есть приложение на appspot, который хорошо работает через регулярный браузер, однако при использовании через веб-представление Android это не может установить и считать cookie. Я не пытаюсь получить cookie "вне" этого веб-приложения BTW, когда-то URL посещает веб-представление, вся обработка, идентификаторы, и т.д. может остаться там, все, в чем я нуждаюсь, управление сеансами в том приложении. Сначала экран также загружается прекрасный, таким образом, я знаю веб-представление +, интерактивность сервера не повреждается.
Я посмотрел на класс 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]);
}
..
}
Какие-либо идеи?
Я понял, что происходит.
Когда я загружаю страницу через действие на стороне сервера (посещение 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]);
Это устраняет проблему.
Из документации Android :
CookieSyncManager
используется для синхронизации хранилища файлов cookie браузера между ОЗУ и постоянным хранилищем. Для обеспечения максимальной производительности файлы 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]);