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

в 11:48, , рубрики: HockeyApp, iOS, mobile development, Блог компании Аркадия, дистрибуция, мобильные приложения, разработка, разработка под iOS, распространение, тестирование, Тестирование мобильных приложений

Вступление

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

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

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

HockeyApp

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

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

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

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

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

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

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

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

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

Оценка: 7/10.

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

Примечание: говоря о дистрибуции приложений для iOS необходимо помнить, что на данный момент все сервисы, кроме TestFlight от Apple, по-прежнему должны учитывать ограничение на количество устройств доступных при использовании AdHoc provision profiles. Следовательно, максимум используемых устройств равен 100, в которые входят в том числе и устройства, используемые непосредственно разработчиками. Самым же большим ограничением является то, что список зарегистрированных устройств можно “обнулять” только раз в год, после продления подписки на iOS Developer Program.

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

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

Интересный момент: при первоначальной регистрации тестового устройства я не получил уведомления по почте, что новое устройство было добавлено и доступно для использования. Однако в дальнейшем, при регистрации нового устройства на другой аккаунт, сервис автоматически определил, что устройство с таким UDID уже включено в provision profile приложения и мне на почту было отправлено извещение с возможностью пригласить нового пользователя в свою команду:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 5
Ещё одно замечание общего характера: сайт HockeyApp достаточно часто использует специальные “попапы” для сообщения о результате какого-либо действия. Например, после приглашения нового пользователя наверху страницы появится новый (временный) блок с сообщением:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 6

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

Сервис также позволяет импортировать список пользователей из текстового файла:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 7
Содержание файла может быть как минималистичным (только адрес электронной почты), так и с дополнительными данными (имя и роль).

Примечание. Роль кодируется следующим образом:

  • “1” означает Developer
  • “2” — Member
  • “3” — Tester


Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 8
Присвоить роль “Owner” (или любую другую) можно на странице управления пользователями. Подробнее о ролях можно узнать тут и тут.

Новый билд можно отправить либо вручную через сайт сервиса:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 9
Либо в полуавтоматическом режиме, если установлено десктопное приложение — в этом случае достаточно будет выполнить архивирование проекта (Product-Archive) — далее в появившемся попапе выбрать Upload:

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

А потом закончить публикацию, при необходимости задав дополнительные настройки в появившемся окне:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 11
Примечание: Release type — может быть Store — в этом случае на сайт сервиса загружаются только отладочные символы — само приложение нельзя скачать из клиента сервиса, но сбор и анализ отчётов о падениях будет производится.

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

Даже если десктопное приложение не было запущено в момент подготовки архива, загрузку всех архивированных версий можно выполнить из раздела “Upload New Build”:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 12
Заметки для релиза могут быть как в простом, текстовом виде, так и с дополнительным форматированием при помощи распространенного языка разметки Markdown.

При загрузке новой версии приложения через сайт сервиса возможно ограничить доступ к этой версии (при помощи опции Restrict downloads — в десктопном приложение эта опция неактивна).
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 13
Также можно выбрать уведомление всех пользователей (которым будет доступна данная версия приложения) или уведомить только отдельных пользователей (при использовании десктопного приложения можно только выбрать между двумя вариантами: рассылать оповещение или не рассылать):
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 14
Примечение: возможно баг: после загрузки новой версии без уведомления кнопка Notify (Manage version, вкладка Status) не приводит ни к каким действиям.

Также при загрузке можно указать, что данная версия является обязательной — в этом случае пользователь не сможет продолжить использование более старой версии приложения — уведомление о наличии обновления будет показываться каждый раз и от него нельзя отказаться (при условии, что в приложении используется фреймворк сервиса).
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 15
Первоначальная установка веб-приложения HockeyApp на мобильном устройстве выполняется в несколько шагов:

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

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

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

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

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

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

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

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

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

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

  • на iPad: Dashboard — вкладка Feedback
  • на iPhone/iPod Touch: детальная информация о приложении — верхнее правое меню — Overview — Feedback

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

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

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

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

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

Оценка: 8/10.

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

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

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

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

Если при отправке новой версии использовалось десктопное приложение, либо отладочные символы (*.dSYM) были загружены дополнительно с *.ipa, то сервис автоматически проводит “символизацию”, позволяя однозначно определить класс, метод и номер строки, которые стали причиной ошибки:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 21
Также сервис проводит группировку полученных отчётов, помогая оценить масштаб/частоту проблемы и следовательно определить приоритетность в исправлении выявленных ошибок (на скриншоте выше количество отчётов в группе можно увидеть в колонке Count, дополнительно о принципах группирования можно узнать здесь).

Более того, если в десктопном приложении сервиса настроен доступ к репозиторию проекта, в детальной информации для отчёта о падении можно сразу увидеть “цитату” с кодом, а также открыть класс в Xcode:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 22
Дополнительно есть возможность загрузки отчёта о падении вручную, но это возможно сделать только на вебсайте сервиса:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 23
Примечание: с рекомендациями по разрешению проблем с “символизацией” можно ознакомиться тут.

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

После того как связь с такой системой установлена, сервис может добавлять новые записи (тикеты) в автоматическом режиме:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 24
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 25
Примечание: по умолчанию опция автоматического создания отключена. Также есть возможность задать минимальное количество полученных отчётов в группе, после достижения которого срабатывает автоматизация.

Вручную создание нового тикета на основе данных об ошибке возможно только на сайте сервиса:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 26
В качестве аналитических данных сервис предлагает графическое представление информации о числе отчётов о падении, скачиваний, установок, а также статистику по использованию той или иной версии приложения:
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 27
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 28
Исходный код для клиентской части 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, подробнее):
Сервисы дистрибуции мобильных приложений для iOS. Часть 2: HockeyApp - 29
Во втором случае необходимо создать symlink для puck: “sudo ln -s /usr/local/bin/puck /usr/bin/puck”, иначе бот не сможет выполнить нужный скрипт.

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

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

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. Продолжение следует...

Автор: sman

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js