В начале 2105 года мы взялись разработать мобильное приложение для Чемпионата мира по водным видам спорта FINA 2015. Незадолго до этого мы разработали презентационное приложение KAZAN AR c технологией дополненной реальности для FINA 2015. Сейчас целью создания приложения было обеспечить гостей и участников чемпионата быстрым и удобным способом получения информация, связанной с чемпионатом. На момент старта работы над проектом существовал только сайт, какого либо внешнего API еще не существовало. Всего за месяц нам нужно было разработать многофункциональное приложение для 2 платформ, а на кону был имидж Республики. Как мы справились с задачей и как нам помог в этом Microsoft Azure, читайте ниже:
При разработке приложения для платформ iOS и Android перед нами встала задача обеспечить единый бэкенд. Мы выбрали облачную платформу Azure в связи с ее надежностью, возможностью быстрого старта и простотой разработки.
В итоге была создана следующая архитектура:
Back-end: Веб-приложение на Django 1.7 + Django REST Framework (http://apifina.robotscandream.com/). Azure Web App представляет собой PaaS-сервис с возможностью размещать Django-приложения, а так же другие приложения на базе PHP, .NET, Java и Node.js.
Parser: Виртуальная машина Ubuntu. Для парсинга использовалась питоновская библиотека Grab. У бекенда и парсера общая кодовая база. Виртуальные машины Azure позволяют размещать любые решения на Linux и Windows, предлагая готовые шаблоны на базе разных дистрибутивов и решения из Azure Marketplace.
DB: Mysql на виртуалке Ubuntu, без репликации. В галерее виртуальных машин Azure представлены готовые официальные образы Ubuntu с поддержкой от Canonical.
Push-уведомления: Azure Push Notification Hub, подписки на теги по видам спорта, странам и медалям c использованием шаблонов для локализации сообщений. Готовый к использованию по запросу сервис Azure Push Notification Hubs предлагает возможности единого механизма масштабных рассылок пуш-уведомлений на любые устройства с любыми ОС и сервисами PNS. Сервис помогает разработчику тем, что из коробки предлагает подписку пользователей по тегам, шаблоны сообщений для рассылки на разные аудитории и на разных языках и многое другое.
Картинки: Хранилище Azure Storage – масштабное хранилище, которое по умолчанию хранит данные в трех копиях и позволяет сохранять данные любого типа: блобы, очереди, данные в виде ключ-значение и даже файлы в виде SMB-ресурса.
На клиенте хранилась база идентичная базе сервера, за исключением некоторых служебных сущностей. Данные на клиенте обновлялись инкрементально (запросами типа "Получить список новостей, измененных после заданного времени"). Обновление происходит раздельно (отдельные http запросы) для разных разделов (Расписание, Результаты, Новости, Фото, и т.д.) и запускалось как автоматически (background fetch в iOS, sync adapter в Android), так и "вручную" (но незаметно для пользователя) при просмотре приложения.
Серверная часть отображения максимально простая. Были декларативно заданы классы сериализаторов (ModelSerializer) и представлений (ModelViewSet) (на все 2 небольших файла), остальным занимался Django REST Framework.
Информация об объектах (описание, фото, маршруты транспорта) могла изменяться в период чемпионата, поэтому мы остановились на варианте: заполнялась через админку вручную. Для загрузки фото в хранилище Azure использовалась слегка доработанная библиотека django-storages.
Для парсинга новостей и медиа разделов использовалось Spider API библиотеки Grab. Что позволило адекватно собирать информацию с сайта на двух языках (англ. и рус.). При этом также отслеживались изменения уже имеющихся в базе новостей.
Медальный зачет синхронизировался с сайтом kazan2015.com через предоставленный разработчиками сайта API (единственный, который удалось выбить), выдававший данные в формате XML. Эта информация преобразовывалась и клалась в БД сервера в необходимом формате (для инкрементальных обновлений клиентов)
Расписание и информация о спортсменах грузились и обновлялись из CSV-таблиц. Для обновлений также пришлось реализовывать выявление изменившихся записей.
Результаты соревнований заполнялись вручную через админку, так как не было возможности написать парсеры PDF файлов, выкачиваемых с официального сайта поставщика результатов соревнований FINA 2015 — www.omegatiming.com. Вдобавок файлы имели разный формат отображения для разных дисциплин.
Push-уведомления отправлялись автоматически при появлении соответствующих данных. Мы предоставили пользователю функционал формирования персонализированной push-подписки.
Ниже результаты использования клиента на базе iOS:
Результаты использования клиента на базе Android:
Хотели бы отметить, что в процессе проектирования приложения мы использовали внедренную нами в этап дизайна практику «ошибки выжившего». Так как приложением пользовались граждане разных стран, нам нужно было сделать приложение user friendly для пользователей с разным пользовательским опытом. Для этого мы анализировали самые неудачные приложения спортивных мероприятий, чтобы не допустить их ошибок.
Приложение получило 4 из 5 звезд на Play Market и 4,5 из 5 на App Store. Думаем, это хороший результат. Кроме того, мы постоянно получали письма благодарности за хорошее приложение на самых разных языках. Это была лучшая награда за наш труд.
Проведите конкурс среди участников CMS Magazine
Узнайте цены и сроки уже завтра. Это бесплатно и займет ≈5 минут.