Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安装Cordova APK后,Android CookieManager为空_Android_Cordova_Cookies_Webview_Trigger.io - Fatal编程技术网

安装Cordova APK后,Android CookieManager为空

安装Cordova APK后,Android CookieManager为空,android,cordova,cookies,webview,trigger.io,Android,Cordova,Cookies,Webview,Trigger.io,我正在尝试将一个WebView包装的Android应用程序升级为一个内置的。虽然这两个框架相似,但会话cookie在Trigger和Cordova中的存储方式不同 为了解决这个问题,我编写了一些代码,将所有cookie从应用程序的CookieManager实例复制到CordovaWebView的cookie管理器: public void fetchTriggerCookies() { // Note: I also tried using a CookieStore implemen

我正在尝试将一个WebView包装的Android应用程序升级为一个内置的。虽然这两个框架相似,但会话cookie在Trigger和Cordova中的存储方式不同

为了解决这个问题,我编写了一些代码,将所有cookie从应用程序的
CookieManager
实例复制到
CordovaWebView
的cookie管理器:

public void fetchTriggerCookies() {

    // Note: I also tried using a CookieStore implementation for
    // retrieving the old cookies, but it didn't seem to make
    // a difference.

    CookieManager cm = CookieManager.getInstance();
    String cookies = cm.getCookie("my.example.com");

    // Note: cm.hasCookies() is always false when cookies is empty,
    // so I know I'm checking the right URL
    System.out.println("WebView CM has cookies? " + cm.hasCookies());
    System.out.println("WebView CM cookies: " + cookies);

    if (cookies == null || cookies.length() == 0) { return; }

    this.mTriggerCookieString = cookies;
}

public void restoreTriggerCookies(CordovaWebView webView) {
    if (this.mTriggerCookieString == null) { return; }

    webView.getCookieManager().setCookie("my.example.com", this.mTriggerCookieString);
}
让我非常困惑的是,在Cordova应用程序的
onCreate()
中调用
fetchTriggerCookies()
(在
super
调用之前和之后)有时只会找到要还原的cookies。(我试着在appinit代码周围的其他地方运行这个程序,没有任何区别。)

看起来cookies存储在
app\u webview/cookies
文件(SQLite DB)中,但是在安装新的APK后,该文件会被直接删除我可以用以下方法进行测试:

# Uninstall and install Trigger app:
adb uninstall com.my.example && adb install path/to/old/trigger-apk.apk

# Sign in to trigger app to load session cookies

# Extract a backup of the trigger app from my device...
adb backup -noapk com.my.example
dd if=backup.ab bs=1 skip=24 > compressed-data
printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - compressed-data | gunzip -c > decompressed-data.tar
tar xf decompressed-data.tar

# ...and verify that the sessionid cookie exists
cat apps/com.my.example/r/app_webview/Cookies | grep sessionid # is found!

# Install the new Cordova app
adb install -r path/to/new/android-debug.apk

# Before running the app, shell into the device and check if cookies file exists
adb shell
run-as com.my.example
ls app_webview/Cookies # No such file or directory
非常奇怪的是,它有时工作得很好;有时Cookie文件存在,我的代码可以将它们复制到新的WebView。但其他时候,它甚至不使用由相同调试密钥签名的相同APK,我可以看到在安装新应用程序后(以及在运行它之前),Cookie文件不存在

那么,关于Android中Cookie是如何存储/缓存的,以及为什么我可能无法访问它们,有什么我不了解的吗?为什么安装新应用程序会清除Cookies文件?有没有比通过
CookieManager
更稳定的方式来请求cookie

提前感谢所有有用的反馈!:)