Сегодня мы хотим рассказать о нашем опыте разработки приложения VK (Вконтакте) для смартфонов Nokia. На тот момент, когда мы решили начать над ним работу, у нас уже был накоплен большой опыт работы с платформой Symbian, и нам было интересно продолжать создавать различные приложения для этой платформы.
Мы сотрудничаем с компанией Nokia уже очень давно. Компания оказывает нам партнёрскую поддержку в процессе разработки приложений для Symbian, предоставляя консультации и участие в различных программах, проводит мероприятия, на которых можно пообщаться с разработчиками из других компаний и предлагает интересные и перспективные проекты. Одним из таких проектов стало приложение VK.
Идея создания клиента для vkontakte.ru витала в воздухе. Nokia – крупнейший игрок на рынке смартфонов, и по поддерживаемому количеству устройств платформа Symbian в России является лидером. Однако ранее официального связующего звена между этими огромными сервисами не было. Нам приятно, что именно мы помогли реализовать этот проект.
Мы гордимся тем, что из всех существующих на сегодняшний день приложений VK для различных платформ то, которое мы создали для Symbian, наиболее близко к структуре самого сайта. Чтобы добиться этого мы тесно взаимодействовали с разработчиками Вконтакте в течение нескольких месяцев. Для разработки приложения использовался развитый API, опубликованный на сайте vkontakte.ru. Необходимо отметить, что на момент разработки приложения VK API активно развивался, его дорабатывали, в том числе, с нашим участием. Так, в процессе совместной работы появилась возможность добавлять подписи к фотографиям при их создании и удалять альбомы. Был добавлен текущий сетевой статус автора новости в список новостей. Стало возможным получать статистику страницы пользователя (количество фотографий, заметок, друзей и т.д.), списки наиболее популярных друзей. В мобильной версии появилась возможность отправлять сообщения с вложениями. Также мы помогли найти несколько ошибок в API, которые разработчики VK оперативно исправляли. Например, метод, скрывающий новости от определённых пользователей, изначально не работал, нельзя было посмотреть свои фотографии залитые на стену, приходили некорректные пути к видеофайлам и т.п.
Интересно было работать с дизайном приложения. Перед началом разработки приложения нам предоставили концепцию интерфейса, разработанную для iPhone версии. Использовать такую концепцию напрямую для Symbian было бы неправильно, а реализовывать приложение через контролы Symbian не очень красиво, так как мы хотели сделать приложение, стилистически схожее с оригинальным сайтом. В первой версии, предложенной нашими дизайнерами, все элементы были очень крупными. Но на современных смартфонах Nokia с большими экранами такой размер элементов начал казаться чересчур громоздким. В результате наши дизайнеры несколько раз меняли внешний вид приложения, руководствуясь дизайном сайта и требованиями к юзабилити мобильного приложения. Конечный вариант был получен при активной поддержке дизайнеров VK для поддержания общего курса в стилистике иконок и цветовых решений.
Самой главной проблемой в разработке для нас стало проигрывание видео. Сервер VK поставлял видео в двух вариантах: FLV и MP4. Однако устройства Nokia не поддерживали те настройки кодека MPEG-4, которые использовал сервер VK. Мы предложили разработчикам серверной части перекодировать контент в другой формат, но это было рискованно, так как можно было сломать поддержку других платформ и на момент разработки приложения видео не перекодировали. После обсуждения в API получения видео были добавлены поля для получения платформ-специфичных видео-файлов, но на момент релиза на многих девайсах приложение не могло проигрывать значительной доли видео. Сейчас же наши тестировщики говорят, что в новых прошивках смартфонов проблем с воспроизведением видео из ВКонтакте нет.
Приложение было выполнено на минималистичном кроссплатформенном графическом движке, разработанном SPB Software, основной язык – С++. Использовалась концепции Model/View, логика приложения и графические компоненты были достаточно сильно разделены. Общий подход напоминал разработку приложения с использованием QML: практически вся графическая логика описана в XML, а в исходниках на С++ обрабатывается только логическая часть. Небольшой модуль-посредник позволяет преобразовывать структуры, полученные от сервера, в графические структуры, используя код только для особых случаев. Для представления в программе API’шных структур используется кодогенератор, написанный на Python, который преобразовывает формальное минималистичное определение структур, взятое со страниц API, в удобный для С++ приложения вид (типизированные структуры, с поддержкой интерфейсов, всех необходимых объявлений и функций). При необходимости незначительных операций с полями структур можно было прямо на уровне определений прописывать небольшой функционал. Это требовалось для получения времени в разном формате, комбинации имени и фамилии в одну строку и т.п., как будто это обычное поле.
Графические компоненты библиотеки Qt решили не использовать для симбиановской версии приложения ради повышения производительности, стабильности и удобства для пользователей (на основной массе устройств для запуска приложения потребовались бы дополнительные действия).
Характерное программное решение: для минимизации зависимостей и упрощения кода активно использовались функциональные объекты (функторы). Их активное использование позволяет уменьшить количество абстрактных классов, что хорошо сказывается на поддержке кода. Например, функция для закачки файла выглядит приблизительно так:
template<class T>
Functor<void, void> FireRequest( Connection& connection, const String8& url, Functor<void, T> on_succ, Functor<void, ErrorReason> on_fail );
Типичная функция вызова диалога или панели вида:
Functor<void, void> RunWaitDialog( const String& text, Functor<void, void> on_cancel );
Использовано чёткое разделение: в движке (для работ со скинами, url и т.п.) 8-битные строки, а в том, что может увидеть пользователь – платформозависимый юникод.
Менеджемент памяти осуществлялся с помощью аналогов boost::intrusive_ptr и boost::weak_ptr для объектов и с использованием контейнеров STL для массивов и т. п. STL использовался как есть, зависимости от boost не было. Использование ручного управления памятью (использование delete) было сведено к минимуму.
Еще одной особенностью работы с приложением Вконтакте является то, что все время необходимо было следить за развитием социальной сети, появлением новых возможностей, функций, улучшениями в дизайне. Вконтакте – динамично развивающаяся социальная сеть, и официальное приложение Вконтакте не должно отставать от нее. Мы отслеживали процесс оптимизации сайта и меняли наше приложение в соответствии с ним. Изменения сайта за время разработки потребовали переделки дизайна и диалогов. Некоторые вещи, такие как динамическая подгрузка списков новостей, мы сделать не успели.
За месяц до выпуска программы началось активное бета-тестирование, в котором приняли участие сотни людей. В любом бета-тестировании, помимо поиска багов, самое важное для разработчика – то, как пользователь оценивает программу, насколько она ему понравилась/не понравилась, готов ли он будет ею пользоваться в дальнейшем. И мы были очень рады получить позитивную обратную связь от бета-тестеров Вконтакте. Мы поняли, что двигаемся в правильном направлении и создаем то, что нужно пользователям. Как следствие – к середине октября более 600 тысяч пользователей скачали приложение из магазина Nokia.
Работа над приложением была очень интересной. Компания Nokia консультировала нас по техническим вопросам и оказывала маркетинговую поддержку, а благодаря предоставленным Вконтакте API и идеям у нас не возникало особых сложностей в разработке.