Cordova iOS在应用程序上失去存储关闭

时间:2017-02-16 14:43:09

标签: javascript ios cordova

使用适用于iOS和Android的cordova应用程序。测试一些新功能,我注意到我的localStorage数据没有保留,我会通过xcode停止应用程序,或者在手机的多任务处理视图中关闭它。认为这是因为localStorage不一定是永久性的,我转而使用PouchDB,它通过indexdb / websql存储它。我遇到了同样的问题。

我正在使用WKWebview插件,所以我不知道这可能是原因。我已经在笔记本电脑上测试了pouchdb在chrome中的使用情况,我没有遇到任何问题。

修改

在android上测试,同样的问题。强制退出应用程序会清除indexdb数据。

1 个答案:

答案 0 :(得分:1)

不是真正的答案,但我最终解决了这个问题。我没有保存到localstorage或websql,而只是使用文件插件编写一个JSON文件。

function getFileEntry() {
  return new Promise((resolve, reject) => {
    // 1mb
    window.requestFileSystem(window.LocalFileSystem.PERSISTENT, 1024 * 1024, (fs) => {
      fs.root.getFile('settings.json', { create: true, exclusive: false }, (fileEntry) => {
        resolve(fileEntry);
      }, (e) => {
        console.log(`error reading file ${fs.root.nativeURL}settings.json`);
        reject(e);
      });
    }, (e) => {
      console.log('error requesting persistent FS');
      reject(e);
    });
  });
}

export function fileApiAvailable() {
  return window.cordova && window.cordova.file;
}

export function readFile() {
  return getFileEntry().then((fileEntry) => {
    return new Promise((resolve, reject) => {
      fileEntry.file((file) => {
        const reader = new FileReader();
        reader.onloadend = function() {
          if (this.result) {
            resolve(JSON.parse(this.result));
          } else {
            resolve(null);
          }
        };

        reader.readAsText(file);
      }, (e) => {
        console.log('issue reading the file');
        reject(e);
      });
    });
  });
}

export function saveSettingsToFile(settings) {
  if (!fileApiAvailable()) {
    return Promise.resolve();
  }

  return getFileEntry().then((fileEntry) => {
    return new Promise((resolve, reject) => {
      fileEntry.createWriter((fileWriter) => {
        fileWriter.onwriteend = () => {
          resolve();
        };
        fileWriter.onerror = (e) => {
          reject(e);
        };
        fileWriter.write(JSON.stringify(settings));
      });
    });
  });
}