Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp

    Вступление


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

    По всей видимости, Miscrosoft решила не отставать от компании Apple, в результате чего в начале декабря было объявлено о приобретении HockeyApp (подробнее в блоге HockeyApp и на сайте Microsoft). В отличие от Apple, Microsoft не стала урезать функционал сервиса или ограничивать список поддерживаемых платформ. В пресс-релизе говорится, что сервис продолжит свою работу без изменений, а в дальнейшем получит развитие, о подробностях которого мы узнаем позже.

    Система оценки: сервисы оцениваются по 10-балльной шкале по каждому из разделов (Регистрация и интеграция, Основной функционал, Дополнительный функционал, Continuous Integration). Суммарная оценка позволит определить победителя (итоговое заключение войдет в последнюю часть обзора).



    HockeyApp


    Регистрация и интеграция


    Регистрация в сервисе простая, с обязательным подтверждением по электронной почте. Бесплатный аккаунт не дает возможности полноценного использования сервиса — доступно только участие в качестве тестера, либо использование сервиса без ограничений в составе другой команды (аккаунта организации). Для того чтобы оценить сервис, возможно включить режим Trial — на 1 месяц (причём отсчет trial-период начнётся только с момента создания профиля первого приложения, а не со дня регистрации). Стоимость платного аккаунта начинается от $10 в месяц, подробнее можно ознакомиться здесь. Из плюсов можно отметить, что для любого типа платных аккаунтов отсутствуют ограничения на размер хранимых данных и количество пользователей, привязанных к аккаунту. Отличие разных тарифных планов в количество приложений и количестве аккаунтов с типом “Owner” (только для тарифных планов категории “Business”).

    Единственное пожелание к процессу создания аккаунта: сделать более понятным результат выбора опции “I’m developer”:

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

    Отдельно хотелось бы отметить, что на сайте сервиса имеется специальное руководство для тех разработчиков, кому необходимо произвести миграцию проекта, использующего TestFlight старой версии (до перехода к Apple): http://support.hockeyapp.net.

    Интеграция с SDK тоже достаточно простая, но конечно же далека от идеала, которым, по-моему, на данный момент является решение, используемое Fabric (Crashlytics) — о нём мы поговорим в заключительной — четвёртой — части обзора.





    Оценка: 7/10.

    Основной функционал


    Примечание (обновлено 15 июня 2015): говоря о дистрибуции приложений для iOS необходимо помнить, что на данный момент все сервисы, кроме TestFlight от Apple, по-прежнему должны учитывать ограничение на количество устройств доступных при использовании AdHoc provision profiles. Следовательно, максимум используемых устройств равен 100 на каждое семейство устройств (это условие было изменено 8 июня 2015 года, после объявления на WWDC об объединении всех developers programs в одну), в которые входят в том числе и устройства, используемые непосредственно разработчиками. Самым же большим ограничением является то, что список зарегистрированных устройств можно “обнулять” только раз в год, после продления подписки на iOS Developer Program (возможно в последующем и это условие будет изменено).

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

    Сервис предлагает несколько способов:
    • переход по ссылке в мобильном браузере на устройстве
    • считывание QR-кода (в котором закодирована та же ссылка)
    • добавление идентификатора вручную

    Интересный момент: при первоначальной регистрации тестового устройства я не получил уведомления по почте, что новое устройство было добавлено и доступно для использования. Однако в дальнейшем, при регистрации нового устройства на другой аккаунт, сервис автоматически определил, что устройство с таким UDID уже включено в provision profile приложения и мне на почту было отправлено извещение с возможностью пригласить нового пользователя в свою команду:

    Ещё одно замечание общего характера: сайт HockeyApp достаточно часто использует специальные “попапы” для сообщения о результате какого-либо действия. Например, после приглашения нового пользователя наверху страницы появится новый (временный) блок с сообщением:


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

    Сервис также позволяет импортировать список пользователей из текстового файла:

    Содержание файла может быть как минималистичным (только адрес электронной почты), так и с дополнительными данными (имя и роль).

    Примечание. Роль кодируется следующим образом:
    • “1” означает Developer
    • “2” — Member
    • “3” — Tester



    Присвоить роль “Owner” (или любую другую) можно на странице управления пользователями. Подробнее о ролях можно узнать тут и тут.

    Новый билд можно отправить либо вручную через сайт сервиса:

    Либо в полуавтоматическом режиме, если установлено десктопное приложение — в этом случае достаточно будет выполнить архивирование проекта (Product-Archive) — далее в появившемся попапе выбрать Upload:



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

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

    Важно: номер сборки должен всегда увеличиваться! Так как, даже если меняется версия, номер сборки нельзя использовать в значении меньше того, что использовалось до этого. Если же всё-таки нарушить данное правило, то новый билд будет считаться “старым” и, как следствие, не будет работать автоматическое уведомление о наличии новой версии и в информации об истории версий приложения “неправильный” билд окажется не в начале списка (подробнее).

    Даже если десктопное приложение не было запущено в момент подготовки архива, загрузку всех архивированных версий можно выполнить из раздела “Upload New Build”:

    Заметки для релиза могут быть как в простом, текстовом виде, так и с дополнительным форматированием при помощи распространенного языка разметки Markdown.

    При загрузке новой версии приложения через сайт сервиса возможно ограничить доступ к этой версии (при помощи опции Restrict downloads — в десктопном приложение эта опция неактивна).

    Также можно выбрать уведомление всех пользователей (которым будет доступна данная версия приложения) или уведомить только отдельных пользователей (при использовании десктопного приложения можно только выбрать между двумя вариантами: рассылать оповещение или не рассылать):

    Примечение: возможно баг: после загрузки новой версии без уведомления кнопка Notify (Manage version, вкладка Status) не приводит ни к каким действиям.

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

    Первоначальная установка веб-приложения HockeyApp на мобильном устройстве выполняется в несколько шагов:



    Иконка установленного веб-приложения HockeyApp:



    Возможность устанавливать предыдущие версии приложения есть, но реализован данный функционал не очень удобно. Он недоступен со страницы приложения на вкладке History, и для того чтобы им воспользоваться необходимо через меню (справа вверху) перейти в раздел Overview, там выбирать подраздел Versions, в нём найти нужную версию, открыть страницу с детальной информацией и уже только там будет доступна установка.



    Функционал отправки отзывов в HockeyApp в чём-то лучше реализованого в Apple TestFlight, так как позволяет прикреплять к сообщению до трёх вложений (но такая возможность есть только на планшетах):



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

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

    Сразу после отправки отзыва он отображается на вкладке Feedback, но сохраняется там только временно, на мобильных устройствах все сообщения можно просмотреть:
    • на iPad: Dashboard — вкладка Feedback
    • на iPhone/iPod Touch: детальная информация о приложении — верхнее правое меню — Overview — Feedback

    Примечание: возможность просмотра отправленных сообщений также зависит от роли пользователя и типа устройства.

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

    Также к недостаткам текущей реализации можно отнести невозможность отслеживать изменения статуса отзыва (Open/Waiting/Resolved/Ignored) для всех пользователей кроме тех, кто входит в группу Owner. Этот функционал доступен им в обычной/”десктопной” версии вебсайта — для пользователей же других групп сервис не осуществляет даже уведомление по электронной почте.

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

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

    Оценка: 8/10.

    Дополнительный функционал


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

    Подобный функционал в HockeyApp реализован на очень хорошем уровне. Отправка отчётов о падении работает сразу “из коробки” (естественно, если приложение использует фреймворк сервиса). Отчёты могут отправляться в полностью автоматическом режиме (после перезапуска приложения), либо с запросом на отправку с подтверждением пользователем (выбор режима делается один раз и его можно сбросить переустановив приложение).



    Если при отправке новой версии использовалось десктопное приложение, либо отладочные символы (*.dSYM) были загружены дополнительно с *.ipa, то сервис автоматически проводит “символизацию”, позволяя однозначно определить класс, метод и номер строки, которые стали причиной ошибки:

    Также сервис проводит группировку полученных отчётов, помогая оценить масштаб/частоту проблемы и следовательно определить приоритетность в исправлении выявленных ошибок (на скриншоте выше количество отчётов в группе можно увидеть в колонке Count, дополнительно о принципах группирования можно узнать здесь).

    Более того, если в десктопном приложении сервиса настроен доступ к репозиторию проекта, в детальной информации для отчёта о падении можно сразу увидеть “цитату” с кодом, а также открыть класс в Xcode:

    Дополнительно есть возможность загрузки отчёта о падении вручную, но это возможно сделать только на вебсайте сервиса:

    Примечание: с рекомендациями по разрешению проблем с “символизацией” можно ознакомиться тут.

    Кроме того сервис предоставляет возможность интеграции с системой отслеживания ошибок (например, Basecamp или JIRA, полный список тут).

    После того как связь с такой системой установлена, сервис может добавлять новые записи (тикеты) в автоматическом режиме:


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

    Вручную создание нового тикета на основе данных об ошибке возможно только на сайте сервиса:

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


    Исходный код для клиентской части SDK github.com/bitstadium доступен всем желающим — таким образом сервис демонстрирует свою прозрачность для Enterprise-клиентов.

    Дополнительные ссылки:

    Оценка: 9/10.

    Continuous Integration


    Примечания:

    1. Описанные далее нюансы использования сервисов как части непрерывной интеграции (continuous integration) в данном обзоре подразумевают, что она будет делаться на основе решения, предлагаемого компание Apple. То есть при помощи Mac OS X Server и Xcode bots — подробно на организации такой интеграции я не буду останавливаться, возможно это станет темой для отдельной статьи. Желающие могут ознакомиться с темой самостоятельно, например, обратившись к официальному руководству от Apple.

    2. К сожалению на данный момент настройка CI от Apple не всегда проходит гладко. Как правило возникают проблемы с signing identity и provision profiles, для их решения в простом случае достаточно установить последнюю версию OS X Server (на момент публикации 4.0.3 для OS X Yosemite) и в настройках Xcode добавить аккаунт Apple Developer. Если же проблемы остаются, то в моем случае потребовалось:
    • добавить используемый сертификат и ключ в keychain System
    • скопировать используемый provision profile в папку “/Library/Developer/XcodeServer/ProvisioningProfiles/” (сообщение об ошибке “No provisioning profiles containing one of the following signing identities was found”)
    • добавить исключение для codesign в свойствах для ключа (иначе, если бот настроен на создание архива, интеграция не сможет завершиться и будет остановлена с ошибкой “Creating archive failed: xcodebuild exited with status 15”, подробнее)


    Скрипт для использования вместе c ботами Xcode может быть в двух вариантах: с использованием curl или с использованием специальной утилиты puck (её можно установить вместе с десктопной версией клиента HockeyApp, подробнее):

    Во втором случае необходимо создать symlink для puck: “sudo ln -s /usr/local/bin/puck /usr/bin/puck”, иначе бот не сможет выполнить нужный скрипт.



    Сам скрипт добавляется на последнем шаге мастера создания/настройки бота:

    puck -download=true -notify=true -force=true -submit=auto -app_id=APP_ID -api_token=API_TOKEN "${XCS_ARCHIVE}"
    
    APP_ID - можно найти на странице приложения
    API_TOKEN - создается в настройках аккаунта на вкладке “API Tokens”
    

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

    -notes=<text>                             release notes text (single line only!)
    -notes_path=<path>                        absolute path to release notes file
    -tags=<comma-separated string>            restrict version to tags
    -teams=<comma-separated string>           restrict version to team IDs
    -users=<comma-separated string>           restrict version to user IDs
    

    Полный список параметров можно получить запуском “puck -help”.

    Оценка: 9/10.

    Итого суммарная оценка по всем разделам: 33 балла.

    Часть 1. Apple TestFlight. Продолжение следует...
    Аркадия
    67,56
    Заказная разработка, IT-консалтинг
    Поделиться публикацией

    Комментарии 10

      0
      Они до сих пор не пофисили чудный баг с потерей crash-репортов на iOS. Теперь баг воспроизводится не со 100% вероятностью, но всё же.
      — запускаем аппу
      — включаем режим полета (или network link conditioner в very bad network)
      — крашим приложение
      — перезапускаем приложение без доступа к инету (или не выключаем NLC)
      AR: краш репорт утерян примерно с 50% вероятностью (пару версий назад было 100%)
        0
        упс, чуток не дописал — естественно после перезапуска выключаем режим полета или отключаем NLC
        0
        Интеграция с SDK тоже достаточно простая, но конечно же далека от идеала, которым, по-моему, на данный момент является решение, используемое Fabric (Crashlytics) — о нём мы поговорим в заключительной — четвёртой — части обзора.

        Хм, странно, но я совсем недавно интегрировал HockeyApp и там все аналогично Fabric — отдельный Мастер настройки, по сути все то же. Но в отличии от Fabric, Hockey предложил установку через Cocoa pods (как альтернативу Framework интеграции)
          0
          К сожалению, у меня он не отработал (не сработала проверка на втором, если не ошибаюсь, шаге), поэтому решил не упоминать.

          Вообще изначально эта статья получилась 50+ страниц — после чего я приступил к правкам и сокращениям, так как уже получался не обзор, а руководство. Если кому-то интересно, то что-то из сокращенного могу добавить в комментариях.
            0
            Интересно.
            Как раз недавно решили тоже пользоваться HockeyApp.
            Кстати, у меня тоже прошла гладко интеграция, аналогичная Fabric.
              0
              хорошо, тогда сегодня завтра дополню в комментариях, то что не вошло выше.

              Кстати, у меня тоже прошла гладко интеграция, аналогичная Fabric.


              ок, нужно будет попробовать ещё раз, если что, то внесу правки в соответствующий раздел.
                0
                Спасибо!
          0
          Ключевое, не вошедшее в статью:

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

          Доступные для выбора варианты:
          • ежедневно (дайджест)
          • индивидуально (для каждого события)
          • индивидуально и ежедневно
          • отключить

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

          В десктопном приложении выбор типа релиза подразумевает, что все варианты, кроме Store, означают распространение дистрибутива через HockeyApp, в противном случае это Apple AppStore или Google Play market (http://support.hockeyapp.net/kb/about-general-faq/how-to-organize-development-and-production-apps)

          Webhooks:

          На сайте сервиса в разделе «Mange App — Webhooks» Webhook Help содержит реальные данные из профиля приложения.

          Каждое приложение (профиль) можно перенести на другой аккаунт (в другую организацию) без потери собранных данных. Очень удобно при смене команды или передаче проекта на аккаунт заказчика (и т.п. ситуации).
            0
            Новый билд можно отправить либо вручную через сайт сервиса:…
            … Либо в полуавтоматическом режиме, если установлено десктопное приложение — в этом случае достаточно будет выполнить архивирование проекта (Product-Archive) — далее в появившемся попапе выбрать Upload:


            Еще в OSX(на других ОС не пробовал) можно отправлять билд из командной строки.
              0
              да, в разделе Continuous Integration про это есть подробнее.

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

            Самое читаемое