Разработка мобильного приложения на RTPlatform

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

В закладки

Рассказывает генеральный директор Bright Mobile.

Ранее я рассказывал о том, что мы реализовали платформу только для проектов в формате заказчик - исполнитель (статья). Но видя большой спрос на произвольные бизнес-приложения (знакомства, покупку товаров, кабинет для ЖКХ) на этой системе, пересобрали ядро так, чтобы программист во время реализации проекта самостоятельно выбирал какие модули использовать и подбирал конкретно те, которые нужны клиенту.

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

1. Автоматические тесты ядра

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

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

2. Упрощённое создание категорий

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

Думаю, что даже не программист увидит простоту создания новых категорий:

В классе AdFields описаны допустимые свойства поля объявления.

А вот пример создания тестовой категории с описанием полей:

Добавление и отображение объявлений теперь слушает параметры исходя из списка возвращаемого статической функцией getFields

Как мы видим, создаётся "Тестовая категория" с тремя полями - текстовая строка "Заголовок", многострочный текст "Подробнее о квартире" и текстовая строка "Общая площадь". Вот как это выглядит при сборке:

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

3. Модуль локализации

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

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

Файл локализации Рус / Укр

Вот так выглядит вывод локализированного интерфейса:

В среднем, такая задача занимает неделю, в зависимости от сложности приложения и количества экранов. Например, в своё время, локализация приложения на 40 экранов заняла у нас около полумесяца. При использовании такой заготовки можно уложиться в 4-6 часов на всё приложение.

4. Скорость загрузки длинных списков

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

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

5. Авторизация по звонку

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

Если же стоит задача сделать авторизацию по СМС, логину/паролю и иными простыми средствами, то срок реализации такой авторизации сводится к 8-и часам.

6. Баланс

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

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

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

Заключение

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

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Денис Гордиенко", "author_type": "self", "tags": [], "comments": 3, "likes": 1, "favorites": 10, "is_advertisement": false, "subsite_label": "tribuna", "id": 64893, "is_wide": false, "is_ugc": true, "date": "Thu, 18 Apr 2019 10:39:26 +0300" }
SMS-чат для клиентов
{ "id": 64893, "author_id": 127886, "diff_limit": 1000, "urls": {"diff":"\/comments\/64893\/get","add":"\/comments\/64893\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/64893"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199116, "last_count_and_date": null }

3 комментария 3 комм.

Популярные

По порядку

1

А вот что увидит программист, скрин "Добавление и отображение объявлений...." если категория будет соответствовать условию, функция вернет результат, зачем там else ?

Ответить
0

дефолтная категория

Ответить
1

Вы меня не поняли, https://play.golang.org/p/-rs9wwJmIui они эквивалентны, только первый вариант более лаконичен. И я, например, не понимаю такие описания в структурах (скрин первый) - масло масляное.

Ответить
0
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Нейронная сеть научилась читать стихи
голосом Пастернака и смотреть в окно на осень
Подписаться на push-уведомления
{ "page_type": "default" }