Ionic/Cordova文件插件在iOS设备上连续下载大量文档时无法写入文件

Ionic/Cordova文件插件在iOS设备上连续下载大量文档时无法写入文件,ios,angular,cordova,ionic-framework,filesystems,Ios,Angular,Cordova,Ionic Framework,Filesystems,用户看到的问题是: 用户有一长串需要下载到iOS设备(200+)的文档 用户开始下载,并连续下载每个文件 在下载队列的末尾,他们发现其中一个文件失败(并且总是两个25MB+的特定文件中的一个) 他们重试作业(只下载失败的文档),作业成功 作为开发人员,我看到的是: 我的应用程序将文档作为一个blob下拉 当我检查blob(在我的Typescript应用程序代码中)时,它的大小大于0 我调用this.file.writeFile(directoryPath,fileName,blob,{repla

用户看到的问题是:

  • 用户有一长串需要下载到iOS设备(200+)的文档
  • 用户开始下载,并连续下载每个文件
  • 在下载队列的末尾,他们发现其中一个文件失败(并且总是两个25MB+的特定文件中的一个)
  • 他们重试作业(只下载失败的文档),作业成功
  • 作为开发人员,我看到的是:

  • 我的应用程序将文档作为一个blob下拉
  • 当我检查blob(在我的Typescript应用程序代码中)时,它的大小大于0
  • 我调用
    this.file.writeFile(directoryPath,fileName,blob,{replace:true})
    ,它调用围绕Cordova文件插件的爱奥尼亚文件包装器
  • 但是,当我查看FileWriter.js的
    write
    中的blob时,它的大小为零
  • 所有这些都会导致错误,并显示为:
  • 我从中得到的是,在我的typescript代码中调用Ionic文件包装器上的file.writeFile和Cordova包中的FileWriter.write方法之间的某个地方,我的blob被破坏、丢失或以某种方式清空

    调试是很困难的,因为这两点之间的层在xCode调试器中被缩小了,所以听到一些关于如何更好地自己调试的建议也会很好

    我们知道这里会发生什么吗?这是iOS上的内存问题吗?Cordova是否在多次重复请求时超时

    需要注意的几点:

    • 每次在iOS xCode模拟器中尝试下载时,都可以下载完整的文件列表。这让我相信这可能是一个记忆问题,但我不确定

    • 故障总是发生在大约200个文件之后,并且发生在两个25-30MB文件中的一个文件上+

    就调试而言,我能看到的最早的blob减少到0的地方就是这里(尽管我可能调试不正确)

    编辑-在进一步挖掘之后,我能够准确地看到Ionic插件出错的地方:

    我使用的代码是:

      private writeFileInChunks(writer: FileWriter, file: Blob) {
        console.log('SIZE OF FILE AT START', file.size);
        const BLOCK_SIZE = 1024 * 1024;
        let writtenSize = 0;
    
        function writeNextChunk() {
          const size = Math.min(BLOCK_SIZE, file.size - writtenSize);
          console.log('CALCULATED SIZE:', size);
          const chunk = file.slice(writtenSize, writtenSize + size);
          console.log('SIZE OF CHUNK TO WRITE', chunk.size)
          writtenSize += size;
          writer.write(chunk);
        }
    
        return getPromise<any>((resolve, reject) => {
          writer.onerror = reject as (event: ProgressEvent) => void;
          writer.onwrite = () => {
            if (writtenSize < file.size) {
              writeNextChunk();
            } else {
              resolve();
            }
          };
          writeNextChunk();
        });
      }
    
    重试时:

    SIZE OF FILE AT START: 34012899
    CALCULATED SIZE: 1048576
    SIZE OF CHUNK TO WRITE: 1048576
    CALCULATED SIZE: 1048576
    SIZE OF CHUNK TO WRITE: 1048576
    ...
    ...
    ...
    CALCULATED SIZE: 458467
    SIZE OF CHUNK TO WRITE: 458467
    
    因此,无论出于何种原因,在之前的大量下载之后,file.slice步骤会导致一个空的/损坏的blob

    关于如何纠正这个问题有什么想法吗

    使用一些扩展日志运行另一个测试:

      private writeFileInChunks(writer: FileWriter, file: Blob) {
        ...
        function writeNextChunk() {
          const size = Math.min(BLOCK_SIZE, file.size - writtenSize);
          console.log('CALCULATED SIZE:', size);
          console.log('WRITTEN SIZE', writtenSize);
          console.log('SUMS TO:', writtenSize + size)
          console.log('FILE SIZE BEFORE SLICE:', file.size);
          const chunk = file.slice(writtenSize, writtenSize + size);
          console.log('SIZE OF CHUNK TO WRITE', chunk.size);
          writtenSize += size;
          writer.write(chunk);
        }
        ...
        ...
      }
    
    产出如下:

    CALCULATED SIZE: 1048576
    WRITTEN SIZE: 0
    SUMS TO: 1048576
    FILE SIZE BEFORE SLICE: 34012899
    SIZE OF CHUNK TO WRITE 0
    
    进一步证实了这一问题

      private writeFileInChunks(writer: FileWriter, file: Blob) {
        ...
        function writeNextChunk() {
          const size = Math.min(BLOCK_SIZE, file.size - writtenSize);
          console.log('CALCULATED SIZE:', size);
          console.log('WRITTEN SIZE', writtenSize);
          console.log('SUMS TO:', writtenSize + size)
          console.log('FILE SIZE BEFORE SLICE:', file.size);
          const chunk = file.slice(writtenSize, writtenSize + size);
          console.log('SIZE OF CHUNK TO WRITE', chunk.size);
          writtenSize += size;
          writer.write(chunk);
        }
        ...
        ...
      }
    
    CALCULATED SIZE: 1048576
    WRITTEN SIZE: 0
    SUMS TO: 1048576
    FILE SIZE BEFORE SLICE: 34012899
    SIZE OF CHUNK TO WRITE 0