Поисковик авиабилетов momondo выпустил линейку приложений-гидов для iOS momondo Places, включающих в себя подробную навигацию по таким городам, как Москва, Нью-Йорк, Амстердам, Барселона, Рим, Рио. Всего на данный момент 12 приложений — двенадцать городов по всему миру. В этом посте мы расскажем о том, как оно работает с точки зрения пользователя — и с точки зрения разработчика.



Версия для iPhone | Версия для iPad

Приложения отличаются тем, что вся информация хранится прямо в памяти устройства, что делает их независимыми от интернет-соединения. Ценой этого является их вес: например, 77 МБ для Москвы или 103 МБ для Парижа. Впрочем, это не так уж много даже даже для владельцев 16-гиговых смартфонов.



В основе приложения — идея тематических подборок мест под одно из шести заданных настроений: Модное, Культурное, Семейное, Местное (для тех, кому лень далеко идти), Романтическое и Социальное, или — если нет наcтроения определяться вообще — «Все настроения».


«Каждое место имеет настроение» — девиз momondo Places

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

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

Забавно, что в нью-йоркской версии momondo Places для романтического настроения нет ничего во вкладке шоппинг – как будто мы не живём в мире, где все чувства давно научились использовать для повышения продаж.



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

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



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

Все места сразу можно вывести на карту, нажав на иконку в правом верхнем углу. Тут все точно также рассортировано по настроению и типу мест.



В основном меню — поиск, полеты и отели в Нью-Йорке (ссылка на momondo Flights and Hotels приложение), информация о городе, его районы, добавление новых мест и настройки.



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

По заявлению разработчиков в каждом из 12 пока доступных городов они наполнили информацией о как минимум 200 интересных местах, которые собирались при участии местных авторов. К слову, количество мест постоянно увеличивается. Чтобы посмотреть апдейт, нужно зайти в основное меню и найти раздел New places.

Как это устроено


Следующая часть поста будет интересна тем, кто хочет заглянуть «под капот» нашего приложения.



Главный экран momondo Places с программной стороны состоит из:

  • 6 контейнеров/контроллеров представлений (view controllers), каждый из которых имеет свое предназначение
  • 11 gesture recognizers (в дополнение к тем, которые предоставлены UIScrollView/UITableView)
  • 19 индивидуальных spring-based POP (Facebook) анимаций для таких вещей, как масштабирование, перемещение, исчезание и проявление разных представлений
  • 14 property observers, реагирующие на изменения состояния цветового колеса (движение вверх / вниз)



При свайпе вверх движение колеса, размер, исчезновение текста на нем, свечение и все остальные действия происходят пропорционально. Конкретные gesture recognizers становятся включены / отключены.

«Нашей команде было интересно создать приложение на Swift и мы решили попробовать написать новую версию Places для iPhone на этом языке полностью, без использования Objective-C.»
— Денис Торбичук, iOS-разработчик momondo

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

Разработчики используют простой класс для сохранения состояния значений элементов модели, для которых обеспечивается связывание с соответсвующими отображениями в интерфейсе (например прогресс вертикальной прокрутки ведущего Scrollview):

class BookViewControllerInteractionCoordinator {

    //Прогресс вертикальной прокрутки ведущего Scrollview
    //Значения: 0,0 - 1,0
    //0 - означает, что прогресс прокрутки в верхнем положении (0) - колесо будет маленьким
    //1 - означает, что прогресс прокрутки в верхнем положении (200 в настоящее время) - колесо будет большое, как результат
     var colorWheelVerticalProgress = ObservableProperty<Double>(1.0)
  ...
}

Для отслеживания изменений наблюдаемых объектов используется класс ObservableProperty:

/// A mutable property of type T that allows observation of its changes.
public final class ObservableProperty<T> {
    private var sinks = Bag<SinkOf<Event<T>>>()

    /// The current value of the property.
    ///
    /// Setting this to a new value will notify all sinks attached to
    /// `values()`.
    public var value: T {
        didSet {
            dispatch_sync(queue) {
                for sink in self.sinks {
                    sink.put(.Next(Box(self.value)))
                }
            }
        }
    }
    ...

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

