Меню

J приложение – Приложение «J»

Содержание

Приложение j настоящий документ содержит Официальный перевод раф


Приложение J

Настоящий документ содержит Официальный перевод РАФ основных статей (Статьи 251,252,253,254,255) Приложения J к Международному Спортивному Кодексу FIA на 2004 год, с соответствующими рисунками. Перевод представлен по состоянию оригинального текста 20.01.2004 г. Приведенный текст на русском языке является официальной трактовкой РАФ соответствующих статей Приложения J к МСК. Согласно практике FIA изменения и дополнения к оригинальному тексту публикуются в Ежемесячниках FIA. Как правило, эти изменения и дополнения делаются на перспективу, однако, некоторые из них, из соображений безопасности, могут вводиться в действие немедленно. Оригинальный текст на французском или английском языках, учитывающий все такие изменения представлен на официальном сайте FIA: http://www.fia.com/regle/reg_tec В настоящем переводе, изменения и дополнения, которые вступают в силу с 01.01.2004 выделены подчеркнутым шрифтом.

Примечание:

Приложение J содержит также «Технические Листы», которые могут оказаться необходимыми для подготовки автомобилей к соревнованиям.

Ниже приведен перечень «Технических Листов»:

№1 — Список признаваемых ФИА изготовителей топливных баков.

№2 — Список признаваемых ФИА лабораторий, производящих анализы топлива.

№3 — Список признаваемых ФИА изготовителей и моделей измерителей потока.

№4 — Список признаваемых ФИА испытательных центров, производящих «краш-тесты».

№5 — Список соединителей, для отбора проб топлива.

№6 — Огнегасящие составы типа AFF одобренные ФИА.

№7 — Ремонтные центры, одобренные изготовителями F3 и F3000.

№8 — Каталитические нейтрализаторы, омологированные ФИА.

№9 — Каталитические нейтрализаторы, омологированные ФИА (класс 1).

№10 — Одобренные ФИА испытательные центры для спортивных сидений.

№11 — Одобренные структуры безопасности для формулы 3

№12 — Сиденья омологированные в соответствии со стандартом ФИА 8855-1992.

№14 — Список одобренных ФИА испытательных центров, производящих омологацию топливных баков.

№15 — Испытательные центры ФИА для систем пожаротушения.

№16 — Системы пожаротушения омологированные ФИА.

№17 — Материалы для подголовников сертифицированные ФИА.

№18 — Список изготовителей невозвратных клапанов и модели, омологированные ФИА.

№19 — Список изготовителей фонарей для использования в условиях дождя, омологированных ФИА.

№21 — Список одобренных ФИА испытательных центров, для защитной одежды водителей.

№22 — Список одобренных ФИА испытательных центров для ремней безопасности.

№23 — Накладки на дуги безопасности, омологированные ФИА.

№24 — Ремни безопасности омологированные ФИА.

№25 — Признаваемые ФИА стандарты на шлемы.

№27 – Защитная одежда водителей, омологированная ФИА в соответствии со стандартом 8856 – 2000.

Статья 251
^

1 КЛАССИФИКАЦИЯ

1.1 Категории и группы

Автомобили, используемые на соревнованиях, разделяются на следующие категории и группы:

Категория I:

— Группа N: Серийные автомобили

— Группа A: Автомобили Туризма

— Группа B: Автомобили Гранд Туризма

— Группа SP: Автомобили Супер Продакшн

— Группа T1: Серийные автомобили для ралли-рейдов

Категория II:

— Группа T2: Измененные автомобили для ралли-рейдов

— Группа N-GT: Серийные автомобили Гранд Туризма

— Группа GT: Автомобили Гранд Туризма

— Группа C: Спортивные автомобили

— Группа D: Автомобили Международных Гоночных Формул

— Группа E: Автомобили Свободных Гоночных Формул

Категория III:

— Группа F: Гоночные грузовики

— Группа T4: Грузовики для ралли-рейдов

^

Автомобили разделяются на следующие классы, согласно их рабочему объему:

1. До 500 см3

2. Более чем 500 см3 и до 600 см3

3. Более чем 600 см3 и до 700 см3

4. Более чем 700 см3 и до 850 см3

5. Более чем 850 см3 и до 1000 см3

6. Более чем 1000 см3 и до 1150 см3

7. Более чем 1150 см3 и до 1400 см3

8. Более чем 1400 см3 и до 1600 см3

9. Более чем 1600 см3 и до 2000 см3

10. Более чем 2000 см3 и до 2500 см3

11. Более чем 2500 см3 и до 3000 см3

12. Более чем 3000 см3 и до 3500 см3

13. Более чем 3500 см3 и до 4000 см3

14. Более чем 4000 см3 и до 4500 см3

15. Более чем 4500 см3 и до 5000 см3

16. Более чем 5000 см3 и до 5500 см3

17. Более чем 5500 см3 и до 6000 см3

18. Более чем 6000 см3

Если иное не определено в специальных условиях, наложенных ФИА для некоторой категории соревнований, организаторы не обязаны включать все вышеупомянутые классы в Частный регламент и, более того, они могут объединить два или больше последовательных классов, исходя из особенностей конкретного соревнования.

Никакой класс не может быть разделен.

2 ОПРЕДЕЛЕНИЯ

^

2.1.1) Серийные автомобили (Категория I):

Автомобили, для которых производство определенного числа идентичных экземпляров (см. определение этого слова ниже) за некоторый период времени было подтверждено по просьбе Изготовителя, и которые предназначены для нормальной продажи (см. это выражение).

Автомобили должны продаваться в соответствии с картой омологации.

2.1.2) Автомобили для соревнований (Категория II):

Автомобили единичного производства, предназначенные исключительно для соревнований.

2.1.3) Грузовые автомобили (Категория III)

2.1.4) Идентичные автомобили:

Автомобили, принадлежащие к одной производственной серии, имеющие одинаковый кузов (снаружи и внутри), одинаковые механические компоненты, и одинаковое шасси (даже если это шасси является неотъемлемой частью кузова в случае автомобиля с несущим кузовом «монокок»).

2.1.5) Модель автомобиля:

Автомобиль, принадлежащий к производственной серии, различимой определенной концепцией и внешними общими линиями кузова и идентичной механической конструкцией двигателя и трансмиссии.

2.1.6) Нормальная продажа:

Означает распределение автомобилей индивидуальным покупателям через обычные коммерческие каналы изготовителя.

2.1.7) Омологация:

Сделанное ФИА официальное свидетельство того, что автомобили данной конкретной модели были произведены в рамках серийного производства и в количестве, достаточном для классифицирования их в группе Серийных автомобилей (Группа N), Автомобилей Туризма (Группа A), Автомобилей Гранд Туризма (Группа B), Серийных автомобилей для ралли-рейдов (Группа T1), в соответствии с настоящими правилами.

Представление на омологацию должно быть подано ФИА от НСФ страны – производителя автомобиля, и должно сопровождаться заполнением Карты Омологации (см. ниже). Она, должна быть, составлена в соответствии со специальными правилами, называемыми — «Правилами омологации», установленными ФИА. Омологация серийно выпускаемого автомобиля истекает через 7 лет после даты, на которой серийное производство упомянутой модели было остановлено (производство меньше 10 % от минимальной величины для данной группы).

