Android 上的 WebView 和 Cookie

2022-08-31 16:29:51

我在appspot上有一个应用程序,可以通过常规浏览器正常工作,但是当通过Android WebView使用时,它无法设置和读取cookie。我不是试图在这个Web应用程序BTW的“外部”获取cookie,一旦WebView访问了URL,所有处理,ID等都可以留在那里,我所需要的只是该应用程序内部的会话管理。第一个屏幕加载也很好,所以我知道WebView +服务器交互性没有被破坏。

我看了WebSettings类,没有像setEnableCookies这样的调用。

我加载网址是这样的:

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

如果您使用的是Android Lollipop,即SDK 21,那么:

CookieManager.getInstance().setAcceptCookie(true);

不起作用。您需要使用:

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

我遇到了同样的问题,上面的线作为一个魅力。


答案 2

来自安卓文档

用于在 RAM 和永久存储之间同步浏览器 Cookie 存储。为了获得最佳性能,浏览器 Cookie 保存在 RAM 中。一个单独的线程保存之间的 cookie,由计时器驱动。CookieSyncManager

要使用 ,主机应用程序必须在应用程序启动时调用以下命令:CookieSyncManager

CookieSyncManager.createInstance(context)

若要设置同步,主机应用程序必须调用

CookieSyncManager.getInstance().startSync()

in Activity.onResume(), 并调用

 CookieSyncManager.getInstance().stopSync()

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

推荐