Статьи

Введение в разработку приложений для Firefox OS

Что такое Firefox OS?

Firefox OS — новая мобильная операционная система, созданная 2 года назад. До сих пор в значительной степени экспериментальный, но в прошлом году он был коммерциализирован при поддержке таких компаний, как LG и ZTE, которые являются основными производителями устройств, использующих Firefox OS. Firefox OS создается Mozilla, основным продуктом которой, веб-браузер Firefox, является одним из наиболее часто используемых браузеров в мире. Браузер Firefox важен в истории Интернета, с большим сообществом сторонников и разработчиков приложений. Для общего руководства и общего знакомства с Firefox OS прочитайте статью Джеффа Фризена .

В этой статье мы создадим упакованное приложение. Мы не будем устанавливать симулятор, упомянутый в статье выше, но другой, рекомендованный Mozilla.

Зачем создавать приложение Firefox OS?

Потому что это просто.

Приложения для Firefox OS разрабатываются с использованием HTML5 и поэтому очень просты в освоении и разработке и дают возможность каждому разрабатывать мобильное приложение. Mozilla является сторонником Open Web, она создала API, который облегчает интеграцию приложений с устройством, и работает с W3C, чтобы сделать этот API стандартным. Вы можете получить ценные общие знания, создав приложение для Firefox OS.

Какое приложение мы создаем?

Runner App макет

Я решил создать упрощенную версию существующего приложения на Firefox Marketplace . Это работающее приложение, чтобы узнать, сколько вы пробежали по расстоянию и времени, сколько калорий вы сожгли и свою среднюю скорость.

Приложение содержит только две страницы. Первая страница позволяет пользователю запустить таймер и предоставляет данные в реальном времени. Вторая страница показывает результаты и спрашивает пользователя, хотят ли они запустить снова.

Мы будем использовать Building Blocks, его инфраструктуру и логику. Building Blocks делает приложения Firefox OS более красивыми и естественными. Прежде чем начать, стоит посмотреть на структуру, ее компоненты, как их использовать и как они взаимосвязаны.

Вам также понадобятся плагины цветовой анимации JQuery и Jquery .

Установка симулятора

Обзор диспетчера приложений

Установите симулятор Firefox OS со страницы дополнения Mozilla Firefox App Manager . После установки симулятор можно запустить в браузере Firefox из меню «Инструменты»> «Веб-разработчик»> «Диспетчер приложений» и нажать синюю кнопку « Запустить симулятор» в нижней части окна.

Если у вас есть устройство, доступное для тестирования, также загрузите ADB Helper и соответствующие драйверы. Руководство по установке драйверов в Windows вы можете найти здесь

Давайте начнем

Runner упрощен на GitHub

Разархивируйте загрузку Building Blocks и откройте файл manifest.webapp. Это проще, если мы просто изменим это. Это манифест, который содержит информацию о приложении. Мы назовем приложение «Runner-упрощенный», введите его в поле «name».

Вы можете поместить любое описание и оставить launch_path как есть, это файл, который мы будем использовать для приложения. Не меняйте ссылки на значки, если вы хотите добавить больше значков, просто измените существующие. Мы также добавляем версию приложения, имя разработчика и URL.

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

{ "name": "Runner-simplified", "description": "Run and keep your body in shape.", "launch_path": "/app.html", "permissions": { "geolocation": { "description": "Used to calculate the distance of run" } }, "icons": { "60": "static/images/app_icon_60.png", "128": "static/images/app_icon_128.png" }, "version": "0.8", "developer": { "name": "Your Name", "url": "App`s site" }, "default_locale": "en", "orientation": "portrait-primary" } 

Что мы будем использовать из строительных блоков?

Это приложение будет использовать только два компонента строительных блоков, заголовок и синюю кнопку. Начните с создания файла резервной копии, копии app.html (которую я называю onePageApp.html ). Это упрощает возврат к более ранней стадии разработки. Мы также изменяем файл манифеста, устанавливая этот новый файл (onepageApp.html) в качестве пути запуска.