Омологация модели может иметь силу в только одной группе: Серийные автомобили (Группа N)/автомобили Туризма (Группа A), Серийные автомобили для ралли-рейдов (Группа T1) или автомобили Гранд Туризма (Группа B). Если модель, уже омологированная в группе автомобилей Гранд Туризма (Группа B), переходит в группу Серийных автомобилей (Группа N)/ автомобилей Туризма (Группа A)/ Серийных автомобилей для ралли-рейдов (Группа T1), то первая омологация отменяется.

2.1.8) Карты омологации:

Для всех автомобилей, признаваемых ФИА составляется описательная форма, называемая картой омологации, в которую заносятся все данные, позволяющие идентифицировать упомянутую модель.

Эта карта омологации определяет серию, указанную изготовителем.

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

Организаторы могут потребовать представить Карту омологации на технические проверки и/или на старт; они имеют право отказать в старте участнику соревнования в случае не представления Карты омологации.

Аналогично, если используется автомобиль Группы А, оснащенный Кит-Вариантом (см. ниже) касающимся шасси/кузова, то должен быть представлен оригинал свидетельства, выданного во время сборки, центром, одобренным изготовителем.

Если дата вступления в силу омологации наступает в течение соревнования, эта карта будет иметь силу для всей продолжительности упомянутого соревнования.

Для Серийных автомобилей (Группа N), помимо карты Группы N , должна также быть представлена карта автомобиля Туризма (Группа A).

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

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

Обязанностью участника является получение необходимой карты омологации в своей НСФ.

Описание: карта строится следующим способом:

1) Основная карта, дающая описание базовой модели.

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

a — Варианты (VF,VP, VO,VK)


  • Варианты Поставки — VF (два поставщика поставляют изготовителю одну часть, и клиент не имеет возможности выбора),

  • Варианты Изготовления — VP (поставляемые по запросу и доступные у дилеров),

  • Варианты Опций — VO (поставляемые по специальному запросу),

  • «Кит-Варианты » – VK (поставляемые по специальному запросу).

b – Исправление ошибок(ER)

Заменяет и отменяет неправильную часть информации предварительно указанной изготовителем в карте омологации.

c — Эволюция (ЕТ, ES)

Описывает изменения, сделанные на постоянной основе в базовой модели: полностью прекращен выпуск автомобиля в его первоначальной форме – эволюция типа ET; или эволюция, предназначенная для улучшения спортивных качеств модели — спортивная эволюция ES.

Применение:

1) Варианты (VF, VO, VK)

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

Комбинация нескольких VO запрещена на следующих частях: турбонагнетатель, тормоза и коробка передач.

Например, установка тормозного суппорта, описываемого вариантом VO возможна, только если размеры тормозной накладки и т. д., полученные таким образом, соответствуют обозначенным на основной карте для данного автомобиля. (Для Серийных автомобилей (Группа N), см. также статью 254.2)

Кит-Варианты (VK) могут использоваться только при выполнении условий, указанных изготовителем в карте омологации.

Это касается в особенности тех групп частей, которые участник должен рассматривать как единое целое, а также требований, которые должны быть соблюдены, если такое применяется.

2) Эволюция типа (ЕТ).

(Для Серийных автомобилей -Группа N, см. также статью 254.2)

Автомобиль должен соответствовать определенной стадии эволюции (независимо от даты, когда, он выпущен) и, таким образом, эволюция должна быть либо применена полностью либо не применена вовсе.

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

3) Спортивная эволюция (ES)

Коль скоро расширение ES относится к прошедшему расширению или к базовой карте, автомобиль должен соответствовать стадии эволюции, соответствующей этой ссылке; кроме того, спортивная эволюция должна быть применена полностью.

2.1.9) Механические компоненты (части):

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

2.1.10) Оригинальная или серийная часть:

Часть, которая подверглась всем стадиям производства, предписанным и выполненным изготовителем автомобиля и изначально установленная на автомобиле.

2.1.11) Композит:

Материал, сформированный из нескольких различных компонентов, соединение которых обеспечивает ему свойства, которыми ни один из компонентов, взятых отдельно, не обладает.

2.2 Размеры

Периметр автомобиля, видимый сверху:

Автомобиль в том виде, в котором он представлен на старте соревнования.

2.3 Двигатель

2.3.1) Рабочий объем цилиндров:

Объем V получаемый в цилиндре (или цилиндрах) восходящим или нисходящим движением поршня (ней).

V = 0.7854 x b2 x s x n

Где b = внутренний диаметр цилиндра

s = ход поршня

n = число цилиндров

2.3.2) Наддув:

Увеличение любыми способами веса заряда топливовоздушной смеси в камере сгорания (по сравнению с весом, образующимся при нормальном атмосферном давлении и за счет динамических процессов во впускной и/или выпускной системе).

Впрыск топлива под давлением, не считается наддувом (см. статью 252.3.1).

2.3.3) Блок цилиндров:

Картер и цилиндры.

2.3.4) Впускной коллектор:

В случае карбюраторной системы питания:

— Часть, собирающая воздушно-топливную смесь от карбюратора(ов) и распространяющаяся до поверхности прокладки в месте разъема с головкой цилиндров.

В случае системы впрыска с одной дроссельной заслонкой:

— Часть, простирающаяся от корпуса дроссельной заслонки включительно, до поверхности прокладки в месте разъема с головкой цилиндров, собирающая и регулирующая поток воздуха или воздушно-топливной смеси.

В случае системы впрыска с несколькими дроссельными заслонками:

— Часть, простирающаяся от дроссельных заслонок включительно, до поверхности прокладки в месте разъема с головкой цилиндров, собирающая и регулирующая поток воздуха или воздушно-топливной смеси

В случае дизельного двигателя:

-Часть, установленная на головке цилиндров, которая распределяет воздух от одного входного отверстия или единственный воздуховод к входным отверстиям головки цилиндра.

2.3.5) Выпускной коллектор:

Часть, собирающая вместе, в любой момент, газы от, по крайней мере, двух цилиндров от головки блока и простирающаяся до первой прокладки, отделяющей ее от остальной части системы выпуска.

2.3.6) Для автомобилей с турбонагнетателем, система выпуска начинается после турбонагнетателя.

2.3.7) Поддон:

Элементы, крепящиеся болтами снизу к блоку цилиндров, которые содержат и ограничивают масло для смазки двигателя.

Эти элементы не должны нести функций крепления коленчатого вала.

2.3.8) Моторный отсек:

Объем, ограниченный ближними к двигателю структурными перегородками.

2.3.9) Смазка с сухим картером:

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

2.3.10) Статическая прокладка для механических деталей:

Единственная функция прокладки состоит в уплотнении как минимум двух, закрепленных друг к другу, частей. Расстояние между поверхностями частей, соединяемых прокладкой, должно быть не более 5 мм.

2.3.11) Теплообменник:

Механическая часть, позволяющая обмен теплом между двумя жидкостями.

В названии теплообменников, первая часть – название жидкости, которая подлежит охлаждению, вторая часть — название жидкости, которая обеспечивает это охлаждение.

Например: масловодяной теплообменник (масло, которое охлаждается водой).

2.3.12) Радиатор:

Это – один из теплообменников, обеспечивающий охлаждение жидкости воздухом, жидкостно-воздушный теплообменник.

2.3.13) Интеркулер или теплообменник для наддува:

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

^

Ходовая часть включает в себя все части автомобиля, которые полностью или частично неподрессорены.

2.4.1) Колесо:

Фланец и обод; комплектное колесо – фланец, обод и шина.

