Подтвердить что ты не робот

Структура ресурсов в Apache Cordova (PhoneGap) и загрузка файлов из файловой системы

У нас довольно сложный JS Webapp, который по-разному загружает различные ресурсы (HTML-шаблоны, дополнительные файлы JS/CSS, данные JSON, изображения, видео, звуки) по-разному (string, arrayBuffer, base64, binary) в Интернете в браузере ( просто не прочитав ни одной записи). Теперь мы хотели бы внести в него изменения, чтобы все работало автономно (включая ресурсы) на разных платформах в качестве мобильного приложения Cordova.


Проблема №1 - загрузка файлов из локальной файловой системы

Он обращается к XHR-запросам для локального файла://ресурсы работают везде но с Chrome, который теперь является стоп-шоу, поскольку Android внутренне переходит к Chrome.

Хорошо, осталось еще 2 варианта:

  • fake-load все в JSONP с тегами script, HTML с iframe и т.д. - это не очень хороший вариант, потому что он требует изменений самих ресурсов + своего рода хакки, и это требует от нас большой функциональности (строковая загрузка только для JS/HTML, arrayBuffer, двоичная и т.д.)
  • используйте API файлов

Plain vanilla File API, к сожалению, всегда требует взаимодействия с пользователем (например, щелчок на поле ввода), чтобы получить ссылку на файл, а IE10 - нет-нет. Хорошо, поэтому единственный вариант - использовать настраиваемый плагин API файлов для PhoneGap - который приносит нам следующую проблему.


Проблема №2 - (кросс-платформенный?) путь к файлам в PhoneGap

Мне нравится PhoneGap CLI - вы вводите несколько команд в терминал, и он управляет файлами и сборками для разных платформ для вас. Или это?

Насколько я могу судить по PhoneGap, вы должны поместить все в папку WWW - однако (как только вы создаете приложение), сумасшедшая вещь - нет простого способа прочитать эти файлы (через File API), откуда их поставляет PhoneGap.

Вы думаете, что fileSystem.root (LocalFileSystem) указывает на эту папку, но по крайней мере на iOS папка WWW находится внутри вашего приложения, но ссылка fileSystem.root указывает на внешнюю папку Documents (все еще нужно проверить это на Android, но я угадываю его снова что-то другое).

После немного возиться я выяснил, как добраться до папки WWW, но ее негибкой, взломанной и кажется, что она не должна работать (iOS только в данный момент):

window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem){
   fileSystem.root.getDirectory("../HelloWorld.app/www", {create: true}, function(entry) { 
      entry.getFile("test.json", {create: false}, function(fileEntry) {
         fileEntry.file(function(file){
            var reader = new FileReader();
            reader.onloadend = function(evt) {
               console.log(evt.target.result);
            };
            reader.readAsText(file);             
         }, fail);
      }, fail);
   });
}, fail);

Это не лучший способ сделать это. Если ничего другого, JS-код теперь должен теперь иметь имя приложения, чтобы иметь возможность доступа к папке WWW (BTW есть ли системный ярлык для этой или системной переменной, которая будет делать доступ к общей папке приложения?).

Но это все равно будет чем-то другим на других платформах.

Я мог бы теоретически "загрузить" изображения из внутренней папки WWW во внешнюю папку "Документы", но:

  • загрузите 50-мегабайтное приложение, а затем внутренне скопируйте 40mb его ресурсов в другую папку только для того, чтобы его можно было получить правильно, не кажется мне подходящим.
  • Документирует собственно корневую папку (на iOS)?

Проблема №3 - лучший способ организовать локальные ресурсы в PhoneGap?

Так почему же /Documents корневой файловой системы в PhoneGap вообще? Согласно Руководство по программированию файловой системы Apple Папка с документами может даже не подойти к чему-то подобному. Похоже, что документы должны использоваться только для контента, созданного пользователями, и файлы/ресурсы данных приложения должны фактически переходить в папку "/Library". Это, между прочим, важно, поскольку некоторые приложения, похоже, отвергаются Apple за то, что они делают это неправильно + это также, конечно, влияет на резервные копии iTunes/cloud.


