WebView en cookies op Android

Ik heb een applicatie op appspot die prima werkt via een gewone browser, maar bij gebruik via Android WebView kan het geen cookies instellen en lezen. Ik probeer geen cookies “buiten” deze webapplicatie te krijgen, als de URL eenmaal is bezocht door WebView, kunnen alle verwerkingen, id’s, enz. daar blijven, alles wat ik nodig heb is sessiebeheer binnen die applicatie. Eerste scherm laadt ook prima, dus ik weet dat WebView + serverinteractiviteit niet verbroken is.

Ik keek naar de WebSettings-klasse, er was geen oproep zoals setEnableCookies.

Ik laad de url als volgt:

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

Enig idee?


Antwoord 1, autoriteit 100%

Als je Android Lollipop gebruikt, d.w.z. SDK 21, dan:

CookieManager.getInstance().setAcceptCookie(true);

werkt niet. U moet het volgende gebruiken:

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

Ik kwam hetzelfde probleem tegen en de bovenstaande regel werkte als een charme.


Antwoord 2, autoriteit 47%

Van de Android-documentatie:

De CookieSyncManagerwordt gebruikt om de browsercookie te synchroniseren
opslaan tussen RAM en permanente opslag. Om de beste prestaties te krijgen,
browsercookies worden in het RAM opgeslagen. Een apart draadje slaat de cookies op
tussen, aangedreven door een timer.

Om de CookieSyncManagerte gebruiken, moet de hosttoepassing de . aanroepen
volgende wanneer de applicatie start:

CookieSyncManager.createInstance(context)

Om synchronisatie in te stellen, moet de hosttoepassing bellen

CookieSyncManager.getInstance().startSync()

in Activity.onResume(), en bel

CookieSyncManager.getInstance().stopSync()

in Activity.onPause().

Als u directe synchronisatie wilt krijgen in plaats van te wachten tot de timer wordt geactiveerd, is de
host kan bellen

CookieSyncManager.getInstance().sync()

Het synchronisatie-interval is 5 minuten, dus u zult synchronisaties willen forceren
toch handmatig, bijvoorbeeld in onPageFinished(WebView, String). Opmerking
dat zelfs sync() asynchroon gebeurt, dus doe het niet zoals je
activiteit wordt afgesloten.

Eindelijk zou zoiets als dit moeten werken:

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

Antwoord 3, autoriteit 39%

Ik heb ontdekt wat er aan de hand is.

Als ik een pagina laad via een server-side actie (een url-bezoek), en de html bekijk die door die actie in een webview wordt geretourneerd, wordt die eerste actie/pagina binnen die webview uitgevoerd. Wanneer u echter op een link klikt die actieopdrachten zijn in uw web-app, starten deze acties een nieuwe browser. Daarom gaat cookie-informatie verloren omdat de eerste cookie-informatie die u voor Webview instelt, is verdwenen, we hebben hier een apart programma.

U moet klikken op Webview onderscheppen, zodat browsen de app nooit verlaat, alles blijft in dezelfde 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]);

Dit lost het probleem op.


Antwoord 4, autoriteit 8%

Mijn probleem is dat cookies niet “binnen” dezelfde sessie werken. –

Burak: Ik had hetzelfde probleem. Het inschakelen van cookies loste het probleem op.

CookieManager.getInstance().setAcceptCookie(true);

Antwoord 5

CookieManager.getInstance().setAcceptCookie(true);Normaal gesproken zou het moeten werken als uw webview al is geïnitialiseerd

of probeer dit:

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

Other episodes