离子5 |本机设备上的存储未就绪

Ionic5 | Storage not ready on native Device

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

该应用是 returns 送货服务的下一个接入点。整个事情与 PHP-RestAPI 一起工作,它与会话一起工作。会话以及访问数据和其他数据(游览)应保存在存储器中。为了安全起见,整个 AES256 都被加密(值)。

有已知问题吗,我是不是搞错了?

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

以下是一些代码片段:

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

版本详情:

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

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

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