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);