Итак, теперь, когда мы установили все это:

  • Как вы правильно структурируете локальные файлы/ресурсы в PhoneGap?
  • где/как я размещаю наши ресурсы (JS, JSON, HTML, CSS, media и т.д.), чтобы их можно было скопировать/установить в соответствующую папку для каждой платформы (например,/Library или ok even/Documents on iOS - но не остается встроенным в приложение). И, конечно же, для других платформ.
  • как получить доступ ко всем из них должным образом и кросс-платформенный?
  • (вопрос стороны) - это cordova.js действительно нужно? мы очень усердно работали над тем, чтобы исключить внешние библиотеки и ванильную оптимизацию производительности, поэтому я не слишком сумасшедший, включая другой, чтобы снова принимать события и разные вещи. Я понимаю, что здесь могут быть некоторые внутренние перехватчики - но, может быть, мы могли бы просто включить себя в то, что нам нужно?

Это оказалось более сложным, чем я.

И сколько бы я ни старался, и я ценю усилия, которые многие люди вложили в PhoneGap - мой разум продолжал рисовать параллели между всем этим нелогичным кросс-платформенным поведением и войнами в браузере десять лет назад. На мой взгляд, помимо отображения полноэкранной кросс-платформы браузера приложений, самая важная функция PhoneGap - это простой способ доступа к локальным файлам и ресурсам.

Любые лакомые кусочки знаний и обратной связи всегда приветствуются!

4b9b3361

Ответ 1

Насколько я вижу, существует три способа размещения контента на экране при использовании cordova/phonegap:

  • Сделайте вызов ajax в файл шаблона, а затем $(div).append
  • Все это включено в index.html и show/hide
  • Содержит ли содержимое в файлах js и $(content).appendTo(div)

Я играл вокруг, видя, есть ли у кого-то преимущества, и вот что я узнал (в моих ограниченных тестах):

При первой загрузке шаблоны имеют наименьший объем памяти, а затем встроенные js и включаются в index.html самый высокий.

Но после навигации по нему какое-то время это изменится, и все они сбалансированы примерно до одного (от 1,8 до 2,1 МБ в моих тестах).

Для скорости index.html является самым быстрым, за которым следуют встроенные js, а шаблоны - самые медленные. Однако разница незначительна, стоит десятки миллисекунд.

Я честно не вижу никакой реальной разницы между методами, за исключением того факта, что шаблоны, похоже, не работают на Windows Phone (возможно, это изменится с 10, не знаю). Я предполагаю, что это скорее стиль стиля кодирования, чем жесткое и быстрое правило. Хотя вход от разработчиков cordova/phonegap был бы приятным.

Ответ 2

Я не думаю, что ограничения безопасности Chrome, о которых вы говорите, подходят для веб-просмотра или приложения cordova (и они не относятся к хром, а относятся к любому современному браузеру).

Я тестировал функцию jquery ajax для загрузки ресурсов (json файлов, javascript файлов или html-шаблонов) из файлов, расположенных внутри папки www в приложении phonegap, и он работает в android 2.3, 4.0.4, 4.1.2, а также 4.4.2 на связке 5 (поэтому с использованием нового хромового веб-представления).

Ответ 3

Похоже, вы очень смущены тем, как работает Кордова. Хорошо сделанное приложение SPA будет работать с Кордовой с очень небольшими изменениями, связанными с безопасностью и конфигурациями конфигурации Cordova.

Загрузка статических ресурсов (изображений, html, css)

Нет необходимости размещать эти ресурсы в каком-то месте, кроме местоположения www. С запросами Кордовы XHR работает отлично, если вы используете относительные пути для создания запросов XHR. Поэтому, имея такую ​​структуру папок в вашей папке www

www
|
|- css
|   |- style.css
|- js
|   |- app.js
|- html
|   |- page.html
|
|- index.html

из вашего index.html вы можете делать регулярный запрос, используя

$.get('page.html')

Также убедитесь, что вы установили правильную политику безопасности контента (CSP) в свой index.html. См. Ниже, например.

Динамические ресурсы

Эти ресурсы, которые будут меняться в течение срока службы приложения. И это ресурсы, для которых вы должны использовать File API. Этот API не требует взаимодействия с пользователем в приложении Cordova.

В плагине файлов Cordova есть документация о том, как каждая переменная выравнивается с папками конкретной ОС. Смотрите раздел Где хранить файлы в документах.

Безопасность

Последние изменения в Кордове требуют, чтобы в вашем HTML была указана политика CSP, иначе вы не сможете общаться с внешними ресурсами. Вы можете увидеть учебник HTML5 по CSP для объяснения, а плагин Cordova Whitelist docs для примера, как настроить CSP по-Кордове.

Ответ 4

Существует несколько способов легко структурировать и управлять веб-приложениями Cordova. Я предлагаю XDK от Intel как бесплатное решение для создания и структурирования приложений для телефонов iOS, Android и Windows: https://software.intel.com/en-us/intel-xdk