chrome.storage.local.get chrome.runtime.reload() 后为空 - 打包应用

chrome.storage.local.get empty after chrome.runtime.reload() - packaged app

我在我的应用程序中使用 chrome 存储,它运行良好。这个过程非常简单。用户输入电子邮件和密码,应用程序使用 XHR 请求验证它们并使用 chrome.storage.local.set 维护 session。设置 session 后,我使用 chrome.runtime.reload() 重新加载应用程序。在每次重新加载时,我都使用 checkLogin 函数来验证 session 是否处于活动状态。它工作正常。但是现在我收到了这个错误:

似乎是重新加载应用后存储变空,应用在存储中找不到关键字并返回未定义错误。

这里是用户通过身份验证后调用的代码:

postLogin = function (resultData) {
if (resultData.authStatus == 1) {
    chrome.storage.local.set({'userData': resultData}, function(){
        console.log("session saved");
    });
    chrome.runtime.reload()
}
else {
    $("#result").html(resultData.authMsg);
    $("#result").attr('style', 'display: inline-block !important');
}
return false
}

应用程序重新加载后,我检查保存的 session:

checkLogin = function () {
console.log(chrome.storage);
chrome.storage.local.get("userData",function(result) {
    userData = result.userData;
    if (userData && userData.authStatus == 1) {
        console.log("--- user signed In ---")
        return true;
    }
    console.log(" ---- unable to find user session ----")
    $("#auth-dialog").attr('style', 'display: inline !important');
    return false;
})
}

此时我收到上面屏幕截图中附加的错误。我还使用 console.log(chrome.storage); 来验证存储状态,它返回未定义。 奇怪的是,一旦我手动重新启动应用程序,代码的 .get 部分就可以正常工作。起初,它显示错误我必须重新加载页面才能获取存储的存储值。

清单:

{
  ...
  "permissions": [ "unlimitedStorage", "clipboardRead", "clipboardWrite", "nativeMessaging" , "storage" ],
}

更新:

问题不在于 post 标题中提到的 chrome.storagechrome.runtime.reload() 的主要问题。初始应用程序启动后,每当我调用 chrome.runtime.reload() 应用程序重新加载从 chrome. 开始的任何内容时,它都不起作用。

我还没有找到解决方案,但我找到了解决方法。我最初的假设是,在重新加载应用程序后 chrome.storage 不起作用,因为这是我的应用程序检查的第一件事。经过更多调试后,我发现每当我在应用程序重新加载从 chrome. 开始的任何内容时调用 chrome.runtime.reload() 都不起作用。问题在于重新加载应用程序 为了测试这一点,我已经从应用程序中删除了所有内容,只是一条显示清单详细信息的日志消息 console.log(chrome.runtime.getManifest()) 和一个按钮 "Reload" 在它调用 chrome.runtime.reload() 的点击事件上。在初始应用程序启动时,一切正常,控制台日志消息显示清单详细信息。当我单击“重新加载”按钮并且应用程序重新加载时,它显示:

Uncaught TypeError: chrome.runtime.getManifest() is not a function

我尝试使用其他函数,如 chrome.storage.local.set/get,但出现相同的未定义错误。

要解决此问题,解决方法是创建一个新的 window,而不是重新加载应用并关闭之前的应用。

chrome.app.window.create(
    'main.html',
    opt);
setTimeout(function () {
    //close previous window
}, 300);

如果有人遇到同样的问题并找到了 better/cleaner 解决方法,请分享。