#ios #file #nativescript
Вопрос:
У меня есть приложение Javascript NativeScript 6.8, которое загружает новые файлы данных. Я обнаруживаю, что на iOS я не могу создавать файлы в папке приложения. (По крайней мере, в сборках релизов; в сборках отладки я могу.) Я могу изменить свой код для чтения файлов данных из папки «Документы», но как я могу предварительно заполнить папку «Документы» во время сборки исходными файлами данных? Я бы предпочел не копировать все файлы данных во время выполнения.
Или я неправильно истолковал ограничение на то, что файлы не могут быть созданы в папке приложения (или подпапках) в сборках версий iOS?
Комментарии:
1. Когда ваше приложение установлено на iOS, ваш пакет будет скопирован на устройство. Если у вас есть какие-либо файлы, которые должны находиться вне пакета (например, файлы в каталоге документов, которые вы хотите запустить с некоторым контентом, но которые будут обновлены позже), вашему приложению необходимо создать эти файлы из файлов, хранящихся в вашем пакете, при первом запуске.
2. @Paulw11 — да, к такому выводу я пришел. Я опубликую функцию, которую разрабатываю, когда она будет завершена.
Ответ №1:
Обновление файлов в режиме реального времени в iOS происходит сложнее, чем можно было бы ожидать. Итак, да, вам нужно получить доступ к обновленным файлам из папки «Документы», а не создавать резервные копии файлов в iCloud, и обрабатывать множество условий синхронизации, таких как обновление в реальном времени, выполняемое непосредственно перед тем, что может показаться начальной копией файла в папку «Документы» (кажется маловероятным, но я видел, как это происходило во время тестирования).
Я включил функцию, которую я разработал, ниже. Для контекста, когда я нахожу файл в Интернете, который обновляется в режиме реального времени, я использую набор приложений, чтобы сохранить дату файла в виде строки (сохранение в виде значения теряет точность).
Функция не идеальна, но на данный момент она выполняет свою работу. Я звоню сюда из app.js в проекте NativeScript 6.8 JavaScript.
/** * Copy files in app/files folder to Documents folder so they can be updated */ async function copyFilesToDocuments() { let filesCopied = appSettings.getBoolean("copyFilesToDocuments", false); if (!filesCopied) { // only copy files on first invocation let filesFolder = fs.knownFolders.currentApp().getFolder("files"); // Folder object let documentsFolder = fs.knownFolders.documents(); // Folder object let fileEntities = await filesFolder.getEntities(); for (entity of fileEntities) { let sourceFile = fs.File.fromPath(entity.path); let targetFilePath = fs.path.join(documentsFolder.path, entity.name); let targetDate = parseInt(appSettings.getString(entity.name, "0"), 10); // live-update date or 0 if (fs.Folder.exists(targetFilePath) amp;amp; targetDate gt; global.dataDate ) { // if file has been live-updated console.log("app.js copyFilesToDocuments: file '" entity.name "' skipped to avoid overwrite. "); continue; // don't overwrite newer file } appSettings.remove(entity.name); // remove any live-update timestamp let targetFile = fs.File.fromPath(targetFilePath); let content = await sourceFile.read(); try { await targetFile.write(content); if (platform.isIOS) { // Prevent file from being backed up to iCloud // See https://stackoverflow.com/questions/58363089/using-nsurlisexcludedfrombackupkey-in-nativescript // See https://stackoverflow.com/questions/26080120/cfurlcopyresourcepropertyforkey-failed-because-passed-url-no-scheme NSURL.fileURLWithPath(targetFilePath).setResourceValueForKeyError(true, NSURLIsExcludedFromBackupKey); } // console.log("app.js copyFilesToDocuments file copied: " entity.name); } catch(e) { console.warn("app.js copyFilesToDocuments error: " e); //TODO: app will fail at this point with some files not found :-( } // end catch } // end for appSettings.setBoolean("copyFilesToDocuments", true); } // end files not yet copied } // end copyFilesToDocuments