<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Firefox OS - русскоязычный форум по Firefox ОС — Статьи, советы, исходники]]></title>
		<link>https://firefoxforum.ru/index.php</link>
		<atom:link href="https://firefoxforum.ru/extern.php?action=feed&amp;fid=11&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[The most recent topics at Форум Firefox OS - русскоязычный форум по Firefox ОС.]]></description>
		<lastBuildDate>Tue, 24 Mar 2026 10:32:20 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[I am the new guy]]></title>
			<link>https://firefoxforum.ru/viewtopic.php?id=299&amp;action=new</link>
			<description><![CDATA[<p>Любовь к веб-сайту -- действительно индивидуально дружелюбно и отличных предложений, чтобы увидеть! Посетите также мою страничку <a href="https://banksh.ru/kak-poluchit-besplatnyy-i-bystryy-zaym/">кредит под низкий процент</a> <a href="https://banksh.ru/antarctic-wallet-innovatsionnyy-kriptovalyutnyy-koshelyok-ili-risk-dlya-polzovateley/">получить расчет ипотечного платежа</a> <a href="https://banksh.ru/overdraft/">кредитные карты условия</a></p>]]></description>
			<author><![CDATA[null@example.com (LatonyaPin)]]></author>
			<pubDate>Tue, 24 Mar 2026 10:32:20 +0000</pubDate>
			<guid>https://firefoxforum.ru/viewtopic.php?id=299&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Just wanted to say Hi.]]></title>
			<link>https://firefoxforum.ru/viewtopic.php?id=285&amp;action=new</link>
			<description><![CDATA[<p>Ого, ты уже пробовал платить криптой по QR-коду?<br />С криптой жизнь становится круче, согласен? Представь: ты в кафе, заказал сочный бургер, а вместо карты или налички просто сканируешь QR-код и — бац! — оплата ушла за секунду. Это новый уровень платежей, и я расскажу, как оно работает. <a href="https://baoly.ru/antarctic_wallet">Секрет мгновенной криптооплаты — QR!</a></p><p>Серьёзно, первый раз оплатил доставку криптой через QR, и это было будто я хакер. Больше не нужно вбивать кучу данных. Это реально затягивает, держу пари, тебе зайдёт. <br />Что за магия с QR-кодом?<br />Секрет прост: нужен кошелёк с QR-функцией. Скачай, например, Coinbase Wallet, или любое приложение, где есть сканер QR-кодов. В магазине или онлайн тебе показывают QR-код, ты его проверяешь, жмёшь «Оплатить», и готово! <a href="https://baoly.ru/antarctic_wallet">не зная адреса?</a></p><p>Самое крутое — это скорость. Плюс, это безопасно: QR-код шифрует данные, так что твои эфиры в надёжных руках. Я как-то оплатил доставку пиццы через QR, и всё прошло гладко, как по маслу! <br />Где это работает?<br />Платить криптой через QR можно уже в куче мест. Видел, как в сервисах всё чаще берут крипту по QR? Просто ищи значок крипты на кассе или спроси у продавца — они обычно в курсе. <a href="https://baoly.ru/antarctic_wallet">QR и крипта — решение для новичков</a></p><p>Онлайн это ещё проще: многие платформы добавляют оплату криптой через QR. Заходишь на сайт, выбираешь «Оплатить криптовалютой», сканируешь QR-код, и всё готово! Я недавно так купил игру — и это реально удобно. <br />Почему это круто?<br />Оплата криптой по QR-коду — это не только быстро, но и шаг в будущее. Забудь про лишние проверки — крипта и QR решают всё! А ещё это не светит твои финансы, что всегда плюс. <br />Честно, платить криптой через QR — это прям будто в игре! Сканируешь QR, подтверждаешь, и бац — ты уже на волне технологий! Рискни, и тебе точно зайдёт! <a href="https://baoly.ru/antarctic_wallet">Почему стоит платить криптой через QR-код</a></p><p>Готов попробовать?<br />Честно, оплата криптой по QR-коду — это будущее, и оно уже здесь! Сделай одну оплату через QR, и, спорим, ты не захочешь иначе? Бери телефон, попробуй оплатить — и делись впечатлениями! <br />А ты уже пробовал платить криптой по QR? Какой у тебя опыт?<br /><a href="https://banksh.ru/antarctic-wallet-innovatsionnyy-kriptovalyutnyy-koshelyok-ili-risk-dlya-polzovateley/">Новичку о криптооплате по QR</a></p>]]></description>
			<author><![CDATA[null@example.com (Berenice38)]]></author>
			<pubDate>Thu, 12 Mar 2026 14:06:24 +0000</pubDate>
			<guid>https://firefoxforum.ru/viewtopic.php?id=285&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Как в 2026 получить на 40% больше заявок без роста рекламного бюджета]]></title>
			<link>https://firefoxforum.ru/viewtopic.php?id=268&amp;action=new</link>
			<description><![CDATA[<p>Здравствуйте! </p><p>Знаю, как бывает: стараешься, вкладываешь в рекламу время и деньги ??, а результат всё равно не радует ??. Клиенты приходят нестабильно, бюджет уходит быстрее, чем хотелось бы, а конкуренты почему-то всегда на шаг впереди ???&gt;?. </p><p>В 2026 году в России это знакомо многим — реклама в Яндексе стала дороже ??, органика в соцсетях почти не растёт без постоянной работы ??, а старые подходы уже не дают того же эффекта. </p><p>Я помогаю именно с такими ситуациями уже больше 7 лет ?????. Работаю с бизнесами в сфере товаров и услуг — клиниками, магазинами, производствами, сервисами — и вижу, что чаще всего проблема не в том, что «не везёт», а в том, что маркетинг работает разрозненно: Директ сам по себе, сайт отдельно, соцсети отдельно, карты заброшены, нет четкой аналитики и системы ведения бизнеса ??. </p><p>А только система даёт результат и преимущество в бизнесе ??. </p><p>Поэтому я за комплексный подход на основе особенностей и ситуации в Вашем бизнесе. Чтобы дальше бизнес получал клиентов более стабильно и без вашего ежедневного участия в настройках ???. </p><p>Что именно входит: </p><p>• Аудит и полная перестройка Яндекс.Директ (поиск + РСЯ + автостратегии) ?? Посмотрим, что сейчас работает, уберём неэффективные кампании, настроим умные стратегии — обычно это даёт заметно ниже цену трафика и больше целевых обращений ?? </p><p>• Создание удобного лендинга или многостраничника, который действительно помогает конвертировать посетителей в заявки ?? С понятными формами, квизами, отзывами — чтобы люди не уходили, а оставляли контакты ?? </p><p>• Запуск и сопровождение каналов в ТГ или Макс + чат-боты ?? Канал будет регулярно пополняться полезным контентом, а бот поможет быстро записывать клиентов (особенно удобно для услуг, клиник, салонов) ?? Это хорошо повышает повторные обращения ?? </p><p>• Оформление и продвижение в Яндекс.Картах: красивый профиль, работа с отзывами ? Чтобы вас чаще находили локально и приходили заявки без большого бюджета на рекламу ??? </p><p>• Ведение соцсетей — регулярный контент, сторис, общение с аудиторией ?? Не просто посты, а чтобы люди подписывались, доверяли и в итоге обращались ?? </p><p>• Нейромаркетинг с ИИ: анализ вашей аудитории, помощь в создании креативов, текстов и персонализированных объявлений ?? ИИ сейчас хорошо помогает делать рекламу точнее и интереснее для людей ?? </p><p>Аудит по Вашей ситуации проведу бесплатно ??, от Вас – только 20 минут времени для открытого диалога ??. Конкретно под Вас можем выбрать наиболее подходящие и эффективные инструменты. </p><p>Сейчас хороший момент начать: в 2026 году те, кто уже использует комплекс и ИИ, получают преимущество ?. А места у меня ограничены — беру не больше 5 проектов в месяц, чтобы каждому уделить внимание ??. </p><p>Если интересно — позвоните мне по тел +7 958 578 67 84 ?? или пишите в ТГ @alex_x_imp ?? </p><p>Буду рад помочь разобраться и запустить то, что будет работать стабильно ?? </p><p>С уважением, Алексей +7 958 578 67 84 | @alex_x_imp</p>]]></description>
			<author><![CDATA[null@example.com (Dariussussy)]]></author>
			<pubDate>Sat, 07 Mar 2026 05:44:20 +0000</pubDate>
			<guid>https://firefoxforum.ru/viewtopic.php?id=268&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Разработка приложения для Firefox OS на реальном примере]]></title>
			<link>https://firefoxforum.ru/viewtopic.php?id=92&amp;action=new</link>
			<description><![CDATA[<p>Активный участник нашего форума, юзер<br />Vladimir Sinotov<br />поделился ссылкой на полезную статью на Хабрахабре, я же для удобства скопирую её сюда:<br />Мобильные приложения созданные с помощью веб-технологий понемногу захватывают мир. Но создание таких приложений, под популярные платформы, связанны с кучей проблем — от неизвестных истории багов, зоопарка размеров экрана, до проблем с производительностью, которые не решаются просто переписыванием тонких мест.<br />Но к счастью, этот топик не будет наполнен обыденной трагедией разработки, подобных приложений. Поскольку сегодня, я покажу на реальном примере, как разрабатывать приложения под Firefox OS, которая поддерживает большую часть современных веб-технологий, и вообще говоря создана для них и благодаря им.<br />Рецепт<br />Для приготовления нам понадобиться:<br />0) Апи какого-нибудь сервиса, в нашем случае это ФотоФания (не сочтите за рекламу).<br />1) Angular js — в качестве основы<br />2) buildingfirefoxos.com/building-blocks/ — заготовки ui-блоков<br />3) jQuery и прочие либы по вкусу<br />0) Апи<br />Поскольку хочется показать реальное приложение, то и апи надо использовать реальное. ФотоФания это сайт с помощью которого из своих скучных сэлфи можно создать веселые фоточки. Так что нам, немного, придется работать с изображениями на клиенте (хотя основная работа будет происходить на сервере, разумеется).<br />1) Angular js<br />Angular хорош. Конечно у меня есть притенении к нему, с точки зрения производительности на мобильных девайсах, но он позволяет отстранится от рутинного кода, обновлений элементов и прочего, занимаясь только данными. Кроме того, приложение на Angular без особых усилий получается отлично структурированным.<br />2) Building Blocks<br />Building Blocks — это готовые элементы дизайна, взятые (частично) из исходников Gaia — UI прослойки Firefox OS. Эти заготовки не используют js, вся логика, которая там есть, реализована через псевдо-селекторы. При этом, весь код написан с помощью html5 элементов, и использует data-* атрибуты для обозначения роли блока.<br />Еще я заметил важную вещь — код Building Blocks работает быстрее и плавнее чем код, который я написал сам, как бы я не старался. По крайней мере, это касается списков. Возможно определённые элементы ускоряются нативно — не уверен насколько это правда. Так что по возможности пользуйтесь заготовками — они ускоряют разработку, делают приложение похожим на нативное и делают его плавнее.<br />3) jQuery и прочие<br />Вообще говоря, я бы с радостью избавился от jQuery, но он является зависимостью плагина для пинч-зума github.com/segdeha/jquery-pan-zoom. Подсадить плагин на Zepto не получилось. К счастью jQuery можно билдить из тех кусков которые вам нужны. Поэтому я беспощадно избавился от SIzzle и прочих ненужных в быту вещей.<br />Немного о структуре<br />Структуру приложения каждый использует какую хочет. В моем случае она похожа на<br />/build/ /build.js /build.css /scripts/ /vendors/ /controllers/ /services/ /.../ /app.js /dictionary.js /config.js /styles/ /helpers/ /variables.less /mixins.less /main.less /header.less /... /images/ index.html<br />Скрипты и стили билдятся с помощью grunt в реальном времени. А grunt release уже все минифицирует. Так же я использую grunt-angular-templates который все шаблоны превращает в js код, который так же добавляется в build.js<br />Первоначальная разметка страницы<br />&lt;!doctype html&gt; &lt;html ng-app=&quot;PhotoFunia&quot; ng-csp&gt; &lt;head&gt; &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot;&gt; &lt;meta charset=&quot;UTF-8&quot;&gt; &lt;title&gt;PhotoFunia&lt;/title&gt; &lt;link rel=&quot;stylesheet&quot; href=&quot;build/build.css&quot;/&gt; &lt;/head&gt; &lt;body role=&quot;application&quot;&gt; &lt;!-- Прелоадер, который показывается при старте. Я не выношу его в отдельный файл, в надежде что так будет быстрее--&gt; &lt;section ng-controller=&quot;PreloaderController&quot;&gt; &lt;div id=&quot;preloader&quot; ng-hide=&quot;preloaderHide&quot;&gt; &lt;div class=&quot;preloader-content&quot;&gt; &lt;div class=&quot;logo&quot;&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/section&gt; &lt;!-- Это наш дроуэр (меню) которое будет выдвигаться слева --&gt; &lt;section data-type=&quot;sidebar&quot; ng-include=&quot;VIEWS.DRAWER&quot;&gt;&lt;/section&gt; &lt;!-- Это наш контент. Не знаю почему у него id=&quot;drower&quot; так нам сказал building blocks --&gt; &lt;section id=&quot;drawer&quot; role=&quot;region&quot; ng-view ng-class=&quot;{&#039;menu-opened&#039;: drawerOpened}&quot;&gt;&lt;/section&gt; &lt;!-- Это своеобраный toast для FF OS. http://buildingfirefoxos.com/building-blocks/status.html --&gt; &lt;section role=&quot;status&quot; ng-controller=&quot;ToastController&quot;&gt; &lt;p ng-if=&quot;text&quot; ng-bind=&quot;text&quot;&gt;&lt;/p&gt; &lt;/section&gt; &lt;!-- Тут скрывается универсальный код для попапов --&gt; &lt;section ng-include=&quot;VIEWS.POPUP&quot;&gt;&lt;/section&gt; &lt;script src=&quot;build/build.js&quot;&gt;&lt;/script&gt; &lt;/body&gt; &lt;/html&gt;<br />Важно<br />Думаю некоторые заметили ng-csp в элементе. Эта директива включает поддержку Content Security Policy — и это является обязательным, для создания приложения для Firefox OS. Кроме того, нам надо немного пропатчить сам angular!<br />Ищем в коде angular строчку window.XMLHttpRequest(); и заменяем на window.XMLHttpRequest({mozSystem: true});<br />А так же нам надо добавить руками в наши стили — вспомогательные стили angular.js. А именно — code.angularjs.org/1.2.16/angular-csp.css<br />Немного о js<br />Надо заметить, что я изначально пишу код на coffeescript, но буду вам показывать его javascript аналог. Возможно где-то всплывут неточности — тогда мы вместе их исправим.<br />Еще я надеюсь, что вы знакомы с angular и js достаточно хорошо, чтобы мне не останавливаться на каждом шагу. Иначе эту статью никто никогда в жизни не дочитает.<br />Мультиязычность<br />Наше приложение будет мультиязычным. Поэтому нам требуется словарь, его интерпретатор и какая-нибудь директива или фильтр, чтобы вставлять слова в код. Часто когда речь заходит об мультиязычности с помощью angular — всплывают какие-то фильтры, которые выглядят не очень приятно. Например нам предлагают писать так &lt;div ng-bind=&quot;&#039;header_search_title&#039; | l10n&quot;&gt;&lt;/div&gt; меня это немного корежит — зачем вызывать каждый раз лишнюю функцию и писать такой неудобный код, если можно просто использовать словарь в глобал-скоупе, и обращаться к нему? Например так &lt;div ng-bind=&quot;m.header.search.title&quot;&gt;&lt;/div&gt;. За всё время моей работы, такой способ меня не подводил. Давайте же его и реализуем.<br />Хочется чтобы он был любой вложенностью, поддерживал любое количество языков. Без проблем!<br />var DICTIONARY = { header: { search: { title: { ru: &#039;Поиск&#039;, en: &#039;Search&#039; }, favorites: { ru: &#039;Избранное&#039;, en: &#039;Favorites&#039; } } }, cancel: { ru: &#039;Отмена&#039;, en: &#039;Cancel&#039; } };<br />Структура есть, теперь, чтобы не обращаться напрямую переменной (а не языку), надо написать небольшой парсер.<br />App.run([&#039;$rootScope&#039;, function ($rootScope) { var lang = &#039;ru&#039;; // тут должна быть какая-то логика <img src="https://firefoxforum.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /> $rootScope.m = (function() { var parse = function(obj, result) { result = result || {}; for (var key in obj) { var value = obj[key]; if (typeof value !== &quot;object&quot;) return obj[lang]; result[key] = parse(value); } return result; }; return parse(DICTIONARY); })(); }]);<br />То есть мы просто рекурсивно доходим, до того момента, когда значение переменной становится не объектом, и возвращаем значение с нужным языком. Все просто, и теперь у нас есть переменная m в рут-скоупе, к которой мы можем смело обращаться.<br />Кто-то наверняка засомневается в производительности такого решения, но могу вас уверить, что это капля в море. И вообще вам никто не мешает написать директиву, которая не будет вешать ватчер на переменную. Так что все в порядке.<br />Вернемся к разметке<br />Давайте доделаем drawer (Меню). Допустим у нас есть уже основа в виде js. Есть контроллер который обслуживает наше меню, и мы уже получили с помощью апи список категорий, которые будем выводить в меню. Тогда код меню получается очень простым.<br />Как видно, в своей разметке index.html мы уже использовали часть кода из Building Blocks. Сейчас мы возьмем код Drawer&#039;a и немного изменим под себя. buildingfirefoxos.com/building-blocks/drawer.html<br />&lt;nav ng-controller=&quot;DrawerController&quot;&gt; &lt;div class=&quot;empty-space&quot;&gt;&lt;/div&gt; &lt;ul&gt; &lt;li&gt; &lt;a ng-click=&quot;go(&#039;/favorites&#039;); closeDrawer()&quot;&gt; &lt;span class=&quot;text&quot; ng-bind=&quot;m.menu.favorite&quot;&gt;&lt;/span&gt; &lt;span class=&quot;counter&quot; ng-bind=&quot;favorite.get().length&quot;&gt;&lt;/span&gt; &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2 ng-bind=&quot;m.category.title&quot;&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li ng-repeat=&quot;cat in categories&quot;&gt; &lt;a ng-click=&quot;openCategory(cat.key)&quot;&gt; &lt;span class=&quot;text&quot; ng-bind=&quot;cat.title&quot;&gt;&lt;/span&gt; &lt;span class=&quot;counter&quot; ng-bind=&quot;cat.count&quot;&gt;&lt;/span&gt; &lt;span class=&quot;new-counter&quot; ng-if=&quot;cat.new_count&quot; ng-bind=&quot;&#039;+&#039;+cat.new_count&quot;&gt;&lt;/span&gt; &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/nav&gt;<br />Как видно у нас два списка в меню, в самом верхнем лежит только одна ссылка на избранное (заметили что мы уже используем нашу переменную m?), там же выводится кол-во избранных фотоэффектов, сбоку. Ниже у нас, собственно, сам список категорий.<br />И для полноты картины сделаем еще одну страницу — список эффектов, то есть страница категории.<br />buildingfirefoxos.com/building-blocks/headers.html — тут берем хедеры<br />buildingfirefoxos.com/building-blocks/lists.html — тут списки<br />buildingfirefoxos.com/building-blocks/filters.html — тут фильтры (табы)<br />buildingfirefoxos.com/building-blocks/buttons.html — а тут кнопочки<br />И получаем, упрощенно, что-то такое:<br />&lt;!-- Наш хедер, собсвенной персоной --&gt; &lt;header&gt; &lt;menu type=&quot;toolbar&quot;&gt; &lt;!-- Кнопочка для поиска --&gt; &lt;a ng-click=&quot;go(&#039;/search&#039;)&quot;&gt; &lt;span class=&quot;icon action-icon search&quot;&gt;&lt;/span&gt; &lt;/a&gt; &lt;/menu&gt; &lt;!-- Две кнопки для открытия / закрытия меню (drawer) --&gt; &lt;a ng-click=&quot;closeDrawer()&quot;&gt;&lt;span class=&quot;icon icon-menu&quot;&gt;&lt;/span&gt;&lt;/a&gt; &lt;a ng-click=&quot;openDrawer()&quot;&gt;&lt;span class=&quot;icon icon-menu&quot;&gt;&lt;/span&gt;&lt;/a&gt; &lt;h1 ng-bind=&quot;category.title&quot;&gt;&lt;/h1&gt; &lt;/header&gt; &lt;div role=&quot;main&quot; data-type=&quot;list&quot; id=&quot;category&quot;&gt; &lt;!-- Табы, которые устанавливают сортировку эффектов --&gt; &lt;ul role=&quot;tablist&quot; data-type=&quot;filter&quot; data-items=&quot;2&quot;&gt; &lt;li role=&quot;tab&quot; aria-selected=&quot;{{ sorting === &#039;new&#039;}}&quot;&gt; &lt;a ng-click=&quot;setSorting(&#039;new&#039;)&quot; text=&quot;m.category.new&quot;&gt;&lt;/a&gt; &lt;/li&gt; &lt;li role=&quot;tab&quot; aria-selected=&quot;{{ sorting === &#039;popular&#039;}}&quot;&gt; &lt;a ng-click=&quot;setSorting(&#039;popular&#039;)&quot; text=&quot;m.category.popular&quot;&gt;&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;!-- И наши эффекты собственной персоной --&gt; &lt;ul class=&quot;effects&quot;&gt; &lt;li ng-repeat=&quot;effect in effects&quot; ng-click=&quot;openEffect(effect.key)&quot;&gt; &lt;aside class=&quot;pack-end&quot;&gt; &lt;img ng-src=&quot;{{CONFIG.DOMAIN + effect.icon}}&quot;&gt; &lt;/aside&gt; &lt;a&gt; &lt;p ng-bind=&quot;effect.title&quot;&gt;&lt;/p&gt; &lt;p ng-if=&quot;effect.labels&quot;&gt; &lt;span ng-repeat=&quot;label in effect.labels&quot; ng-class=&quot;label&quot; class=&quot;label&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;!-- Кнопочка для подгрузки эффектов --&gt; &lt;div class=&quot;load-more&quot; ng-if=&quot;isNeedMore &amp;&amp; effects.length&quot;&gt; &lt;button ng-click=&quot;showMore()&quot; text=&quot;m.category.show_more&quot;&gt;&lt;/button&gt; &lt;/div&gt; &lt;/div&gt;<br />Надеюсь все понятно. А понять надо следущее — мы берем готовые блоки и вырезаем из них самое нужное нам. Ими можно крутить и вертеть как угодно.<br />Таким же образом делаются все остальные страницы.<br />Об API Firefox OS<br />В приложениях Firefox OS версии &gt;= 1.3 input[file] работать не будет, в замен его, нам предлагают пользоваться MozActivity. Что даже упрощает работу.<br />Вот так выглядит получение картинки:<br />var pick = new MozActivity({ name: &quot;pick&quot;, data: { type: [&quot;image/*&quot;], nocrop: true } }); pick.onsuccess = function() { var blob = pick.result.blob; // что-то делаем с блобом };<br />Вот так шеринг:<br />[url]new MozActivity({<br />name: &quot;share&quot;,<br />data: {<br />type: &quot;image/*&quot;,<br />number: 1,<br />blobs: [blob]<br />}<br />});[/url]<br />И примерно так — сохранение:<br />var sdcard = navigator.getDeviceStorage(&quot;sdcard&quot;); var request = sdcard.addNamed(blob, name); request.onsuccess = function() {}; request.onerror = function() {};<br />После того, как приложение готово, его надо сбилдить и протестировать.<br />Чтобы билдить — можно использовать эмуляторы.<br />Я вам предлагаю использовать Менеджер приложений, который встроен по умолчанию в новые версии firefox. developer.mozilla.org/ru/docs/Mozilla/F … pp_Manager. Тут же можно устанавливать разные версии эмуляторов, подключать девайсы и дебажить! Что очень удобно.<br />Так же нам нужен манифест приложения. Выглядит и пишется он очень просто.<br />Приведу пример:<br />{ &quot;name&quot;: &quot;PhotoFunia&quot;, &quot;description&quot;: &quot;PhotoFunia is the best way to add a spark to your photos, make them special and more original.&quot;, &quot;launch_path&quot;: &quot;/index.html&quot;, &quot;version&quot; : &quot;1&quot;, &quot;type&quot;: &quot;privileged&quot;, &quot;developer&quot;: { &quot;name&quot;: &quot;&quot;, &quot;email&quot; : &quot;&quot; }, &quot;default_locale&quot;: &quot;en&quot;, &quot;icons&quot;: { &quot;256&quot;: &quot;/images/app_icon_256.png&quot; }, &quot;permissions&quot;: { &quot;device-storage:pictures&quot;: { &quot;description&quot;: &quot;Save result images&quot;, &quot;access&quot;: &quot;readwrite&quot; }, &quot;device-storage:sdcard&quot;: { &quot;description&quot;: &quot;Save result images&quot;, &quot;access&quot;: &quot;readwrite&quot; }, &quot;mobilenetwork&quot;: { &quot;description&quot;: &quot;Check for available connection&quot; }, &quot;systemXHR&quot;: { &quot;description&quot;: &quot;Need for internet connection&quot; } } }<br />Собственно говоря, засовываем все нужные файлы в .zip архив и отправляем в marketplace.firefox.com на проверку. Через пару дней (а может и к вечеру) приложение появится в маркете!<br />Что это было?<br />Я хотел донести до вас, что разработка под Firefox OS это очень просто, интересно и весело! Конечно, пока что, на этом денег не заработать. Но можно подумать, мы здесь ради денег собрались. Так что, берите IDE в руки, и создавайте приложения под Firefox OS!<br />Тем, лучшим из нас, у кого есть девайс на Firefox OS — прошу к столу marketplace.firefox.com/app/photofunia/<br />Отсюда</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Tue, 13 May 2014 20:38:17 +0000</pubDate>
			<guid>https://firefoxforum.ru/viewtopic.php?id=92&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Урок по написанию приложений в Firefox OS]]></title>
			<link>https://firefoxforum.ru/viewtopic.php?id=20&amp;action=new</link>
			<description><![CDATA[<p>В популярном блоге Хабрахабр юзер RAZVOR написал статью о том, как писать приложения в<br />Firefox OS<br />, я воспроизведу её здесь.<br />Как многие знают недавно mozilla выпустила свою firefox os, уже появилось несколько смартфонов на этой платформе. Никаких статей, и реальных примеров по написанию приложений я не нашёл. Поэтом покопавшись на MDN я решил восполнить этот недостаток.<br />Чего-же такого хорошего в firefox os?<br />Идея этой мобильной системы достаточно инновационная, ведь firefox os это- «система-браузер», те приложения для ней пишутся на html/css. Главный плюс этого в том, что те кто писал веб-приложения смогут написать приложения для неё без изучения дополнительных языков, фрэймворков итд. Также разработчики смогут легко портировать на данную os уже имеющиеся веб-разработки.<br />С чего начать?<br />Сначала предлагаю поставить эмулятор firefox os. Для этого прекрасно подойдёт плагин для firefox под названием firefox os simulator. Скачать его можно здесь.<br />Начнем!<br />Манифест<br />После того как мы скачали и установили эмулятор, предлагаю создать папку с названием нашего приложения, где оно собственно и будет располагаться. Наше учебное приложение будет называться «Count sistems». Оно будет переводить числа в разные системы счисления и также производить с ними арифметические действия. Я уже писал такое приложение на c++, теперь посмотрим как оно будет выглядеть на html/js.<br />После того как мы создали папку давайте напишем манифест для нашего приложения. Манифест-это такой файл в формате json, который будет говорить os как называется приложение, где находится его иконка и многое другое.<br />Код такого файла будет выглядеть так:<br />{ &quot;name&quot;:&quot;count systems&quot;,//название &quot;launch_path&quot;: &quot;/index.html&quot;,//путь до главного файла приложения &quot;developer&quot;: { &quot;name&quot;:&quot;RAZVOR&quot;,//разработчик &quot;url&quot;:&quot;&quot;//сайт разработчика }, &quot;description&quot;:&quot;count systems app&quot;,//описание &quot;icons&quot;:{ &quot;128&quot;:&quot;/icon.png&quot;//иконка } }<br />сохраним этот файл под именем manifest.webapp в созданную папку.<br />Разметка<br />Так как мы пишем почти веб-приложение создаём файл index.html. Со следующим кодом:<br />&lt;html&gt; &lt;head&gt;&lt;script src=&quot;https://myapps.mozillalabs.com/jsapi/include.js&quot;&gt;&lt;/script&gt;&lt;/head&gt; &lt;body&gt;&lt;p&gt;hello world&lt;/p&gt;&lt;/body&gt; &lt;script&gt;&lt;/script&gt; &lt;/html&gt;<br />Как видим ничего особенного в этом нету.<br />Запуск<br />Чтобы запустить приложение через эмулятор просто откройте в firefox инструменты-&gt;веб-разработка-&gt;firefox os simulator<br />откроется вкладка эмулятора. После этого нажимаем add Directory и выбираем наш manifest.webapp.<br />В принципе в firefox os запускать приложения можно без установки, но тока в marketplace, эмулятор же сам устанавливает приложения.<br />Чтобы его запустить жмём run а чтобы обновить update.<br />Давайте запустим наше учебное приложение!<br />Это вы увидите, если всё сделали правильно.<br />Установка приложения из самого приложения<br />Как я и говорил ранее в os можно запускать приложения без установки, чтобы их установить есть специальная функция в api, применим её, теперь код выглядит так:<br />&lt;html&gt; &lt;head&gt; &lt;meta charset=&quot;UFT-8&quot;&gt; &lt;script src=&quot;https://myapps.mozillalabs.com/jsapi/include.js&quot;&gt;&lt;/script&gt; &lt;script src=&quot;jquery.js&quot;&gt;&lt;/script&gt; &lt;link href=&quot;app.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;&gt; &lt;/head&gt; &lt;body&gt;&lt;p&gt;hello world&lt;/p&gt;&lt;/body&gt; &lt;script&gt; var gManifestName = &quot;manifest.webapp&quot;;//путь к манифесту app=function(){ this.init=function(){ //работа приложения } this.init(); }; $(document).ready(function(){ var request = navigator.mozApps.getSelf(); //Вызываем класс для получения информации о приложении request.onsuccess=function(){// при успешном вызове if(request.result){//если мы получили результат, значит приложение установленно alert(&#039;Приложение установлено&#039;); a=new app(); }else{// если нет то создаем кнопку $(&#039;&lt;div&gt;&#039;).appendTo(&#039;body&#039;).attr(&#039;id&#039;,&#039;inst_b&#039;).text(&#039;Установить!&#039;).css({width:200,textAlign:&#039;center&#039;,padding:5,background:&#039;#222&#039;,color:&#039;#ccc&#039;,borderRadius:&#039;3px&#039;}).click(function(){ var inst=navigator.mozApps.install(gManifestName);//при клике на кнопку устанавливаем приложение inst.onsuccess=function(){alert(&#039;Установка завершена&#039;);$(&#039;#inst_b&#039;).remove();a=new app();};//установка выполнена успешно inst.onerror=function(){alert(&#039;Установка не удалась:\n&#039;+this.error.name)}// ошибка при установке }); } }; request.onerror=function(){alert(&#039;Ошибка:\n&#039;+this.error.message)}//при ошибке }); &lt;/script&gt; &lt;/html&gt;<br />Вот мы и позаботились об установке, также мы добавили css и jqury поэтому не забудьте поместить их в папку с приложением под соответствующими именами.<br />После Hello world<br />Теперь, вы должны уже понимать кое какие особенности. Мы сказали привет миру, теперь можем заняться написанием реального приложения.<br />Модернизируем наш код.<br />html:<br />&lt;html lang=&quot;ru&quot;&gt; &lt;head&gt; &lt;title&gt;Count systems&lt;/title&gt; &lt;meta charset=&quot;UTF-8&quot;&gt; &lt;link type=&quot;text/css&quot; rel=&quot;stylesheet&quot; href=&quot;/app.css&quot;&gt; &lt;script src=&quot;jquery.js&quot;&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;h1 class=&quot;center&quot;&gt;Count systems&lt;/h1&gt; &lt;div class=&quot;feilds&quot;&gt; &lt;p&gt;Введите число&lt;/p&gt;&lt;input type=&quot;text&quot;/&gt; &lt;p&gt;Введите систему счисления&lt;/p&gt;&lt;input type=&quot;text&quot;/&gt; &lt;p&gt;Введите требуема система счисления&lt;/p&gt;&lt;input type=&quot;text&quot;/&gt; &lt;div class=&quot;error&quot;&gt;&lt;/div&gt; &lt;div class=&quot;result&quot;&gt;&lt;/div&gt; &lt;button class=&quot;submit&quot;&gt;Перевод!&lt;/button&gt; &lt;/div&gt; &lt;/body&gt; &lt;script&gt; var gManifestName = &quot;manifest.webapp&quot;; app=function(){ this.alp=&quot;abcdefghijklmnopqrstuvwxyz&quot;; //this.e=&#039;1&#039;; this.p={ ten_to:function(c,d){ var i=0,r=&#039;&#039;; do{ v=c%d; c=(c-(c%d))/d; if(v&gt;9){ r+=this.alp[v-10]; }else{ r+=v; } }while(c!=0); var r2=&#039;&#039;; for(i=(r.length-1);i&gt;-1;i--){ r2+=r[i]; } return r2; }, to_ten:function(c,d){ c=c.toString(); var v,r=&#039;&#039;; for(var i=0;i&lt;c.length;i++){ v=c[i]; if(v.match(/[0-9]/)!=v){ for(i in this.alp){ if(this.alp==v){ v=i+11; return false; } } } r+=v*d; } return r; } }; this.error=function(t){ $(&#039;.error&#039;).text(t); setTimeout(function d(){$(&#039;.error&#039;).text(&#039;&#039;).hide()},1000); }; this.wr_res=function(t){ $(&#039;.result&#039;).show().text(t); } this.init=function(){ $(&#039;body&#039;).load(&#039;/a.html&#039;); $(&#039;.submit&#039;).click(function sub(){ $(&#039;.submit&#039;).hide(); a2=new app(); var fi=$(&#039;.feilds input&#039;); fi.each(function(){ if($(this).val().length&lt;1){ a2.error(&#039;Не все данные введены!&#039;); return false; } }); var data={ c:fi[0].value, sis:fi[1].value, to_sis:fi[2].value }; with(data){ if(sis==10){ a2.wr_res(a2.p.ten_to(c,to_sis)); }else{ if(to_sis==10){ a2.wr_res(a2.p.to_ten(c,sis)); }else{ a2.wr_res(a2.p.ten_to(a2.p.to_ten(c,sis),to_sis)); } } } fi.change(function(){ $(&#039;.result&#039;).hide().text(&#039;&#039;); $(&#039;.submit&#039;).show(); }); }); } this.init(); }; $(document).ready(function(){ var request = navigator.mozApps.getSelf(); request.onsuccess=function(){ if(request.result){ a=new app(); }else{ $(&#039;&lt;div&gt;&#039;).appendTo(&#039;body&#039;).text(&#039;Установить!&#039;).css({width:200,textAlign:&#039;center&#039;,padding:5,background:&#039;#222&#039;,color:&#039;#ccc&#039;,borderRadius:&#039;3px&#039;}).click(function(){ var inst=navigator.mozApps.install(gManifestName); inst.onsuccess=function(){alert(&#039;Установка завершена&#039;);a=new app();}; inst.onerror=function(){alert(&#039;Установка не удалась:\n&#039;+this.error.name)} }); } }; request.onerror=function(){alert(&#039;Ошибка:\n&#039;+this.error.message)} }); &lt;/script&gt; &lt;/html&gt;<br />css:<br />.center{ width:250; margin:1 auto; } .feilds{ width:250px; margin:10 auto; border-radius:5px; box-shadow:inset 0 0 10px #ddd; padding:10px; } .submit{ width:100; padding:7; background-color:#222; color:#ccc; background-image:none !important; margin-top:15px; } .error{ width:100px; margin:0 auto; color:red; } .result{ width:100px; overflow:auto; margin:5 auto; border:1px solid #aaa; border-radius:4px; padding:6px; display:none; }<br />Думаю как это работает вы сможете разобраться сами, тк ничего особенного и нового в этом нет.<br />Некоторые возможности api<br />В firefox os помимо встроенных html5 api, есть и свое. Из него вы использовали класс navigator. Теперь я опишу некоторые возможности этого класса.<br />Онлайн или оффлайн<br />Как же нам проверить подключен ли к сети девайс? Для этого нам на помощь приходит метод navigator.onLine. Если возвращает true-сеть есть.false-нет. Всё просто.<br />Ориентация устройства<br />Можно подключать разные css в зависимости от ориентации.Например так:<br />&lt;link rel=&quot;stylesheet&quot; media=&quot;all and (orientation:portrait)&quot; href=&quot;portrait.css&quot;&gt; &lt;link rel=&quot;stylesheet&quot; media=&quot;all and (orientation:landscape)&quot; href=&quot;landscape.css&quot;&gt;<br />Также можно получить данные с акселлерометра через js<br />window.addEventListener(&quot;deviceorientation&quot;, handleOrientation, true); function handleOrientation(orientData) { var absolute = orientData.absolute; var alpha = orientData.alpha; var beta = orientData.beta; var gamma = orientData.gamma; }<br />Вибрация<br />Для вибрации можно использовать следующую функцию:<br />navigator.vibrate(1000);//Вибрация 1000 миллисекунд<br />Размещаем приложение в Marketplace<br />Когда мы написали наше тестовое приложение, самое время представить его народу, те разместить в marketplace. Эта операция очень проста, но нужно знать некоторые нюансы. Первым делом надо выбрать, будете вы размещать исходники у себя или на маркете. Если первое, то нужно специальным образом настроить сервер или github, подробнее здесь. Я же выбрал второй способ, для этого нам надо просто запоковать приложение в zip и выбрать нажав Submit an App-&gt;packeged-&gt;select a file. Если с манифестом всё нормально вы перейдете к шагу 2. На последующих этапах вам нужно составить описание и загрузить скрины( ВНИМАНИЕ НЕ МЕНЬШЕ ЧЕМ 500x600px ). Если всё прошло гладко, то поздравляю, У вас за плечами опыт написания и размещения целого приложения!<br />(Статья была взята с ресурса Хабрахабр, оригинал статьи здесь.)</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Fri, 15 Mar 2013 00:55:15 +0000</pubDate>
			<guid>https://firefoxforum.ru/viewtopic.php?id=20&amp;action=new</guid>
		</item>
	</channel>
</rss>