 wheelVerticalScrollObserver = coordinator. colorWheelVerticalProgress.values().start {
            [weak self] progress in
            if let strongSelf = self {
                
                //scroll category bar based on the wheel progress
                let moveAnimation:POPSpringAnimation = strongSelf.categoryHeaderCarouselTopConstraint.pop_animationForKey("moveAnimation") as POPSpringAnimation? ?? {
                    let moveAnimation = POPSpringAnimation.springAnimationWithPropertyName(
                        .LayoutConstraintConstant,
                        bounciness: 3.0,
                        speed: 10.0
                    )
                    strongSelf.categoryHeaderConstraint.pop_addAnimation(moveAnimation, forKey: "moveAnimation")
                    return moveAnimation
                    }()
                
                moveAnimation.toValue = round(interpolate(44, 600, progress)) // small wheel state -> big wheel state

            }
        }

Резюме


В целом приложение работает достаточно стабильно, единственное место где были замечены терпимые лаги – меню поиска. Но с этим жить можно. За все время теста на iPhone 5 не было ни единого вылета или заметных провисаний.

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


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

Расскажите, какими приложениями-гидами пользуетесь в поездках вы? И готовы ли вы их поменять на momondo Places?

Комментарии (8)


  1. babooon
    16.04.2015 19:06
    +2

    Под Android планируется выпуск этих приложений?


    1. momondo_russia
      16.04.2015 19:55
      +1

      Пока в ближайшем времени не планируем


      1. yktoo
        17.04.2015 17:00
        +1

        Cорри, но это фэйл.

        image

        Отсюда


  1. sibvic
    16.04.2015 19:17
    +1

    В правильную сторону идете, но trip advisor пока на нас не променяю.


    1. momondo_russia
      16.04.2015 19:52
      +1

