WebView и файлы cookie на Android - PullRequest
48 голосов
/ 02 апреля 2010

У меня есть приложение в appspot, которое отлично работает через обычный браузер, однако при использовании через Android WebView оно не может устанавливать и читать файлы cookie. Я не пытаюсь получить cookie-файлы «вне» этого веб-приложения. Кстати, после того, как 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]);
  }
  .. 
}

Есть идеи?

Ответы [ 5 ]

79 голосов
/ 05 мая 2015

Если вы используете Android Lollipop, то есть SDK 21, то:

CookieManager.getInstance().setAcceptCookie(true);

не будет работать. Вам необходимо использовать:

CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);

Я столкнулся с той же проблемой, и вышеприведенная строка работала как заклинание.

40 голосов
/ 02 апреля 2010

Из документации Android :

CookieSyncManager используется для синхронизации хранилища cookie браузера между оперативной и постоянной памятью.Для достижения максимальной производительности куки браузера сохраняются в оперативной памяти.Отдельный поток сохраняет куки между, управляемый таймером.

Чтобы использовать CookieSyncManager, приложение хоста должно вызывать следующее при запуске приложения:

CookieSyncManager.createInstance(context)

Чтобы настроить синхронизацию, приложение хоста должно вызвать

CookieSyncManager.getInstance().startSync()

в Activity.onResume () и вызов

 CookieSyncManager.getInstance().stopSync()

в Activity.onPause ().

Чтобы получить мгновенную синхронизацию вместо ожидания срабатывания таймера,хост может вызывать

CookieSyncManager.getInstance().sync()

Интервал синхронизации составляет 5 минут, поэтому вы все равно захотите принудительно выполнить синхронизацию, например, в onPageFinished (WebView, String).Обратите внимание, что даже синхронизация () происходит асинхронно, поэтому не делайте этого, просто когда ваша деятельность отключается.

Наконец-то должно сработать что-то вроде этого:

// 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]);
35 голосов
/ 02 апреля 2010

Я понял, что происходит.

Когда я загружаю страницу через действие на стороне сервера (посещение URL-адреса) и просматриваю HTML, возвращенный из этого действия в веб-представлении, первое действие / страница запускается внутри этого веб-представления. Однако, когда вы нажимаете на любую ссылку, которая является командой действия в вашем веб-приложении, эти действия запускают новый браузер . Вот почему информация о файлах 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]);

Это решает проблему.

7 голосов
/ 02 декабря 2011

Моя проблема в том, что куки не работают "внутри" одного и того же сеанса. -

Бурак: У меня была такая же проблема. Включение куки решило проблему.

CookieManager.getInstance().setAcceptCookie(true);
1 голос
/ 30 ноября 2014

CookieManager.getInstance().setAcceptCookie(true); Обычно это должно работать, если ваше веб-представление уже инициализировано

или попробуйте это:

CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
cookieManager.setAcceptCookie(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...