2010-04-02 82 views
34

Tengo una aplicación en el sitio de aplicaciones que funciona bien a través del navegador habitual, sin embargo, cuando se usa a través de Android WebView, no puede establecer y leer las cookies. No estoy tratando de obtener cookies "por fuera" de esta aplicación web, por eso, una vez que WebView visita la URL, todos los procesamientos, ids, etc. pueden permanecer allí, todo lo que necesito es administrar la sesión dentro de esa aplicación. La primera pantalla también se carga bien, así que sé que la interactividad del servidor WebView + no está rota.WebView y cookies en Android

Miré la clase WebSettings, no había ninguna llamada como setEnableCookies.

I url de carga así:

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]); 
    } 
    .. 
} 

¿Alguna idea?

+2

¿Está seguro al 100% de que no se trata de que JavaScript esté desactivado de forma predeterminada? –

+2

acabo de comprobar, no lo es. Gracias por el aporte. –

Respuesta

32

me di cuenta de lo que está pasando.

Cuando cargo una página mediante una acción del lado del servidor (una visita a la url) y veo el html devuelto por esa acción dentro de una vista web, esa primera acción/página se ejecuta dentro de esa vista web. Sin embargo, cuando hace clic en cualquier enlace que sea un comando de acción en su aplicación web, estas acciones comienzan un nuevo navegador. Es por eso que la información de cookies se pierde porque la primera información de cookies que ha configurado para Webview se ha ido, aquí tenemos un programa separado.

Tienes que interceptar los clics en Webview para que la navegación nunca salga de la aplicación, todo se mantiene dentro de la misma vista web.

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

Esto soluciona el problema.

+33

En realidad, al anular 'shouldOverrideUrlLoading' para que su' WebView' maneje todos los enlaces URL, simplemente debe 'return false'. No es necesario para 'view.loadUrl (url);'. Devolver verdadero significa en realidad que ** quiere ** que el sistema anule el manejo (probablemente para iniciar un navegador). Entonces, si desea enlaces para abrir en su vista web, simplemente devuelva falso. Fuente: http://developer.android.com/guide/webapps/webview.html#HandlingNavigation –

+3

Incorrecto. Incorrecto. Incorrecto. Turbo tiene razón: NO deberías estar llamando a view.loadUrl() en esta devolución de llamada. –

+4

Correcto o incorrecto, los terceros no deberían realizar cambios fundamentales en el código de una respuesta. Publique su propia respuesta o envíe un comentario crítico si está de acuerdo con él. –

38

Desde el Android documentation:

El CookieSyncManager se utiliza para sincronizar el navegador de cookies tienda entre la memoria RAM y el almacenamiento permanente. Para obtener el mejor rendimiento, las cookies del navegador se guardan en la memoria RAM. Un hilo separado guarda las cookies entre, accionado por un temporizador.

Para utilizar el CookieSyncManager, la aplicación host tiene que llamar al siguiente cuando se inicia la aplicación:

CookieSyncManager.createInstance(context) 

de configurar para sincronización, la aplicación host tiene que llamar

CookieSyncManager.getInstance().startSync() 

en Activity.onResume(), y llamar a

CookieSyncManager.getInstance().stopSync() 

en Activity.onPause().

Para obtener sincronización instantánea en lugar de esperar a que el temporizador para disparar, el anfitrión puede llamar

CookieSyncManager.getInstance().sync() 

El intervalo de sincronización es de 5 minutos, por lo que tendrá que forzar sincroniza manualmente de todos modos, por ejemplo, en onPageFinished (WebView, String). Observe que incluso la sincronización() ocurre de forma asíncrona, por lo tanto, no lo haga de la misma manera en que se está cerrando su actividad .

Finalmente algo como esto debería funcionar:

// 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]); 
+0

Intenté esto, pero no estoy tratando de eliminar las cookies de la vista web. Las cookies pueden desaparecer entre dos llamadas loadUrl separadas de Webview, eso está bien. Mi problema es que las cookies no funcionan "dentro" de la misma sesión. –

+0

salida también esto: http://stackoverflow.com/questions/1652850/android-webview-cookie-problem – Pentium10

+4

Además, es necesario llamar a \t \t \t CookieManager.setAcceptFileSchemeCookies (verdadero) cuando Build.VERSION.SDK_INT> = 12, si usa WebView para referenciar activos almacenados en el sistema de archivos local. Esta llamada debe realizarse ANTES de la primera instanciación de un CookieSyncManager o un CookieManager. –

7

Mi problema es que las cookies no funcionan "dentro" de la misma sesión. -

Burak: tuve el mismo problema. La habilitación de cookies solucionó el problema.

CookieManager.getInstance().setAcceptCookie(true); 
+0

Hola Lucifer Intenté esto pero no puedo almacenar la identificación del correo y los detalles de la contraseña en las cookies. ¿Webview almacena los detalles o no? los pls me ayudan. Cuando ingresé la identificación y pwd por primera vez, estos detalles deben guardarse, cuando voy a iniciar sesión con el mismo ID de usuario y pwd, esos deben almacenarse en cookies y deben mostrarse y luego tengo que seleccionar esa identificación. ¿Es posible en la vista web almacenar detalles en las cocinas o no? Gracias y saludos de antemano. –

+0

también seguí este enlace http://stackoverflow.com/questions/5404274/make-android-webview-not-store-cookies-or-passwords –

+0

Esta sugerencia solucionó mi problema con las cookies perdidas entre los reinicios de la aplicación en Android 2.2.1 – zasadnyy

1

CookieManager.getInstance().setAcceptCookie(true); Normalmente debería funcionar si su vista web ya está inicializado

o intente esto:

CookieSyncManager.createInstance(this); 
CookieManager cookieManager = CookieManager.getInstance(); 
cookieManager.removeAllCookie(); 
cookieManager.setAcceptCookie(true); 
55

Si está utilizando Android Lollipop es decir SDK 21, entonces:

CookieManager.getInstance().setAcceptCookie(true); 

no funcionará. Es necesario utilizar:

CookieManager.getInstance().setAcceptThirdPartyCookies(true); 

me encontré mismo tema y la línea anterior trabajé como un encanto.

+4

Esta respuesta necesita más votos ascendentes – Melllvar

+0

estoy usando minSdk 16, targetsdk 23 y esto no funciona, incluso cuando uso con setAcceptCookie (verdadero). – kommradHomer

+0

¿Cuál es la versión del sistema operativo del dispositivo que está probando esto? –