Javascript и Cordova/Phonegap FileWriter выдают Invalid_Modification_Error при записи простого текстового файла

Я использую плагины Cordova File и FileTransfer. У меня есть следующие разрешения, установленные в моем config.xml

<feature name="File">
    <param name="ios-package" value="CDVFile" />
</feature>
<feature name="FileTransfer">
    <param name="ios-package" value="CDVFileTransfer" />
</feature>

Я пытаюсь написать обычный текстовый файл, используя следующий фрагмент кода:

this.writeFile = function (filename, content, type, callback) {
   window.resolveLocalFileSystemURL(cordova.file.applicationDirectory, function(dir) { 
       dir.getFile(filename, { create: true }, function(fileEntry) {
            fileEntry.createWriter(function(fileWriter) {
                fileWriter.onwriteend = function(e) {
                    console.log('WRITE SUCCESS');
                    callback(null, e);
                };
                fileWriter.onerror = function(e) {
                    console.log('WRITE ERROR is');
                    console.log(e); 
                    callback(e);
                };

                var blob = new Blob([content], {type: type});
                fileWriter.write(blob);
            }, callback);
        }, callback);
    }, callback);
};

Когда я выполняю строку ниже:

this.writeFile('stuff.txt', 'Eggs and Burgers', 'text/plain', callback);

Я получаю сообщение об ошибке при записи файла с кодом 9, что означает INVALID_MODIFICATION_ERROR. Что это значит? Это о разрешениях? Как я могу предоставить разрешения файловой системы для моего приложения в Xcode или Cordova?

Другая проблема заключается в том, что моя функция обратного вызова вызывается дважды! Один раз за успех и один раз за ошибку. Теперь я понимаю, что writeend не обязательно означает успешную операцию, но как быть в таких ситуациях?

Обратите внимание, что эта проблема возникает только на реальном устройстве iOS. В симуляторе iOS он отлично работает и отлично пишет в файловой системе. Решив, как написать текстовый файл, я продолжу и напишу файлы png/mp3/wav.

Я ценю всю помощь. Спасибо.


person batilc    schedule 14.05.2015    source источник


Ответы (1)


Оказывается, в приведенном выше коде нет ничего плохого, за исключением того, что Apple запрещает запись в набор приложений после его установки. Пакет подписан, и после этого никакие изменения не допускаются.

Чтобы иметь возможность записывать данные, просто измените

cordova.file.applicationDirectory

to

cordova.file.dataDirectory

и добавьте следующее в ваш config.xml в соответствии с вашими потребностями:

<preference name="iosPersistentFileLocation" value="Library" />

Затем ваши данные будут храниться в каталоге Library/NoCloud в iOS.

Дополнительные сведения о файловой системе iOS: https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html

person batilc    schedule 18.05.2015