2010-04-02 13 views
34

Mam aplikację na appspot, która działa dobrze przez zwykłą przeglądarkę, jednak gdy jest używana przez Android WebView, nie może ustawić ani odczytać plików cookie. Nie próbuję ciasteczek "na zewnątrz" tej aplikacji internetowej BTW, kiedy URL jest odwiedzany przez WebView, wszystkie przetwarzanie, identyfikatory itp. Mogą pozostać tam, wszystko czego potrzebuję to zarządzanie sesją wewnątrz tej aplikacji. Pierwszy ekran również ładuje się dobrze, więc wiem, że interaktywność serwera WebView + nie jest zepsuta.WebView i pliki Cookie na Androidzie

Zajrzałem do klasy WebSettings, nie było połączenia typu setEnableCookies.

załadować url tak:

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

Jakieś pomysły?

+2

Czy jesteś w 100% pewien, że nie ma to związku z wyłączeniem JavaScript? –

+2

Właśnie sprawdziłem, nie jest. dzięki za wejście. –

Odpowiedz

32

zorientowali się, co się dzieje.

Po załadowaniu strony przez akcję po stronie serwera (wizyta URL) i wyświetleniu html zwróconemu z tej akcji w widoku Web, ta pierwsza akcja/strona jest uruchamiana wewnątrz tej przeglądarki. Jednak po kliknięciu dowolnego łącza, które są poleceniami akcji w aplikacji internetowej, te działania rozpoczynają nową przeglądarkę. Dlatego informacje o plikach cookie zostają utracone, ponieważ pierwsza informacja cookie ustawiona dla Webview zniknęła, mamy tutaj osobny program.

Musisz przechwytywać kliknięcia w Webview, aby przeglądanie nigdy nie opuszczało aplikacji, wszystko pozostaje w tym samym widoku.

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

Rozwiązuje to problem.

+33

Właściwie podczas przesuwania 'shouldOverrideUrlLoading', aby twój' WebView' obsługiwał wszystkie łącza URL, powinien po prostu 'return false'. Nie ma potrzeby stosowania 'view.loadUrl (url);'. Zwracanie wartości true oznacza, że ​​** chcesz **, aby system nadpisał obsługę (prawdopodobnie w celu uruchomienia przeglądarki). Jeśli chcesz, aby linki otwierały się w twojej przeglądarce, po prostu zwróć false. Źródło: http://developer.android.com/guide/webapps/webview.html#HandlingNavigation –

+3

Niepoprawnie. Źle. Źle. Turbo ma rację: absolutnie NIE powinieneś wywoływać view.loadUrl() w tym wywołaniu. –

+4

Prawo lub zła, osoby trzecie nie powinny wprowadzać zasadniczych zmian w kodzie odpowiedzi. Opublikuj własną odpowiedź lub przekaż krytyczny komentarz, jeśli się z tym zgadzasz. –

38

Z Android documentation:

The CookieSyncManager służy do synchronizacji przeglądarki ciasteczko sklep między RAM i trwałego składowania. Aby uzyskać najlepszą wydajność, pliki cookie przeglądarki są zapisywane w pamięci RAM. Oddzielny wątek zapisuje pliki cookie między sterowanymi przez zegar.

Aby użyć CookieSyncManager, aplikacja hosta musi wywołać następujące po uruchomieniu aplikacji:

CookieSyncManager.createInstance(context) 

Aby skonfigurować do synchronizacji, aplikacja hosta musi zadzwonić

CookieSyncManager.getInstance().startSync() 

w Activity.onResume() i zadzwoń pod numer

CookieSyncManager.getInstance().stopSync() 

w Activity.onPause().

Aby uzyskać natychmiastową synchronizację zamiast czekać na zegarze na spust, gospodarz mogą dzwonić

CookieSyncManager.getInstance().sync() 

Interwał synchronizacji wynosi 5 minut, więc będziemy chcieli zmusić synchronizuje ręcznie i tak, na przykład w onPageFinished (WebView, String). Uwaga: , że nawet synchronizacja() odbywa się asynchronicznie, więc nie rób tego tak jak wyłączanie aktywności .

Wreszcie coś jak to powinno działać:

// 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

Próbowałem tego, ale nie próbuję wyrzucać ciasteczek ze strony internetowej. Pliki cookie mogą znikać między dwoma osobnymi wywołaniami loadUrl wywołań w przeglądarce. Mój problem polega na tym, że pliki cookie nie działają "w" tej samej sesji. –

+0

Zapoznaj się również w ten sposób: http://stackoverflow.com/questions/1652850/android-webview-cookie-problem – Pentium10

+4

Ponadto trzeba zadzwonić \t \t \t CookieManager.setAcceptFileSchemeCookies (prawda), gdy Build.VERSION.SDK_INT> = 12, jeśli używasz WebView do odniesienia zasobów przechowywanych w lokalnym systemie plików. To wywołanie musi poprzedzać pierwsze wystąpienie CookieSyncManager lub CookieManager. –

7

Mój problem polega na tym, że pliki cookie nie działają "w" tej samej sesji. -

Burak: Miałem ten sam problem. Włączenie obsługi plików cookie naprawiło problem.

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

Cześć Lucyfer Próbowałem tego, ale nie jestem w stanie przechowywać identyfikatora i hasła w plikach cookie. Czy przeglądarka przechowuje szczegółowe informacje, czy nie? proszę pomóż mi. Kiedy po raz pierwszy wprowadzam id i pwd, te szczegóły powinny zostać zapisane, kiedy mam się zalogować przy użyciu tego samego identyfikatora użytkownika i pwd, które powinny być przechowywane w ciasteczkach i powinny zostać wyświetlone, a następnie muszę wybrać ten identyfikator. Czy w widoku internetowym jest możliwe zapisywanie szczegółów w kuchniach, czy nie? Dzięki i pozdrawiam z góry. –

+0

Podążałem także za tym linkiem http://stackoverflow.com/questions/5404274/make-android-webview-not-store-cookies-lub-passwords –

+0

Ta sugestia naprawiła mój problem z zagubionymi ciasteczkami pomiędzy ponownymi uruchomieniami aplikacji w systemie Android 2.2.1 – zasadnyy

1

CookieManager.getInstance().setAcceptCookie(true); Normalnie powinno działać, jeśli WebView jest już zainicjowany

lub spróbuj tego:

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

Jeśli używasz Android Lollipop czyli SDK 21, a następnie:

CookieManager.getInstance().setAcceptCookie(true); 

nie będzie działać. Musisz użyć:

CookieManager.getInstance().setAcceptThirdPartyCookies(true); 

Wpadłem na ten sam problem, a powyższa linia działała jako urok.

+4

Ta odpowiedź wymaga więcej upvotes – Melllvar

+0

Używam minSdk 16, targetsdk 23 i to nie działa, nawet gdy używam z setAcceptCookie (true). – kommradHomer

+0

Jaka jest wersja systemu operacyjnego urządzenia, które testujesz? –

Powiązane problemy