Давайте код

Удалите все из тела, кроме первого раздела с id = «index» . В этом разделе есть другой подраздел с типом данных «sidebar» (Building Blocks имеет много разных типов данных, которые дают графическое значение идентифицированному элементу). Поскольку нам это не нужно, удалите его тоже. Второй элемент — это другой подраздел, который содержит заголовок. Нам это нужно, поэтому не удаляйте его. Заголовок содержит 2 ссылки, которые использовались боковой панелью, удалите эти ссылки.

Последняя модификация, в которой мы нуждаемся, — это элемент «статья» . Это будет содержать код страницы. В макете вы можете увидеть, что нам нужен текст и кнопка, которая активирует GPS и будет работать до тех пор, пока кнопка не будет нажата. Мы также удаляем div с типом данных « list» внутри статьи, так как он нам не понадобится. Теперь у нас есть пустая страница.

Это внешний вид тела после этих изменений:

 <section id="index" data-position="current"> <section role="region"> <header class="fixed"> <h1>Building Blocks <em>demo</em></h1> </header> <article class="scrollable header"> </article> </section> </section> <!-- end index --> <script type="text/javascript" defer src="js/status.js"></script> <script type="text/javascript" defer src="js/seekbars.js"></script> <script type="text/javascript" defer src="js/app.js"></script> 

Измените заголовок, поместив заголовок из макета.

 <header class="fixed"> <h1>Run <em>and keep your body in shape</em></h1> </header> 

Добавьте два div для текста и кнопки. Внутри первого div добавьте h2 для текста, а во втором div добавьте span для кнопки.

 <article class="scrollable header"> <div> <h2>Press the button and start running</h2> </div> <div> <span id="runButton"><span>Run</span></span> </div> </article> 

Давайте добавим немного CSS, чтобы сделать его более привлекательным. В основной каталог добавьте файл с именем style.css и включите его.

Добавьте эти строки CSS:

 #index h2{ text-align: center; margin-top: 60px; } #runButton{ display: block; margin: 80px auto; width: 100px; height: 100px; border-radius: 999px; border: 10px solid green; font-size: 26px; } #runButton span{ display: block; padding-top: 34px; padding-bottom: 34px; margin: 0 auto; text-align: center; } 

Теперь давайте сделаем вторую страницу, которая может быть модификацией первой. Скройте заголовок h2 . Мы изменим текст кнопки с «Run» на «Stop» и напечатаем текст, который показывает расстояние и время, пройденное пользователем. Этот текст будет обновляться каждые секунды. Мы сделаем это с помощью jQuery. Мы включили jquery.js и другие библиотеки JavaScript, а также плагин jQuery для цветной анимации.

 <script type="text/javascript" src="js/jquery-2.1.0.min.js"></script> <script type="text/javascript" src="js/jquery.animate-colors-min.js"></script> 

Теперь, когда у нас есть работающий образец, мы можем проверить его в симуляторе. Перейдите в менеджер приложений, нажмите « Запустить симулятор» и выберите Firefox OS 1.3 (могут быть другие версии симулятора). С помощью симулятора вы можете увидеть, как приложение выглядит на устройстве.

Нажмите «Добавить упакованное приложение», перейдите к файлу манифеста и нажмите «Обновить». Это установка приложения в симулятор или обновление, если приложение было установлено ранее. Рядом с кнопкой обновления есть кнопка консоли, которая помогает нам отлаживать.

Давайте добавим немного JavaScript, чтобы скрыть заголовок и изменить цвет текста и границы кнопки. Мы помещаем это в конец документа.

 <script> $("#runButton").on("click", function(){ if($(this).find("span").html() === "Run"){ $(this).find("span").html("Stop"); $(this).animate({"borderColor": "red"}, "fast"); $("#index").find("h2").slideUp(); $("#realTimeStats").slideDown(); }else{ $("#realTimeStats").slideUp(); $("#index").find("h2").slideDown(); $(this).find("span").html("Run"); $(this).animate({"borderColor": "green"}, "fast"); } }); </script> 

