Сохранение файла в Cordova на iOS не работает - хорошо в Android - PullRequest
2 голосов
/ 29 мая 2019

У меня есть приложение Cordova, где я загружаю файл PDF, сохраняю его локально и затем открываю. Он отлично работает в Android, но iOS выдает сообщение в окне вывода, что записал файл, но не может открыть файл с нулевым значением.

Изначально я использовал 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 голосов
/ 30 мая 2019

Плагин fileOpener2 имеет известную проблему с пробелами в имени файла для iOS .Вы можете по сообщениям использовать decodeURIComponent для отображения файлов, затронутых этим, например, в этом случае:

var docUrl = folderpath + filename;

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

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

Вы также можете просто удалить / заменить пробелы при сохранении.

(Этот плагин также имеет проблемы с не-ASCII символами . Решения здесь могут стать немного сложнее .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...