Как заполнить папку «Документы» во время сборки

#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