Наконец-то у меня все заработало без использования какой-либо внешней библиотеки.
ПРОБЛЕМА
Для многоплатформенного проекта Phonegap две части отличаются от одной платформы к другой:
- Инкапсулирующий проект
- Файл Phonegap Javacript.
Эти инкапсулирующие проекты обычно не сильно меняются в течение проекта. Было бы желательно иметь одну кодовую базу HTML5, которую можно было бы напрямую вставить (или использовать сценарии сборки) в зависимые от платформы проекты. Поскольку библиотека телефонного промежутка javascript находится внутри набора веб-файлов, каждый раз заменять правильный файл действительно сложно.
МОЕ РЕШЕНИЕ
В моем проекте у меня есть несколько файлов cordova, по одному для каждой целевой платформы:
- cordova.android.js
- cordova.ios.js
- cordoba.bb.js
...
(Обратите внимание, что каждый из этих файлов включен в приложение, даже если он не используется. Для меня это не проблема, так как скрипты включены в приложение и в память загружается только один скрипт для правильной платформы. ).
На своих страницах вместо тега скрипта для phonegap я разместил модуль загрузчика:
<script src="phonegap-loader.js"></script>
И это будет скрипт phonegap-loader.js. Я использую обнаружение пользовательского агента для динамической и синхронной загрузки скрипта:
(function(){
var useragent = navigator.userAgent;
if(/Android/i.test(useragent)){
loadScript('cordova.android.js');
} else if((/iPhone/i.test(useragent)) || (/iPad/i.test(useragent))){
loadScript('cordova.ios.js');
}
...
// Else desktop browser is assumed and no phonegap js is loaded
function loadScript(url){
// synchronous load by @Sean Kinsey
// https://stackoverflow.com/a/2880147/813951
var xhrObj = new XMLHttpRequest();
xhrObj.open('GET', url, false);
xhrObj.send('');
var se = document.createElement('script');
se.text = xhrObj.responseText;
document.getElementsByTagName('head')[0].appendChild(se);
}
})();
Очень важно загрузить скрипт СИНХРОННО. Это дало мне бесчисленные головные боли. Прежде чем понять это, я попытался добавить теги scripts внизу головы и использовать $ .getScript, но ни один из них не работал, так как ondeviceReady
не было запущено. Похоже, единственный действительный подход, обеспечивающий выполнение скрипта Phonegap при динамической загрузке, - это тот, который показан в этом удивительном ответе @Sean Kinsey (все ему благодарны).
Единственным недостатком является то, что скрипт встроен, но для меня это дешевая цена за то, что основное HTML5-приложение окончательно изолировано от контейнеров.