Здесь мы создаем обработчик события для кнопки запуска. Если текст кнопки «Выполнить», он изменяется на «Стоп» (и наоборот), а граница меняет свой цвет с помощью плагина jQuery jquery.animate-colors-min.js. Функции slideUp () и slideDown () — две функции, которые делают элемент видимым или скрытым с помощью простой анимации.

До сих пор у нас была кнопка, которая изменяет текст и его цвет рамки, заголовок h2 и данные в реальном времени, которые становятся скрытыми и видимыми при нажатии кнопки. Теперь добавим код, чтобы найти координаты и расстояние пробега. Удалите весь код в app.js и добавьте это:

 var distance = 0; var locationCords = { firstPos: null, secondPos: null }; var distanceInterval; function getLocation() { // Gets the current position navigator.geolocation.getCurrentPosition(function(position) { if(locationCords.firstPos === null){ locationCords.firstPos = position.coords; }else{ locationCords.secondPos = locationCords.firstPos; locationCords.firstPos = position.coords; distance += calculateDistance(locationCords.secondPos, locationCords.firstPos); } }, function(error){ // error handling switch(error.code){ case error.PERMISSION_DENIED: alert("User denied the request for Geolocation."); break; case error.POSITION_UNAVAILABLE: // Some error handling here break; case error.TIMEOUT: // Some error handling here break; case error.UNKNOWN_ERROR: // Some error handling here break; } }); } function calculateDistance(loc1, loc2) { var R = 6371; // km var dLat = (loc2.latitude-loc1.latitude).toRad(); var dLon = (loc2.longitude-loc1.longitude).toRad(); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(loc1.latitude.toRad()) * Math.cos(loc2.latitude.toRad()) * Math.sin(dLon/2) * Math.sin(dLon/2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = R * c; return d * 1000; //meters } Number.prototype.toRad = function() { return this * Math.PI / 180; }; 

Сначала мы создаем 3 переменные:

  • «Расстояние» , которое содержит пробег
  • «LocationCoords» , который содержит текущие и последние координаты
  • « DistanceInterval » , который содержит интервал, в котором вызывается функция getLocation () .

Внутри обработчика событий функции мы создаем интервал, который выполняется каждые 10 секунд, и после нажатия «Стоп» этот интервал прерывается и переменные сбрасываются. Это достигается путем вызова clearInterval () с distanceInterval в качестве аргумента.

 $("#runButton").on("click", function(){ if($(this).find("span").html() === "Run"){ $(this).find("span").html("Stop"); ... distanceInterval = setInterval(function(){getLocation()}, 10000); // Add this }else{ ... clearInterval(distanceInterval); // And this } }); 

Мы также добавляем еще один интервал, который обновляет данные выполнения, «timeInterval», который содержит это значение.

 $("#runButton").on("click", function(){ if($(this).find("span").html() === "Run"){ ... startTime = new Date().getTime(); timeInterval = setInterval(function(){timeLeft()}, 1000); distanceInterval = setInterval(function(){getLocation()}, 5000); }else{ ... clearInterval(timeInterval); clearInterval(distanceInterval); $("#hours").html(0); $("#minutes").html(0); $("#seconds").html(0); $("#meters").html(0); } }); 

Мы добавляем еще одну переменную с именем «startTime», которая содержит время в начале цикла. Мы создаем интервал для обновления времени, вызывая функцию timeLeft () .

Мы добавляем этот код в app.js. Это позволяет рассчитать время и обновить время и расстояние.

 function timeLeft(){ var thisTime = new Date().getTime(); var seconds = Math.floor((thisTime - startTime)/ 1000); var hours = Math.floor(seconds/3600); var minutes = Math.floor((seconds - (hours * 3600))/60); var seconds = Math.floor(seconds - (hours * 3600) - (minutes * 60)); $("#hours").html(hours); $("#minutes").html(minutes); $("#seconds").html(seconds); $("#meters").html(Math.floor(distance)); } в function timeLeft(){ var thisTime = new Date().getTime(); var seconds = Math.floor((thisTime - startTime)/ 1000); var hours = Math.floor(seconds/3600); var minutes = Math.floor((seconds - (hours * 3600))/60); var seconds = Math.floor(seconds - (hours * 3600) - (minutes * 60)); $("#hours").html(hours); $("#minutes").html(minutes); $("#seconds").html(seconds); $("#meters").html(Math.floor(distance)); } 

Остается только страница, на которой пользователь видит результаты запуска. Мы создаем новый раздел без заголовка. Давайте скопируем раздел из app.html строительных блоков и отредактируем его. Мы ставим id и его позицию данных как «правильные». Используя эти позиции данных, мы можем осуществлять переходы с одной страницы на другую. Мы оставляем только элемент статьи, так как другие нам не нужны.

 <section role="region" id="viewResultsPage" data-position="right"> <article class="content scrollable header"> <div style="text-align: center;"> <div><h2>You have run <em id="resMeters"></em> meters.</h2></div> <div><h2>You have rund <em id="spanHours"></em> H <em id="spanMinutes"></em> M <em id="spanSeconds"></em> S.</h2></div> <div><h2>Your avarage speed is <em id="avarageSpeed"></em> m/s</h2></div> <button class="recommend" style="margin-top: 150px;">Run Again</button> </div> </article> </section> 

Нам нужно добавить переход из раздела с id = «index» в раздел с id = «viewResultsPage» .

 $("#runButton").on("click", function(){ if($(this).find("span").html() === "Run"){ ... }else{ ... $("#viewResultsPage").removeClass("right"); $("#viewResultsPage").addClass("current"); $("#index").addClass('left'); } }); 

Проверьте это снова в симуляторе. Просто нажмите обновить до менеджера приложений и посмотрите результат.

Мы выбираем раздел с id = «viewResultsPage», удаляем класс «right» и добавляем класс «current». В разделе с id = «index» добавьте класс «left». Чтобы вернуться в раздел с id = «index», просто добавьте эти классы обратно.

 $("#viewResultsPage").find("button").on("click", function(){ $("#viewResultsPage").addClass("right"); $("#viewResultsPage").removeClass("current"); $("#index").removeClass('left'); }); 

Это простой обработчик события для кнопки «Выполнить снова», который обращает то, что мы сделали, чтобы получить от индекса до viewResultsPage.

Последнее, что нужно, — это напечатать данные прогона в viewResultsPage и сбросить каждую переменную для нового прогона.

 function timeLeft(){ ... $("#emMeters").html(Math.floor(distance)); $("#emHours").html(hours); $("#emMinutes").html(minutes); $("#emSeconds").html(seconds); $("#avarageSpeed").html(Math.floor(distance/((hours*3600) + (minutes*60) +seconds))); } $("#viewResultsPage").find("button").on("click", function(){ ... startTime = 0; distance = 0; locationCords.firstPos = null; locationCords.secondPos = null; }); в function timeLeft(){ ... $("#emMeters").html(Math.floor(distance)); $("#emHours").html(hours); $("#emMinutes").html(minutes); $("#emSeconds").html(seconds); $("#avarageSpeed").html(Math.floor(distance/((hours*3600) + (minutes*60) +seconds))); } $("#viewResultsPage").find("button").on("click", function(){ ... startTime = 0; distance = 0; locationCords.firstPos = null; locationCords.secondPos = null; }); 

Вывод

Создать приложение Firefox OS не сложно, это легко для любого, кто имеет опыт в веб-разработке. Использование строительных блоков делает это еще проще. Firefox OS — это новая мобильная ОС, которая делает шаги, которые ранее не делала ни одна другая ОС. Я верю, что Open Web принесет новую эпоху в сеть, а Firefox OS и Mozilla прилагают фантастические усилия.

Что вы думаете о Firefox OS?