我已经阅读了2天的答案,问题,论坛和博客,但无法解决我的问题。
我使用带有WebView的Native(SDK)Android应用程序中的AngularJS webApp。
一切似乎都有效,但当我的应用程序调用使用" Set-Cookie"响应的服务时标题这些cookie没有在webview中设置,当然也没有在下次调用中发送,所以我的应用程序爆炸。
该应用程序在浏览器和cordova以及" document.cookie"中完美运行。返回一个空字符串,所以我知道这是失败的地方。
我的网页视图初始化如下:
public class Main extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new mWebViewClient());
webview.getSettings().setAppCacheEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setSavePassword(true);
webview.getSettings().setAllowFileAccessFromFileURLs(true);
webview.getSettings().setAllowContentAccess(true);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setUserAgentString(...);
webview.loadUrl("file:///android_asset/www/index.html");
javascriptAPI = new JavascriptAPI(this);
webview.addJavascriptInterface(javascriptAPI, "jsAPI");
...
}
...
}
我也尝试过来自这里和那里的大量代码:
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().run();
CookieManager.getInstance().setAcceptCookie(true);
但它既不起作用。
我的应用程序正在调用一些使用重定向的服务,因此从JS获取cookie并设置它们不是一个选项,我需要webview像浏览器一样工作。
这是我的第一个SDK Android应用程序,我完全不确定哪些信息可以与回答问题(清单,jsAPI等)相关,所以不要犹豫,并且我不会说。 ll发布任何其他需要的东西
解决
谢谢@Mark,这修复了我的代码:
(在活动onCreate中)
...
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(this);
}
^^^^^^^
THIS
WebView webview = (WebView) findViewById(R.id.webview);
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().run();
CookieManager.getInstance().setAcceptCookie(true);
CookieManager.getInstance().setAcceptFileSchemeCookies(true); <- THIS
CookieManager.getInstance().setAcceptThirdPartyCookies(webview, true); <- THIS
webview.setWebViewClient(new mWebViewClient());
webview.getSettings().setAppCacheEnabled(true);
...
答案 0 :(得分:1)
您需要担心三种acceptCookie方法,并考虑多个Android版本的不同行为。
1)我注意到您的初始网址是pid = fork();
if (pid == -1)
{
printf("Failed forming fork\n");
return;
}
else if (pid == 0)
{
strcpy( cmd , "/usr/bin/");
strcat( cmd, command);
execl(cmd, command, args, NULL);
}else{
wait(NULL);
}
网址。您可能需要致电file://
。
2)在Android Lollipop及更高版本中,您可能需要拨打CookieManager.getInstance().setAcceptFileSchemeCookies(true);
3)对于Android版本&lt;棒棒糖,如果你想要持久化cookie(例如,在轮换期间存活),你必须采取一些步骤来手动管理同步。
首先,确保在应用程序启动期间初始化CookieSyncManager,方法是将其添加到应用程序类'onCreate(),或者扩展它。
CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
其次,您需要为棒棒糖前设备设置同步,最后启用Cookie。以下是您可以扩展的示例活动,它为Lollipop之前的设备设置所有同步,并提供public class CookieApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(this);
}
}
}
,无论Android版本如何,都应启用所有Cookie类型(请注意,在安装时需要考虑安全性调用这些方法!)。请注意,必须在初始化webView后调用所有CookieManager.getInstance()。set * Cookie *()方法。
enablesCookies(webView)