2.4.2) Фрикционная поверхность тормозов:

Поверхность, заметаемая накладками на барабане, или колодками с обеих сторон диска, когда колесо делает полный оборот.

2.4.3) Подвеска «Mac Pherson»:

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

^

2.5.1) Шасси

Целостная структура автомобиля, вокруг которой собраны механические компоненты и кузов, включая любую структурную часть упомянутой структуры.

2.5.2) Кузов


  • Снаружи: все подрессоренные части автомобиля, омываемые потоком воздуха.

  • Внутри: пассажирский салон и багажник.

Типы кузова подразделяются на следующие:

  1. Полностью закрытый кузов

  2. Полностью открытый кузов

  3. Конвертируемый кузов с опускаемой крышей (складной) или со съемной крышей из твердого материала (жесткий верх).

2.5.3) Сидение

Две поверхности, составляющие подушку сидения и спинку.

Спинка сидения:

Поверхность, простирающаяся вверх от основания позвоночника нормально сидящего человека.

Подушка сидения:

Поверхность, простирающаяся вперед от основания позвоночника нормально сидящего человека.

2.5.4) Багажное отделение

Любой объем внутри автомобиля, отличающийся от пассажирского салона и моторного отсека.

Это отделение ограничено в длину структурными перегородками, устанавливаемыми при изготовлении автомобиля и/или задней частью сидений (если это возможно, то откинутых назад на угол максимум 150).

Это отделение ограничено в высоту структурой и/или съемной панелью, устанавливаемой изготовителем, или, при их отсутствии, горизонтальной плоскостью, проходящей через самую низкую точку ветрового стекла.

2.5.5) Пассажирский салон (кокпит)

Структурный внутренний объем, в котором размещаются водитель и пассажиры.

2.5.6) Капот

Внешняя часть конструкции кузова, которая открывается, чтобы обеспечить доступ к двигателю.

2.5.7) Крыло

Крыло — область, определяемая согласно рисунку 251-1.

ignorik.ru

Приложение J

 

 

 

Каркас безопасности по Приложению J.

Установка каркаса безопасности в любой автомобиль с полным циклом.

В стоимость входит:

Очистка кузова от шумо/виброизоляции в салоне и днище автомобиля. 15000р.
Удаление неиспользуемых кронштейнов по приложению J. 4000р.
Установка каркаса безопасности по Приложению J (сталь 20). Вес от 62кг. 75000р.
Установка кронштейнов сидений (прямоугольный профиль) по приложению J. 5000р.
Проварка всего кузова. 14000р.
Усиление точек крепления подвески (рамки радиатора, короб рычага передней
подвески, кронштейна задней балки, втулки руль рейки) по приложению J.
8000р.
Стоимость каркаса с доп работами:

121000руб

 

 

г.Тольятти, ул.Ботаническая 7а, ГСК Монолит3, Телефон: (8482) 556829,
Электронная почта: Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript ,
Web-страница: http://www.kolobok80.ru

kolobok80.ru

10 полезных приложений, о существовании которых вы не подозревали

Ребята, мы вкладываем душу в AdMe.ru. Cпасибо за то,
что открываете эту красоту. Спасибо за вдохновение и мурашки.
Присоединяйтесь к нам в Facebook и ВКонтакте

AdMe.ru сделал обзор полезных приложений, которые вы не найдете в списке «Популярное» во всевозможных чартах, но тем не менее они действительно достойны внимания и места в вашем телефоне.

Cluise — виртуальный гардероб

iOS и Android

Трудно поверить, но настали такие времена, когда можно просто сфотографировать всю свою одежду, загрузить ее в приложение, и оно будет генерировать «луки» на каждый день, учитывая ваш собственный стиль, мероприятие и погоду. Кроме того, в Cluise можно составить статистику, что у вас в излишке, а чего действительно не хватает, а также поделиться образом и получить отзывы и лайки от других пользователей.

«Эх, вот бы можно было просто перечислить продукты из холодильника и тут же получить гениальный рецепт!» — наверняка хоть раз так думала каждая хозяйка. А ведь это уже давно не мечта. На рынке приложений есть множество программ подобного типа, мы выбрали одного из первых представителей — «Оголодали?» Но имейте в виду, что если у вас есть только майонез, лук и корица — конечно же, приложение рецепт вкусного блюда из этого не придумает, а предложит сходить вам в магазин.

Stocard — дисконтные и скидочные карты магазинов

iOS и Android

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

Wi-Fi Map Pro — пароли к Wi-Fi по всему миру

iOS и Android

В двух словах, Wi-Fi Map Pro — это большое сообщество людей, которые делятся точками Wi-Fi и паролями по всему миру. Подключаться к точкам следует через настройки телефона. Увидели пароль в приложении, скопировали, зашли в настройки Wi-Fi на телефоне, вставили пароль и наслаждайтесь интернетом!

Fyuse — съемка 3D-фотографий

iOS и Android

Многообещающее приложение Fyuse позволяет создавать «глубокие» фотографии с эффектом параллакса. Камера фиксирует изображение с 4 точек, чтобы создать настоящий 3D-снимок. Если все проходит гладко, вы сможете наслаждаться объемной фотографией с нескольких ракурсов в удобном для вас темпе. Необычно, правда?

www.adme.ru

с чего начать / Mail.ru Group corporate blog / Habr

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

Тенденции

Чем пользуются владельцы мобильных телефонов?

  • Больше половины (53%) используют скачанные приложения
  • Приблизительно столько же (52%) через мобильный телефон заходят на сайты
  • Более трети людей (38%) используют социальные сети со своего мобильного телефона
  • Чуть меньше людей играют в игры (34%)
  • Примерно три четверти пользователей общаются через мобильные телефоны (помимо звонков): это могут быть SMS, приложение социальной сети, мессенджер
Статистика

Что покупают

За 2012 год в РФ продано порядка 12,6 миллионов смартфонов: Россия считается одной из быстроразвивающихся в этом плане стран.

Если мы посмотрим на статистику продаж смартфонов по операционным системам, мы увидим следующее:

  • 62% продаваемых смартфонов – это Android-устройства;
  • На втором месте Symbian — 15% рынка;
  • Оставшуюся долю делят bada, iOS и Windows Phone (если взять этот график только по Москве, то распределение, наверное, будет смещаться в сторону увеличения доли продукции Apple)

Если взглянуть на такой же график по всему миру, то увидим, что и тут Android в авангарде с ¾ рынка.

За второй квартал 2012 года по всему миру было продано 104 миллиона телефонов Android — как население довольно крупной страны. Но нас как мобильных разработчиков интересует не только наличие смартфона, но и то, как с ним работают. Существенная доля обладателей устройств на Android пользуется ими как обычными телефонами: SMS, звонки — и все. Они не активируют устройство в Google Play, не скачивают приложения.

Чем пользуются

Не все люди обзавелись телефонами в 2012 году, поэтому реальное распределение сил среди мобильных операционных систем демонстрирует наша внутренняя статистика. В эту статистику входят Россия и страны СНГ: Украина, Белоруссия, Казахстан, Узбекистан.

  • 73,5% – это Java-телефоны
  • Android-устройства находятся на втором месте с 11,6%
  • Наследие компании Nokia, Symbian, совсем немного отстает от Android с 11%
  • Яблочной продукцией обладают 3,5% пользователей рунета
  • Самые внимательные увидят на диаграмме Microsoft с Windows Phone ( менее 1%)

