cordova-plugin-file:应用程序更新后无法访问文件(iOS)

eln*_*zah 3 ios cordova ionic-framework cordova-plugins ionic4

我遇到一个有趣的问题:我正在开发一个离子应用程序,用于cordova-plugin-file存储图像。生成的路径(格式为 file:///... 的 URI)与更多信息一起存储在 SQLite DB 中。当我安装该应用程序并使用它时,一切都很完美。但是,如果我更新(或重新安装)应用程序,则不再找到旧图像,而新添加的图像则可以完美工作。

我首先怀疑图像文件在更新时被删除,但我检查了目录的内容,文件仍然存在。(仅供参考:我用来file.dataDirectory/scans/放置我的文件)。

然后我想也许我可以解决加载到img src加载了 的 base64 blob中的问题cordova.file.readAsUrl(),但 cordova.file 也找不到该文件(我坚持认为,文件在那里,我用 XCode 检查过)。

因此,我进一步检查cordova.file,它只找到上次应用程序安装后添加的文件,但较旧的文件仍然存在于目录中。

这是我的代码:

private getImgSrcFromDocument(doc: Document): any {
        const uri = doc.fileName;
        const src = this.webView.convertFileSrc(uri);
        const sanitized = this.sanitizer.bypassSecurityTrustUrl(src);

        console.log({uri, src, sanitized});
        return sanitized;
    }
Run Code Online (Sandbox Code Playgroud)
<img class="document_thumbnail" [src]="getImgSrcFromDocument(doc)">
Run Code Online (Sandbox Code Playgroud)

我已经检查过了但不是我的情况。

顺便说一下,同样的代码在 Android 上运行得很好。

知道可能是什么问题吗?提前致谢!

eln*_*zah 6

我找到了原因和解决方案(当你知道问题时非常明显):

原因

每次新安装时,iOS 都会重命名应用程序的数据目录。目录路径具有以下形式:

file:///var/mobile/Containers/Data/Application/ABC0000-1234-99DD-00FA-E835FEA/Library/NoCloud/

中间的哈希值在每次安装时都会更新,因此数据库中存储的完整路径不再有效。

解决方案

如果您仍然可以做到这一点(尚未部署,没有真正的用户),请仅存储相对路径并每次完成this.file.dataDirectory(或在您想要存储文件的任何位置)。

如果您已经拥有真正的用户并希望更新“查找文件”,只需忽略存储路径的第一部分并像以前一样构建它:

const ValidUri = this.file.dataDirectory + // The injected cordova-plugin-file
                 'relativeSubDirectories/' + // If you store your files in some subdirectory
                 this.document.storedFullPath.substr( // Take from fullPath only the filename
                      this.document.storedFullPath.lastIndexOf('/') + 1
                 );
Run Code Online (Sandbox Code Playgroud)

其中,storedFullPath 是字符串file:///var/mobile/...

之后,您仍然需要进行 webView 转换和清理,就像上面的问题一样。

希望这对某人有帮助。