      Спасибо! будем значит работать дальше, чтобы когда-нибудь променяли:)


  1. sibvic
    17.04.2015 17:58

    Пришел домой теперь могу поподробней написать свои мысли, чем пользуюсь и чего мне не хватает. Тема наболевшая, так как очень скоро отпуск, и сейчас уже планирование подходит к концу.
    Итак, отпуск у меня состоит из следующих этапов:
    1) Есть примерные даты отпуска. Конкретного направления у меня на этот момент нет. Я не из default city, и даже не из альтернативного default city. Я из не самого большого города в Сибири, поэтому прежде всего выбираю не туда куда хочу, а куда вообще возможно. Из моего города за границу вообще мало куда летают, из соседних городов — значительно больше (но до них ещё тоже надо добраться, что увеличивает бюджет и уменьшает время на реальный отпуск). Поэтому для меня сейчас незаменим aviasales с их картой низких цен. Нахожу куда более-менее дешево и удобно можно улететь. После определения направления сами билеты ищу на нескольких разных агрегаторах вроде вас или skyscanner. Покупаю где дешевле.
    2) Билеты на самолет куплены, дальше смотрю что там есть интересного (конкретно список). Тут идеального решения нет. Самое лучшее что есть — Trip Advisor. Открываю список достопримечательностей в том городе, смотрю что есть интересного из достопримечательностей, ресторанов и магазинов. Всё интересное добавляю в список (на том же trip advisor). Смотрю на карту с помеченными достопримечательностями, прикидываю сколько времени надо чтобы большинство из них обойти. Если отпуск длиннее чем этого времени, смотрю на том же trip advisor соседние города. И так повторяю пока отпуск весь по времени не забью.
    3) В результате составленного списка городов прикидываю по гугл картам как между ними передвигаться. Либо составляю список нужных маршрутов/поездов (обычно в google docs), либо бронирую машину (обычно напрямую с сайта прокатных компаний которым доверяю).
    4) Когда определился с транспортом, начинаю поиск отелей (при прокате авто беру отели подальше от центра и с парковкой, иначе наоборот, поближе к центру). Отели выбираю опять же через trip advisor (мне очень нравятся как они оптимальные отели подбирают). После того как определился с отелем, ищу выбранные отель через агрегаторов (trip advisor, epronto). Бронирую где выгодней получается по соотношению цена/условия (вроде бесплатной отмены).
    5) На этот момент авиабилеты есть, транспорт есть, отели есть, список чего посмотреть тоже есть. Осталось это всё воедино соединить, видеть общую картину и список в хронологическом порядке. Тут начинается самая ж... самое сложное. В отпуске главное ничего не забыть, то есть надо составлять чек-лист чего взять в последний день (паспорт, права, брони, деньги/карты...) — todoist. Распечатываю авиабилеты и брони. Все авиабилеты и брони загоняю в trip it (сейчас пробую пользоваться tripcase), но его интерфейс и юзабилити хромают: не все билеты они сами умеют парсить из почты, вручную забивать очень не хочется. Passbook с билетом присылают лишь некоторые авиакомпании, а ни trip advisor, ни trip case его не понимают (хотя trip case может по коду брони автоматом информацию подтягивать, но не проверял). Для билетов passbook пользуюсь passwallet (android).
    С отелями ещё страшнее. Ни trip it, ни trip advisor толком брони с отелей не понимают (разве что с booking). Приходится вручную вбивать адрес, название отеля, дату и время заезда, дату и время выезда, код брони и т.д. Информацию о том какие услуги полагаются вручную точно переносить замучаешься, поэтому довольствуюсь только распечаткой. С мобильной версией trip it это можно даже не пытаться делать, только через веб интерфейс. С trip case получше, он хоть как-то пытается облегчить жизнь предлагая отели радом с введенным адресом, но тоже как-то жутко криво (часто не находит отели) и не очень удобно. Всякие агрегаторы легко находят эти отели и их адреса, почему в trip it и аналогах не сделают такого — не понятно.
    Дальше идет транспорт (если есть купленые ж/д билеты, с которыми дела не лучше чем с отелями) или прокат авто (хоть это работает без нареканий, по крайней мере в trip it.
    И последнее — список достопримечательностей. Раньше пытался добавлять в trip it, но это жутко долго и потом неудобно пользоваться. В итоге на случай если останусь без интернета или сядет батарейка на сотовым рапечатываю с trip advisor (там тупо печатается текущая страничка, что смотрится просто ужасно после распечатки) и пользуюсь их же приложением trip advisor, чтобы смотреть что поблизости есть и что запланировано.

    В общем, всё это приходится делать в куче программ, каждое их которых криво по-своему. Купить и забронировать — не проблема, проблема потом этим воспользоваться. Была большая надежда на trip it, но с 2011 года они далеко не ушли. Только хуже стало. Интерфейс ужасен, пользоваться неудобно. Trip case покрасивее и чуть более человеческий, но тоже очень далек от идеала. К trip advisor претензия та же что и к trip it… разве что у них кое-какой прогресс заметен.
    И будучи программистом я вообще не понимаю почему никто нормально не сделал. Все делают мобильные приложения, но почему-то заставляют вбивать планы вручную заполняя на телефоне 100500 полей. У меня в руках сотовый, в нем есть камера, QR-коды (и прочие) читаются на ура. Почему авторы этих программ до сих пор не договорились о каком-то стандарте файла (вроде passbook для билетов) или генерации QR-кодов, который можно вставлять в письме которое мне всякие агрегаторы вроде hotels/booking присылают — не пойму (тут только ozon.travel отличился, присылает QR-код с ссылкой на google maps с координатами отеля). Ведь намного проще нажать в программе кнопочку, навести на шрих-код и получить все поля о брони заполнеными. Или запомнить GPS метку достопримечательности которую я собираюсь посетить (камень в огород trip advisor, и плюсик ozon.travel).
    Плюс очень нехватает после всего этого быстрой прокладки маршрутов, то есть на основе списка достопримечательностей строить оптимальный маршрут.
    Уже подумываю написать свой парсер и свою программу для организации всей этой информации… жалко что времени нет. Надеюсь этот комментарий прочитают «нужные» люди и что-нибудь из этого сделают, чтобы планирование хотя бы следующего отпуска стало попроще.


    1. momondo_russia
      21.04.2015 17:00

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


  1. momondo_russia
    21.04.2015 16:59

    .