Установка приложений

При выборе платформы, под которую будет разрабатываться приложение, важно знать статистику по уже существующим приложениям. Графики исследовательской компании App Annie от сентября 2012 года показывают, как растут два конкурирующих магазина Apple и Google.


По количеству скачиваний на первом месте Google Play: больше устройств, больше скачиваний, больше трафика и рост при этом +66% по сравнению с январем 2012 года. Рост iOS оказался в два раза меньше, порядка 30%. Но главный график – какую выручку приносят пользователи. И здесь ситуация в корне иная. Проще зарабатывать на iOS, но деньги есть и в Google Play, если уметь их забирать.

Типы мобильных приложений

На практике можно разделить приложения для мобильных устройств на три типа.

Мобильные сайты, веб-приложения

Это самый распространенный тип приложений для мобильных устройств. Современные смартфоны в состоянии отобразить обычный сайт. Им доступно все то, что мы привыкли видеть в десктопных приложениях — поддержка HTML5 делает свое дело. Помните, что веб-приложения отлично подходят для стартапа: именно они позволяют получить большой результат за маленькие деньги и за небольшой срок. Еще один плюс мобильного сайта по сравнению с другими мобильными приложениями – это кроссплатформенность. Однако есть и минус, притом весомый: с ними достаточно сложно заработать.

Гибридные приложения

При таком подходе вы получаете доступ ко всем плюсам API операционной системы: приложение обрастает push-уведомлениями и другими приятными плюшками, кроме того, теперь ваш продукт можно размещать в сторах. При этом основной контент все еще представляет собой платформонезависимую страничку с версткой, размещенную на сервере. Это позволяет вносить косметические изменения в продукт без выпуска новой версии: достаточно залить изменения на сервер. Гибридные приложения – отличное решение для тех, кто начинает бизнес или хочет проверить свою идею, показать ее инвестору, друзьям.

Нативные приложения

Этот вид приложений самый ресурсоемкий, но вместе с этим он позволяет по максимуму использовать возможности, предлагаемые каждой конкретной операционной системой. Как следствие, нативные приложения выигрывают как по функционалу, так и по скорости работы у других типов мобильных приложений. Именно к такому подходу сейчас приходят те компании, которые делали комбинированные приложения. Например, Facebook начинала с комбинированного приложения: нативные контролы (переключатели, вкладки и так далее) и веб-страница в качестве контента. Несмотря на то, что это неплохое решение, проблемы с производительностью приводят к тому, что разработчики отходят от комбинации с вебом.

Статистика

Приведу статистику скачиваний на примере наших мессенджеров.

Во-первых, у нас есть приложение ICQ, которое постоянно развивается: среди последних изменений стоит отметить аудиозвонки. Второй мессенджер Mail.Ru Group – Агент. В Агенте реализован примерно тот же функционал, и, хотя у него была немного другая история развития, мы выпускаем версии практически под все платформы и его можно найти в любом сторе.

Основная разница между двумя этими приложениями – это их аудитория. ICQ – это международный продукт. Программа скачивается не только в России, им активно пользуются жители Европы, Латинской Америки. Агент же изначально делался в России и для русскоязычных пользователей.

Тем интереснее сравнить статистику скачиваний из магазинов.


Большая часть 62% иностранной аудитории идет в Google Play. Примерно 1/5 идет в AppStore, 14% — в Ovi Store. И уже оставшиеся 5% делят магазины для платформ Windows Phone (4%) и Samsung Bada (1%). С Агентом ситуация в корне другая: доли Google Play и Ovi примерно одинаковые. Ну а 10% AppStore наглядно демонстрируют любовь к «яблочной» продукции в нашей стране.

Процесс создания мобильного приложения

Итак, перейдем к самому вкусному: процессу разработки мобильного приложения.

User Story

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

Важно понимать, что за каждым пунктом в вашем to-do листе скрывается огромный айсберг функционала. Старайтесь фрагментировать и конкретизировать задачи. Крупные хотелки лучше всего разделить на несколько этапов (релизов в стор). Однако это тема отдельной дискусии, вернемся к этапам создания приложения.

Проектирование и дизайн

После составления User Story начинается проектирование и разработка дизайна.


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

При разработке дизайна обязательно используются гайдлайны.

Гайдлайн в общем понимании – это документ, который выпускает компания, и по которому дизайнеры и разработчики понимают принцип построения взаимодействия приложения с пользователем. Условно говоря, для iOS кнопки надо делать круглыми, а для Windows Phone – квадратными. Однако мы используем и внутренние гайдлайны для разработчиков. Таким образом результат работы дизайнера чаще всего состоит из макетов, гайдлайнов и нарезки графики.

Макеты лучше всего подавать «перелинкованными», например с помощью ProtoTypr, чтобы была понятна логика переходов. Гайдлайны содержат в себе информацию об отступах, размерах, визуальных эффектах, механике анимации и пр. Этот этап можно пропустить, если в вашем проекте один дизайнер и один разработчик, сидящие рядом друг с другом. Третья часть результата — нарезка графики — должна содержать минимум необходимых графических ресурсов (заботимся о весе приложения), иметь версии для разных разрешений экранов. Чаще всего мы рисуем для ретины и xhdpi-экранов. Далее идет подготовка для неретины и mdpi автоматизированными средствами (если допустимо их использование). Чаще всего руками приходится готовить hdpi-ресурсы.

Передача в разработку. Обсуждение и необходимые правки описания

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

Тестирование

Существует немалое количество способов протестировать приложение.
В мобильной разработке тестировщик – это человек, вокруг которого одни телефоны. У нас есть огромный шкаф, в котором лежат как старые телефоны, так и самые свежие новинки. Внутри мы стараемся тестировать по тест-кейсам. Если внедряется новая фича, по ее описанию составляется тест-план.
Существуют сервисы, помогающие в тестировании. Мы используем HockeyApp – приложение, позволяющее раздавать наш продукт бета-тестерам. Мы пишем в социальных сетях: «Ребята, у нас новое крутое приложение. Кто хочет попробовать?» Желающие получают билд, пользуются приложением, а сервис собирает статистику, составляет креш-репорт и отправляет все это нам.
Также есть сервисы, позволяющие протестировать приложение на разных операционных системах — например, все Android-прошивки версии 2.1 или 2.3. Вы отдаете приложение, сервис скриншотит весь путь, который вы задали, присылает картинки вам на почту, и вы проверяете, все ли в порядке.

Мониторинг

Итак, вы разработали, протестировали приложение, залили его в стор. Для отслеживания статистики скачиваний можно использовать сервис Distimo. Он показывает статистику по пользователям, которые приходят в стор, чтобы скачать приложения, и агрегирует комментарии.

Важно понимать, что люди более склонны оставлять негативные комментарии. Если у человека все хорошо, он чаще всего просто пользуется приложением, не комментируя. При стабильной работе наших приложений мы получаем 40-50 комментариев ежедневно. В день ошибки количество записей может доходить до 400 на одной платформе. Поэтому имейте в виду, что комментарии – это не полная оценка вашей работы, скорее еще один баг-трекер.

Изменить ситуацию может довольно распространенных «хак» — окно Rate Us. С предложением оставить положительный комментарий в сторе, а в случае проблем написать разработчику. Эффект достаточно сильный, главное — правильно продумать алгоритм показывания диалога юзеру.

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

