在iOS上的Cordova中保存文件不起作用-在Android中很好

时间:2019-05-29 14:38:06

标签: ios file cordova

我有一个cordova应用程序,我在其中下载pdf文件,将其保存在本地,然后将其打开。 在Android上运行正常,但iOS在输出窗口中显示一条消息,表明它已写入文件,但无法打开null文件。

最初,我使用的是cordova.file.externalRootDirectory,它在Android上有效,但在iOS上无效。 我将其更改为cordova.file.dataDirectory,它再次在Android上运行,但在iOS上不工作。

根据我完成的搜索,使用cordova.file.dataDirectory应该在两个平台上都可以工作。

我尝试添加

到配置文件,但这没什么区别。

var contentType = "application/pdf";
var folderpath = cordova.file.dataDirectory;
var filename = filedate + ".pdf";

savebase64AsPDF(folderpath,filename,data,contentType)


function b64toBlob(b64Data, contentType, sliceSize) {
    contentType = contentType || '';
    sliceSize = sliceSize || 512;

    var byteCharacters = atob(b64Data);
    var byteArrays = [];

    for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
        var slice = byteCharacters.slice(offset, offset + sliceSize);

        var byteNumbers = new Array(slice.length);
        for (var i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        var byteArray = new Uint8Array(byteNumbers);

        byteArrays.push(byteArray);
    }

  var blob = new Blob(byteArrays, {type: contentType});
  return blob;
}

function savebase64AsPDF(folderpath,filename,content,contentType){
// Convert the base64 string in a Blob
var DataBlob = b64toBlob(content,contentType);

console.log("Starting to write the file :3");

window.resolveLocalFileSystemURL(folderpath, function(dir) {
    console.log("Access to the directory granted succesfully");
    dir.getFile(filename, {create:true}, function(file) {
        console.log("File created succesfully.");
        file.createWriter(function(fileWriter) {
            console.log("Writing content to file");
            fileWriter.write(DataBlob);
            console.log("Finished writing file.");
            //open file
            cordova.plugins.fileOpener2.open(folderpath + filename, 'application/pdf');
        }, function(){
            alert('Unable to save file in path '+ folderpath);
        });
    });
});
}

期望的(和期望的)结果是在Android上发生的事情,因为该文件被保存在本地,然后在默认的pdf阅读器中打开。

从iOS上我能得到的最好的信息是xcode输出窗口中的一条消息,指出其“写入文件已完成”,然后另一行指出“正在(null)查找文件”

没有例外或错误,什么都没有。

任何帮助都会感激不尽。

1 个答案:

答案 0 :(得分:0)

插件fileOpener2具有一个known issue with spaces in the filename for iOS。您可以reportedly use decodeURIComponent来显示受此影响的文件,例如,在这种情况下:

var docUrl = folderpath + filename;

if ( device.platform.toLowerCase() === 'ios' ) { // only change for iOS
  docUrl = decodeURIComponent( docUrl );
}

cordova.plugins.fileOpener2.open(docUrl, 'application/pdf');

保存时,您也可以简单地删除/替换空格。

(此插件也存在non-ASCII characters问题。此处的解决方案可以get a little complex。)