【问题标题】:Ionic5 | Storage not ready on native Device离子5 |本机设备上的存储未准备好
【发布时间】:2023-07-15 11:43:01
【问题描述】:

我们目前正在开发基于 Ionic 的应用程序。为了启用新登录并长时间保留数据,我们使用离子存储。在 Android 仿真 (Android 11) 中,一切似乎都运行良好。如果我在智能手机 (Android 11) 上安装该应用程序,我的脚本会弹出并中断。

该应用程序是返回交付服务的下一个访问点的应用程序。整个事情与一个与会话一起工作的 PHP-RestAPI 一起工作。会话以及访问数据和其他数据(游览)应保存在存储中。为了安全起见,整个 AES256 被加密(值)。

是否有已知问题,是我弄错了吗?

但没有活动错误。到目前为止,问题只发生在捆绑器之后的真实设备上。

这里有一些代码sn-ps:

app.module.ts

imports: [
    IonicModule.forRoot(),
    IonicStorageModule.forRoot({
        name: '__tourenApp',
        driverOrder: ['sqlite', 'indexeddb', 'websql', 'localstorage'],
    }),
    ...
]
    

数据处理程序:

功能解密: ....

    const result = await this.storage.get(key);
    if (typeof result !== 'undefined' && result !== '' && result !== null) {
        try {
            const res: string = await this.aes256.decrypt(this.secureKey, this.secureIV, result);
            this.srvUtil.logMessage(`Eintrag '${key}' mit Wert '${res}' entschlüsselt und aus dem lokalem Speicher geholt`);
            return res;
        } catch (error) {
            this.srvUtil.logMessage(`Es konnten keine Daten für den Key '${key}' aus dem Speicher geholt werden`, MessageType.Error);
        }
    } else {
        return '';
    }
 ... Encrypt-Func:
    try {
        const res = await this.aes256.encrypt(this.secureKey, this.secureIV, value);
        await this.storage.set(key, res);
        this.srvUtil.logMessage(`Neuen Eintrag '${key}' mit Wert '${value}' verschlüsselt und im lokalem Speicher gesichert`);
    } catch (error) {
        this.srvUtil.logMessage(
            `Fehler beim Setzen eines neuen Storage Eintrags mit dem Key ${key} und dem Wert ${value}`, MessageType.Error);
    }

版本详情:

  • 离子 CLI:6.12.1
  • 离子角度:5.0.0
  • 离子存储:2.2.0
  • 科尔多瓦:9.0.0
  • Angular-Core:9.0.0

【问题讨论】:

    标签: ionic-framework ionic5


    【解决方案1】:

    这听起来像a bug that was reported。显然 Ionic Storage 没有正确等待 SQLite 准备好。建议的解决方法是手动等待底层 localForage 的就绪事件:

    const localForage = await this.storage.ready();
    localForage.ready(() => {
      // use storage
    });
    

    【讨论】:

    • 感谢您的回答。不幸的是,它在 Android 11 上没有任何区别。存储根本没有准备好,根本无法启动。还有其他选择吗?
    • 如果是时间问题,启用CPU/network throttling 可能会帮助您在浏览器中复制它。否则,通过系统地删除不同的部分(localForage 驱动程序、加密等)来尝试找出问题所在。也许尝试在页面加载时删除所有存储读/写,看看应用程序是否仍然有效。
    • 谢谢,但我已经知道问题出在哪里了。插件 Ionic-Storage 未激活。使用 .ready() 我可以永远等待,存储永远不会准备好。但问题是,为什么它还没有准备好。你有什么想法吗?
    • 你指的是ready这两个中的哪一个?承诺是拒绝还是不解决?你试过没有sqlite吗?你安装了cordova-sqlite-storagecordova 插件吗?
    • 我查看了 config.xml 我发现存储的条目丢失了。以下插件没有在那里分解:ionicframework.com/docs/angular/storage 你能告诉我条目应该读什么吗?
    【解决方案2】:

    我与专家一起发现了错误。错误在驱动程序中。在 Cordova 下使用 sqlite 显然有问题。因此,对于所有以下信息,不幸的是它仅适用于驱动程序变体“localstorage”。

    【讨论】:

      最近更新 更多