Еще один интересный мониторинговый сервис – Flurry. Он помогает собирать клиентскую статистику. Flurry предоставляет отчет о том, что делает пользователь в вашем приложении: сколько раз он нажал на кнопку, сколько раз возвращался в приложение и более общие параметры — аудитория, география, пол, возраст и пр.

В некоторых мобильных продуктах мы также используем подсчет клиентской статистики с помощью Google Analytics. Разницы при сравнении с Flurry нет практически никакой. Минусы в скорости работы и обработки логов есть в обоих случаях, однако, если вы привыкли работать с гугловским интерфейсом, можете использовать этот инструмент.

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

Специфика

Что нужно помнить?

  • На каждой новой платформе пользователь ожидает увидеть богатое приложение. Он рассуждает следующим образом: «Я сидел на плохом Java-телефоне, при этом мог пользоваться аськой. Я купил новый телефон, захожу в Marketplace, а там нет ICQ? Вы чем там занимаетесь?» Пользователь не принимает в расчет того, что вам приходится делать приложение с нуля. Новая платформа – это новые девайсы, новая документация, новые ресурсы.
  • Чем популярнее платформа, тем больше у вас конкурентов. На данный момент существует два стора, на примере которых это отлично видно: AppStore и Google Play. Если у вас есть идея приложения, которое легко монетизируется или просто получит много скачиваний, вбейте ключевые слова в поиске и скорее всего вы обнаружите, что такое приложение существует. Чем популярнее платформа, тем больше конкурентов. В таких случаях надо тщательно изучать аналоги, смотреть статистику, пытаться понять, по каким параметрам существующие решения можно превзойти.
  • Важно понимать, как пользователи выбирают приложения. Изначально человек не собирается покупать конкретное приложение, он просто смотрит список. Например, по запросу «бесплатная музыка». Иконка и первые две строчки описания – это то, что человек видит и оценивает в первую очередь. Если иконка приличная, можно покупать; соответственно, плохая иконка уменьшает количество скачиваний.
  • Очень важно попасть в топ магазина приложений. Попасть в топ стора – очень хорошо, закрепиться там – залог успеха. Зачем это нужно? Когда пользователь хочет что-нибудь скачать, он заходит в чарт и видит, какое приложение сейчас на первом месте по числу скачиваний. Очень важно туда попасть, потому что это своего рода замкнутый круг. Приложение попадает в чарт, его видят пользователи, они его скачивают, оно снова попадает на первое место, и дальше итерации продолжаются. Поэтому всеми силами добывайте скачки и рейтинг: просите мам, бабушек, соседей ставить приложению пятерки. Стоит сказать, что на рынке полно решений для гарантированного вывода программы в топ. Однако органических пользователей это приносит мало, что не мешает продолжать эксперименты.
  • Помните, что время публикации может доходить до нескольких недель. Допустим, вы разработали и протестировали приложение, обзвонили всех блоггеров или СМИ и сказали: «У меня новое приложение, приходите на пресс-конференцию». Вы его отправляете в AppStore и вынуждены ждать семь рабочих дней в России. В этом случае Google Play – рай для оперативных обновлений, где публикация занимает несколько часов.
  • Фрагментация операционной системы. Если вы разрабатываете приложения под Android, учитывайте фрагментацию и существование целого зоопарка устройств. Это сказывается на времени разработки на всех этапах: проектирование, дизайн, разработка и особенно тестирование.
  • В сторе невозможно общаться с пользователями. Например, пользователь пишет, что у него в ICQ не ходят сообщения. Он недоволен и выражается очень красочно, но не очень информативно. У нас нет возможности с ним связаться и узнать о проблеме подробнее. Все, что мы можем сделать – залезть в мониторинг и посмотреть, ходят ли у нас сообщения. Может быть, его заблочил антиспам.
  • Сейчас некоторые сторы обзаводятся админкой, в которой можно задать вопросы пользователю, выяснить его контактные данные, посмотреть, в каких странах скачивают ваше приложение, но пока ситуация не слишком улучшилась. Стоит отметить, что Google Play продолжает добавлять эту возможность некоторым разработчикам, например нашей компании она доступна.
  • Время на тестирование. Существует несколько способов протестировать приложение. Можно иметь тестеров в штате – с тест-кейсами, тест-планами, которые они обязательно проходят. Кроме того, существует сервис для тестирования – вы платите за найденные баги. Вы выкладываете приложение, его тестируют 20 тысяч человек. В этом подходе, конечно, есть плюсы и минусы.
  • Кадры в мобильной индустрии решают все. Хороших мобильных разработчиков сложно найти даже крупным компаниям, таким как Mail.Ru Group, Яндекс или Google. Именно поэтому мы ведем работу со стажерами — потому что иногда легче взять толкового студента и обучить его.
Заключение

Я постарался рассказать вам о базовых особенностях и подводных камнях мобильной разработки, которые встречались нам на нашем пути. Надеюсь, пост оказалась вам полезным. Если у вас остались вопросы по теме, или вы знаете что-то, что может быть полезно нам, давайте обсудим это в комментариях.

habr.com

Как превратить веб-сайт в мобильное приложение с помощью 7 строк JSON

В материале, перевод которого мы публикуем сегодня, речь пойдёт о создании мобильных приложений на базе существующих веб-проектов. Автор этой статьи демонстрирует инструменты, которые позволяют с минимальными усилиями разрабатывать приложения, пользующиеся нативными возможностями платформ iOS и Android и включающие в себя материалы работающих сайтов или локальные ресурсы. Его рассказ начинается с тех самых семи строк JSON-кода, которые позволяют превращать сайты в мобильные приложения.


Превращение веб-сайта в мобильное приложение

Обзор


На рисунке выше показан код, который позволяет превратить веб-сайт в мобильное приложение. В частности, за «превращение» отвечают семь строк JSON, выделенные оранжевым цветом. Оставшиеся фрагменты текста программы описывают возможности, относящиеся к мобильной платформе, на которой выполняется приложение.

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

Кроме того, вот ещё один вопрос: «Можно ли, просто редактируя JSON, работать с нативными API, с компонентами пользовательского интерфейса, пользоваться системными переходами между страницами?».

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


Минимальное приложение

Обратите внимание на то, как я встроил в это приложение страницу с github.com, однако всё остальное — это нативные компоненты, вроде верхней навигационной панели и нижней панели управления. При этом переходы между страницами приложения используют системные возможности. Делается это автоматически и не требует вмешательства в код сайта.

Прежде чем я расскажу о том, как это сделано, у вас может возникнуть вполне резонный вопрос: «Всё это хорошо, но можно ли, пользуясь методом, о котором идёт речь, создать что-то действительно полезное, а не нечто вроде простого «просмотрщика» веб-страниц в контейнере нативного приложения?».

Отличный вопрос. Собственно говоря, ответу на него и посвящена данная статья. Если в двух словах, то суть рассматриваемой здесь методики заключается в создании двустороннего канала связи между контейнером для вывода веб-содержимого и приложением. Приложению это даст возможность вызывать JavaScript-функции, находящиеся в контейнере, а контейнеру позволит обращаться к нативным API, расположенным за его пределами.

Взглянем на пример, иллюстрирующий вышесказанное.


Приложение для создания QR-кодов

Вот основные составные части этого приложения:

  1. Нативный навигационный заголовок, поддерживающий встроенные возможности переходов.
  2. Элемент WebView, в который встроено веб-приложение, генерирующее QR-коды.
  3. Системный компонент для ввода текстов в нижней части окна.

