У нас есть приложение iOS, построенное с помощью PhoneGap/Cordova 4.3.0. Это приложение напрямую загружает внешний веб-сайт, используя <content src="http://example.com/foo" />
в файле config.xml
. Все функциональные возможности содержатся на этом веб-сайте, поэтому мы фактически не используем какие-либо локальные файлы HTML или JS.
Как часть функциональности приложения, мы должны воспроизвести некоторые видео. Поскольку приложение предназначено для работы в автономном режиме, мы хотим кэшировать эти видеоролики локально. Поэтому мы загружаем их на устройство с помощью плагина FileTransfer вместе с другими ресурсами, такими как изображения или PDF файлы. После загрузки файлов мы получаем URL-адреса с протоколом file://
. У нас также есть возможность использовать протокол cdvfile://
. Когда мы используем URL cdvfile://
для показа изображений, изображения отображаются правильно. Однако видео не воспроизводится вообще.
Для воспроизведения видео мы используем стандартные теги HTML5:
<video width="auto" height="100%" controls="controls" autoplay="true">
<source src="..." type="video/mp4" />
</video>
Видео сами работают, и они будут играть правильно из внешнего источника (как в, они будут воспроизводиться, если мы обращаемся к ним с сервера, а не из локальной файловой системы). Я понимаю, что проблема связана с концепциями, связанными с веб-сайтами, такими как политика одного и того же происхождения и с ограничением доступа к локальной файловой системе. Тем не менее, в то же время я должен задаться вопросом, почему именно изображения отлично работают при этих же ограничениях.
То, что я пробовал до сих пор:
- Использование
file://
иcdvfile://
URL-адресов в качествеsrc
видео. Это не дает никакого визуального эффекта. Экран просто черный. - Использование
iframe
сsrc
, установленным для URL-адреса видео. При использованииfile://
экран по-прежнему остается черным. Однако при использованииcdvfile://
появляется интерфейс проигрывателя iOS с кнопкой воспроизведения и полноэкранной кнопкой, но видео не воспроизводится, и также нет временной шкалы. - Добавление локального файла в кордову под названием
video.html
, который принимает URL-адрес в качестве параметра и отображает тегvideo
с этим URL какsrc
. План должен был включить этот файл какiframe
, но, видимо, я не могу сделатьiframe
для локального файла. Я пробовал различные URL-адреса, которые могли бы указывать на этот конкретный файлvideo.html
(хотя на самом деле я не уверен, что это возможно). Среди тех, которые я пробовал, были:cordova.file.applicationDirectory + 'www/video.html'
,http://localhost/www/video.html
,cdvfile://localhost/www/video.html
. - Я искал плагин cordova, который будет воспроизводить видео, но я не смог найти его для iOS. Большинство плагинов, похоже, нацелены на Android.
Теперь, возможно, я ошибаюсь в этом. Как я вижу, "стандартным вариантом использования" для кордовой является то, что вы храните свои файлы HTML/JS/CSS локально. Внешний контент, подобный тому, который я использую, вероятно, немного необычен. Я объясню требования к этому приложению, которые привели меня к использованию этой функции.
- Предполагается, что приложение будет создано для нескольких платформ (хотя мы и начинаем с iOS). Поэтому мы используем PhoneGap.
- Предполагается, что он доступен как онлайн, так и офлайн, хотя весь контент поступает с сервера (контент не создается локально). Вот почему мы загружаем контент и сохраняем его локально.
- Также предполагается автоматическое обновление любой части себя на лету, не требуя обновления из App Store. Вот почему мы используем внешнюю страницу, потому что она имеет
cache.manifest
, которая позволяет нам контролировать обновления кода веб-приложения и в то же время разрешать его кэширование локально. Это, наверное, самое главное, потому что, если мы хотим сохранить некоторые файлы локально в Кордове, нам придется повторно реализовать эту функциональность кеша в Javascript (используя как можно более тонкий слой).
В любом случае, моя главная проблема заключается в том, как заставить эти видео работать. Я готов попробовать самые взломанные обходные пути! Если это действительно невозможно с текущими решениями по развитию, то, возможно, вы могли бы дать мне несколько советов о том, как я должен структурировать приложение, чтобы он работал и выполнял мои требования.
Большое спасибо!