Описание всех этих элементов можно выполнить, просто приведя к соответствующему виду атрибуты JSON-разметки, подобной показанной выше.

И, наконец, обратите внимание на то, что тут показано и взаимодействие компонентов приложения. А именно, QR-код меняется после ввода новых данных. Делается это благодаря возможности вызова JavaScript-функции, расположенной внутри веб-приложения, которая отвечает за создание QR-кодов на основе переданных ей данных.

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

Когда говорят о будущем мобильных приложений, обычно всё крутится вокруг вопроса о том, какой из подходов победит: основанный на HTML5 или на нативных API. Что характерно, в подобных рассуждениях не поднимается тема сосуществования этих двух подходов, и, более того, не рассматривается эффект синергии, который, благодаря совместному использованию различных технологий, позволит достигать результатов, которые нелегко достигнуть, полагаясь лишь на что-то одно.

В этом материале я собираюсь рассказать о следующих вещах:

  • О том, почему совместное использование веб-кода и нативных компонентов — это, нередко, хорошая идея.
  • О том, почему прозрачная интеграция HTML и нативных компонентов — это непростая задача, и о том, как мне удалось её решить.
  • И, что самое важное, я расскажу о том, как вы можете использовать технологии, о которых пойдёт речь, для быстрой разработки собственных приложений.

Зачем использовать веб-технологии в мобильных приложениях?


Прежде чем продолжать, давайте сначала поговорим о том, нормально ли это — использовать возможности HTML и JS в мобильных приложениях, и о том, когда может пригодиться подобный подход. Вот несколько ситуаций, когда смешивание веб-технологий с нативными возможностями мобильных платформ может оказаться кстати.

▍1. Использование технологий, созданных для веб


Для реализации некоторых частей приложений может иметь смысл использование веб-технологий. Например, WebSocket — это технология, изначально ориентированная на веб. Для её использования можно применить встроенный в мобильную платформу веб-движок (WKWebView для iOS и WebView для Android) вместо установки сторонней библиотеки, которая попросту «эмулирует» WebSocket.

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

▍2. Уменьшение размеров пакета приложения


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

Например, для того, чтобы встроить в мобильное приложение генератор QR-кодов, понадобится сторонняя библиотека, которая увеличит размер пакета приложения. Однако если применить для этого стандартное средство для просмотра веб-страниц и JS-библиотеку, подключённую к странице с помощью простой конструкции <script>, можно получить всё необходимое без установки сторонних библиотек.

▍3. Решение проблемы отсутствия надёжных мобильных библиотек


Для некоторых новейших технологий пока не созданы их надёжные и стабильные мобильные реализации. Однако, большинство этих технологий доступны в веб-среде. В результате самый эффективный способ их интеграции в мобильные приложения заключается в использовании соответствующей JavaScript-библиотеки.

▍4. Разработка проектов, использующих и возможности мобильных платформ, и веб-приложений


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

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

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

Как это работает?


▍A. Jasonette


Jasonette — это опенсорсный проект, направленный на создание кросс-платформенных нативных приложений, основанных на JSON-разметке.

Фреймворк Jasonette похож на веб-браузер, но, вместо того, чтобы превращать HTML-код в веб-страницы, он преобразует JSON-разметку в нативные приложения для iOS и Android. Сходство с браузером заключается и в том, что любое приложение, основанное на Jasonette, имеет одинаковый базовый код, который занимается интерпретацией различных наборов JSON-данных в процессе формирования итогового приложения. Разработчику не нужно работать с кодом библиотеки. Процесс создания приложения заключается в подготовке его JSON-описания, которое позволяет Jasonette, в реальном времени, преобразовывать веб-страницы в нативные приложения.

Подробности о Jasonette можно почитать здесь. В целом, можно сказать, что проект Jasonette направлен на разработку нативных приложений, а здесь мы поговорим о том, как интегрировать HTML-страницы в эти нативные приложения.

▍B. Jasonette Web Container


Сами по себе нативные мобильные приложения — это прекрасно, но иногда в них хочется использовать веб-технологии, что можно сделать с помощью стандартных веб-контейнеров. Однако, их интеграция в приложения — дело непростое. Вот что нужно для прозрачной интеграции веб-технологий в нативные приложения:
  1. Веб-контейнер должен представлять собой естественную часть интерфейса мобильного приложения. Контейнер должен выглядеть так же, как любой другой компонент пользовательского интерфейса приложения. В противном случае получится нечто неуклюжее, выглядящее как то, чем оно является на самом деле — веб-сайтом, который показывают в мобильном приложении.
  2. Родительское приложение должно иметь возможность контролировать дочерний веб-контейнер. При таком подходе приложение, частью которого является элемент управления для просмотра содержимого веб-страницы, будет иметь удобные средства для воздействия на него.
  3. Дочерний веб-контейнер должен иметь возможность вызывать системные события в родительском приложении. У веб-контейнера, встроенного в приложение, должны быть средства для обращения к нативным API.

На самом деле, реализация всего этого требует немалых усилий, поэтому я начал с первого пункта этого списка — с простого встраивания веб-контейнера в страницы нативных приложений. Так я выпустил первую версию JSON Web Container.

Эта штука оказалась полезной, но ей не хватало возможностей по взаимодействию родительского приложения с веб-контейнером. А именно, родительское приложение не могло контролировать веб-контейнер, а контейнер не мог обращаться к родительскому приложению. Как результат, контейнер оказывался полностью изолированным от своего окружения в виде приложения.

▍C. Jasonette Web Container 2.0: взаимодействие приложения и контейнера


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

Реализация: интерактивный Web Container


▍1. Загрузка по URL


Задача

Ранее, в первой версии, для того, чтобы использовать веб-контейнер в виде компонента для просмотра данных, сначала нужно было записать "html" в атрибут $jason.body.background.type, а затем, в атрибут $jason.body.background.text, ввести HTML-код.
{
  "$jason": {
    "head": {
      ...
    },
    "body": {
      "background": {
        "type": "html",
        "text": "<html><body><h2>Hello World</h2></body></html>"
      }
    }
  }
} 

Вполне естественно то, что разработчикам удобнее будет инициализировать контейнер, используя обычную ссылку на веб-страницу, вместо того, чтобы вводить весь HTML-код страницы в одну строчку.
Решение

В Web Container 2.0 появился атрибут url. Он поддерживает, в частности, локальные файлы. Благодаря использованию конструкции file://... в контейнере можно вывести файл, который поставляется вместе с приложением.
{
  "$jason": {
    "head": {
      ...
    },
    "body": {
      "background": {
        "type": "html",
        "url": "file://index.html"
      }
    }
  }
}

Аналогично осуществляется и вывод веб-страниц из интернета (с помощью конструкции вида http[s]://…).
{
  "$jason": {
    "head": {
      ...
    },
    "body": {
      "background": {
        "type": "html",
        "url": "https://news.ycombinator.com"
      }
    }
  }
}

▍2. Двустороннее взаимодействие приложения и веб-контейнера


Задача

Ранее веб-контейнеры использовались только для вывода некоего содержимого, они не могли взаимодействовать с основным приложением. Это означало, что следующие сценарии их использования были невозможны:
  1. Воздействие Jasonette на веб-контейнер. А именно, невозможно было вызывать JavaScript-функции, расположенные в контейнере, из Jasonette-приложения.
  2. Воздействие контейнера на Jasonette. Невозможно было вызывать нативные API из кода, расположенного в контейнере.

Веб-контейнер можно было использовать только для вывода страниц. Это похоже на то, как в обычные веб-страницы встраивают элементы iframe, когда страница не может получить доступ к тому, что находится внутри этих элементов.
Решение

Цель проекта Jasonette заключается в создании стандартного языка разметки, позволяющего описывать кросс-платформенные мобильные приложения. В данном случае нам нужен язык разметки, который может точно описать варианты взаимодействия между родительским приложением и дочерним веб-контейнером.

Для того чтобы этого достичь, я воспользовался технологией JSON-RPC, которая позволила наладить взаимодействие приложения и веб-контейнера. Так как всё в Jasonette выражается в виде JSON-объектов, совершенно естественным было использовать стандартный формат JSON-RPC в качестве коммуникационного протокола.


До использования JSON-RPC Jasonette и веб-контейнер взаимодействовать не могли. После внедрения JSON-RPC стала возможна двусторонняя коммуникация основного приложения и контейнера

Для того чтобы получить возможность вызывать JS-функции, находящиеся в веб-контейнере, мы объявляем действие $agent.request.

{
  "type": "$agent.request",
  "options": {
    "id": "$webcontainer",
    "method": "login",
    "params": ["username", "password"]
  }
}

$agent.request — это нативное API, которое инициирует JSON-RPC-запрос к веб-контейнеру. Для того чтобы воспользоваться этим механизмом, нужно передать ему объект options в качестве параметра.

Объект options — это и есть JSON-RPC-запрос, который будет отправлен веб-контейнеру.

Рассмотрим его атрибуты.

  • id: веб-контейнер построен поверх низкоуровневой архитектуры агентов (agent). Обычно с одним элементом view может быть ассоциировано несколько агентов, у каждого из них может быть уникальный идентификатор (ID). Однако веб-контейнер представляет собой особый тип агента, у которого может быть лишь идентификатор $webcontainer, именно поэтому мы используем в запросе данный идентификатор.
  • method: имя JavaScript-функции, которую нужно вызвать.
  • params: массив параметров, которые нужно передать вызываемой JS-функции.

Вот как выглядит полный код описываемой разметки:
{
  "$jason": {
    "head": {
      "actions": {
        "$load": {
          "type": "$agent.request",
          "options": {
            "id": "$webcontainer",
            "method": "login",
            "params": ["alice", "1234"]
          }
        }
      }
    },
    "body": {
      "header": {
        "title": "Web Container 2.0"
      },
      "background": {
        "type": "html",
        "url": "file://index.html"
      }
    }
  }
}

Рассмотрим смысл приведённого здесь кода.

При загрузке элемента ($jason.head.actions.$load) нужно выполнить JSON-RPC-запрос, описанный в options, к агенту веб-контейнера ($agent.request).

Параметры веб-контейнера заданы в $jason.body.background, в данном случае здесь осуществляется загрузка локального файла file://index.html.

В ходе обращения к контейнеру будет осуществлён поиск функции login, которой, при вызове, благодаря params, будет передано два аргумента — "alice" и "1234". Выглядеть это будет так:

login("alice", "1234")

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

Обсудим пример приложения для создания QR-кодов, которое вы уже видели выше.
Приложение для создания QR-кодов
  1. Компонент для ввода текста в нижней части окна на 100% нативен.
  2. QR-код генерируется веб-приложением, размещённым в веб-контейнере.
  3. Когда пользователь вводит некий текст в поле и нажимает кнопку Generate, осуществляется вызов действия $agent.request агента веб-контейнера, что приводит к вызову JS-функции qr.

Код этого приложения можно посмотреть здесь

▍3. Внедрение скриптов


Задача

Иногда нужно динамически внедрять JavaScript-код в веб-контейнеры уже после того, как в них загружен исходный HTML-код.

Представьте, что вы хотите создать собственный веб-браузер. Для этого вам может понадобиться внедрять свои JS-скрипты в каждый веб-контейнер для того, чтобы иметь возможность влиять на его поведение. Собственно говоря, примерно так работают расширения для веб-браузеров.

Даже если вы не занимаетесь разработкой веб-браузера, вам может понадобиться использовать внедрение скриптов в том случае, если вам нужно обеспечить необходимое поведение страниц, которыми вы не можете управлять напрямую. Единственный способ взаимодействия мобильного приложения и веб-контейнера заключается в использовании API $agent. Но если вы не можете изменить HTML-содержимое, единственный способ добавления интерфейса $agent в веб-контейнер заключается в динамическом внедрении скриптов.

Решение

Как уже было сказано, веб-контейнер $jason.body.background — это всего лишь агент. Это означает, что при работе с ним можно использовать тот же метод $agent.inject, что и при работе с обычными агентами.
Внедрение JS-кода в страницу, загруженную в веб-контейнер

▍4. Обработка переходов по URL


Ранее веб-контейнер мог обрабатывать щелчки по ссылкам лишь двумя способами, пребывая в одном из двух режимов.
  1. В режиме «только чтение» веб-контейнер рассматривается как элемент только для чтения, при этом все события, такие, как касание или прокрутка, игнорируются. Все веб-контейнеры находятся в состоянии только для чтения до тех пор, пока их не переключат в режим обычного браузера, так, как описано ниже.
  2. В режиме «обычный браузер» веб-контейнер может взаимодействовать со страницей так, как будто мы работаем с обычным браузером. Включить этот режим можно, записав в атрибут action значение "type": "$default".

Задача

Проблема тут заключается в том, что оба рассмотренных выше варианта — это решения представляющие собой концепцию «всё или ничего».

При работе в режиме «только чтение» контейнер игнорирует все воздействия пользователя.

При работе в режиме «обычный браузер» веб-контейнер работает, в буквальном смысле, как браузер. Когда пользователь касается ссылки, страница, на которую ведёт эта ссылка, загружается. При этом у разработчика нет возможности перехватить это событие и вызвать, например, какое-то нативное API.

Решение

Благодаря возможностям нового веб-контейнера можно задать в $jason.body.background атрибут action, который содержит описание механизма обработки щелчков по ссылкам.
Действие для обработки взаимодействий со ссылками

Рассмотрим пример.

{
  "$jason": {
    "head": {
      "actions": {
        "displayBanner": {
          "type": "$util.banner",
          "options": {
            "title": "Clicked",
            "description": "Link {{$jason.url}} clicked!"
          }
        }
      }
    },
    "body": {
      "background": {
        "type": "html",
        "url": "file://index.html",
        "action": {
          "trigger": "displayBanner"
        }
      }
    }
  }
}

Тут мы прикрепили к веб-контейнеру действие "trigger": "displayBanner". Это означает, что когда пользователь щёлкает по любой ссылке, выводимой на странице, отображаемой в веб-контейнере, будет вызвано действие displayBanner. При этом сам веб-контейнер не будет обрабатывать щелчок по ссылке.

Кроме того, если проанализировать событие displayBanner, можно заметить переменную $jason. В данном случае ссылка, по которой был сделан щелчок, будет передана действию через эту переменную. Например, если щёлкнуть по ссылке, в которой содержится адрес "https://google.com", в $jason попадёт следующее:

{
  "url": "https://google.com"
}

Это означает, что анализируя значение $jason.url можно вызывать различные действия.

Рассмотрим ещё один пример, представляющий собой реализацию веб-браузера.

{
  "$jason": {
    "head": {
      "actions": {
        "handleLink": [{
          "{{#if $jason.url.indexOf('signin') !== -1 }}": {
            "type": "$href",
            "options": {
              "url": "file://key.html"
            }
          }
        }, {
          "{{#else}}": {
            "type": "$default"
          }
        }]
      }
    },
    "body": {
      "background": {
        "type": "html",
        "url": "file://index.html",
        "action": {
          "trigger": "handleLink"
        }
      }
    }
  }
}

Тут мы проверяем, содержит ли URL строку signin, и, в зависимости от результатов проверки, выполняем различные действия.
  1. Если URL содержит signin, открывается нативное окно для входа в систему.
  2. Если URL этой строки не содержит, выполняется действие, задаваемое параметром "type": "$default", в результате наша программа ведёт себя как обычный браузер.

Примеры


▍Разработка веб-браузера


Теперь мы можем воспользоваться возможностями нового элемента Web Container для разработки приложений. А именно, речь идёт о следующем:
  1. Возможность стандартной обработки щелчков по ссылкам, что соответствует поведению обычного браузера.
  2. Возможность обрабатывать щелчки по ссылкам, основываясь на их содержимом.

Всё это даёт нам возможность, например, создать собственный браузер, написав буквально полтора десятка строк JSON-кода. Так как теперь мы можем перехватывать щелчки по ссылкам, мы можем анализировать $jason.url и выполнять действия, соответствующие различным URL.

Рассмотрим пример.


Стандартное поведение браузера

Здесь веб-контейнер ведёт себя как обычный браузер ("type": "$default").


Поведение, основанное на анализе параметра $jason.url

Здесь при щелчке по ссылке применяется нативный переход между страницами.

Этого можно достичь, обрабатывая различные действия, основываясь на значении $jason.url.

Первым шагом создания подобного приложения служит присоединение к веб-контейнеру действия visit.

{
  ...
  "body": {
    "background": {
      "type": "html",
      "url": "https://news.ycombinator.com",
      "action": {
        "trigger": "visit"
      }
    }
  }
}

Второй шаг заключается в выполнении в действии visit соответствующей операции, основанной на анализе $jason.url.

Ниже показано, как мы проверяем, содержатся ли в $jason.url строки newest, show, ask, и так далее (они представляют собой ссылки в верхнем меню). Если нечто подобное удаётся найти — мы позволяем веб-контейнеру вести себя как обычный браузер, задавая значение "type": "$default".

Если соответствия вышеописанному шаблону найти не удалось, мы производим нативный переход $href к новому окну, передавая URL, по которому щёлкнул пользователь, в виде параметра.

...
"actions": {
  "visit": [
    {
      "{{#if /\\/(newest|show|ask)$/.test($jason.url) }}": {
        "type": "$default"
      }
    },
    {
      "{{#else}}": {
        "type": "$href",
        "options": {
          "url": "https://jasonette.github.io/Jasonpedia/webcontainer/agent/hijack.json",
          "preload": {
            "background": "#ffffff"
          },
          "options": {
            "url": "{{$jason.url}}"
          }
        }
      }
    }
  ]
},

Здесь можно посмотреть полный JSON-код этого примера, который, кстати, занимает всего 48 строк.

▍Быстрая разработка «гибридного» приложения


Под «гибридными» приложениями обычно подразумевают обычные веб-приложения, «завёрнутые» в нативные мобильные приложения.

Однако тут мы имеем в виду кое-что другое. В нашем случае речь идёт о настоящих гибридных приложениях, когда у одного и того же приложения может одновременно быть несколько нативных представлений и несколько веб-представлений. Кроме того, одно представление такого приложения может иметь несколько нативных компонентов пользовательского интерфейса и веб-контейнер, причём, всё это выводится в одном нативном макете.

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


Гибридное приложение

В этом примере я создал приложение, которое выводит сайт jasonbase.com в веб-контейнере, выступающем в роли основного элемента для визуализации данных.

Jasonbase — это бесплатный хостинг, который я создал специально для размещения JSON-разметки приложений, основанных на Jasonette.

На самом деле, это — обычный сайт, но я встроил его в Jasonette-приложение, в результате, при щелчках по ссылкам, вместо обычной процедуры открытия веб-страницы, вызывается нативный переход $href в нативном же элементе JASON.

Мне не пришлось дорабатывать код Jasonbase.com для того, чтобы создать это приложение. Я просто встроил веб-сайт в Jasonette-приложение в виде веб-контейнера и перехватил щелчки по ссылкам для обработки их нативными средствами, что, в частности, позволило воспользоваться переходами, и, при необходимости, позволит пользоваться и другими возможностями платформы, на котором работает приложение.

Код этого примера можно найти здесь.

Итоги


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

При обычном подходе разработчику, для того, чтобы достичь похожего результата, пришлось бы взять на себя решение следующих задач:

  • Встраивание веб-контейнера в нативный макет.
  • Создание JavaScript-моста, позволяющего приложению вызывать функции из контейнера.
  • Создание системы обработки событий, благодаря которой контейнер может обращаться к основному приложению, вызывая нативные API.

Решением этих проблем, в случае с Jasonette, стало создание уровня абстракции, состоящего из следующих основных частей:
  1. Декларативный язык разметки, который служит для описания того, как именно веб-контейнер должен быть встроен в нативное приложение.
  2. Коммуникационный протокол (JSON-RPC), который, крайне просто, позволяет организовать взаимодействие между родительским приложением и веб-контейнером.

Не берусь говорить о том, что это — решение всех проблем, но я с удовольствием отмечаю, что то, о чём я тут рассказал, очень пригодилось мне.

Я пытался создать приложение, использующее новейшую технологию, у которой не было стабильной и надёжной мобильной реализации (и неясно было, появится ли нечто подобное в обозримом будущем из-за особенностей того, о чём я говорю). Однако, к моему счастью, имелась JS-реализация этой технологии, что позволило мне без проблем интегрировать её в приложение.

В целом, говоря о новых возможностях Jasonette, могу сказать, что то, что получилось, мне очень нравится. Вот, кстати, документация по проекту, отражающая нововведения.

Теперь мне хотелось бы сделать одно важное, на мой взгляд, замечание: «Большая сила — это большая ответственность». Возможности, которые обрёл проект Jasonette, огромны, поэтому, полагаю, разработчикам, пользующимся этим фреймворком, нужно помнить о балансе возможностей мобильных платформ и HTML, позволяющем создавать приложения, с которыми будет удобно и приятно работать.

Кто-то может взять Jasonette и создать приложение, основанное исключительно на веб-контейнерах. Такое «приложение» правильнее будет называть «веб-сайтом». Подобный подход ставит под вопрос необходимость создания выделенного приложения.

Я хочу обратить ваше внимание на то, что я не призываю к тому, чтобы всегда создавать приложения, в которых обязательно используются и возможности мобильных платформ, и HTML-страницы. Я лишь пытаюсь сказать, что подобный подход может оказаться полезным во множестве ситуаций. Однако тут важно не перестараться, не перейти границы разумного использования технологий.

В итоге хочу сказать, что существует множество ситуаций, в которых возможности обмена данными между базовым приложением Jasonette и веб-контейнером позволяют креативно и красиво решать самые разные задачи. Надо отметить, что здесь мы обсудили лишь основы. Самое интересное — впереди.

Уважаемые читатели! Планируете ли вы использовать Jasonette для разработки кросс-платформенных мобильных приложений?

habr.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *