Тестирование на iOS 9 и выше: не баги приложений, а фичи платформы
Оксана Фадеева, инженер по обеспечению качества Redmadrobot
У платформы iOS 9 и выше есть особенности, которые нужно учитывать при тестировании мобильных приложений. Некоторые из них могут ввести в заблуждение и восприниматься как дефект приложения, хотя на самом деле это специфика работы платформы.
В этой статье я опишу системные особенности iOS 9 и выше, на которые мы не можем повлиять, а также расскажу, на что еще надо обращать внимание при тестировании мобильных приложений на этой платформе. Надеюсь, это поможет вам сократить время тестирования своих приложений.
Данные, разрешения и безопасность
Передача данных
Начнем с одной из самых известных особенностей платформы. В iOS запрещена передача данных по соединениям http. Данные можно передавать только по https. Эту особенность нужно учесть при тестировании требований (если там есть описание API, в котором указан хост с типом соединения) и при постановке задачи для разработчика. Необходимо привести все к единому виду для iOS и Android.
Работа с файлами
Приложения на iOS работают в «песочнице», в изолированном окружении, поэтому могут работать только с файлами, которые находятся в папке приложения. У них нет доступа к системным файлам и к другим приложениям. Приложения могут делиться файлами и декларировать, какого типа файлы они будут открывать.
Настройки
Начиная с iOS 10 можно перенаправить пользователя из приложения в системные настройки, но только на страницу приложения. Нельзя перенаправлять пользователя на произвольную страницу (например, на страницу настроек приватности).
Разрешения от пользователя
На работу с геолокацией, камерой, галереей, уведомлениями, контактами, календарем и т.д. надо получать разрешение у пользователя. Мы можем показать текст, поясняющий, для чего требуется разрешение, но не можем изменять заголовок и вид алерта. Пользователь в любое время может отозвать разрешение в настройках приложения или настройках приватности.
Если в настройках приватности запрещены какие-нибудь действия, то системный алерт с запросом пользователю не будет показан. Но мы можем показать пользователю свой алерт с просьбой вручную перейти в настройки и включить разрешение.
Работа в фоновом режиме
У платформы iOS есть своя особенность в работе приложений в фоновом режиме. В iOS нет такой прелести, как Android Background Services — если вручную завершить программу на iOS, код перестает выполняться.
Поэтому основная сложность заключается в том, как максимально быстро запустить программу в фоне, чтобы она продолжила выполнять свою задачу дальше, если её выгрузили из памяти iOS, если пользователь перезагрузил устройство или вручную «убил» программу.
VOIP background mode
Когда включен этот режим фоновой работы, iOS перезапускает приложение после перезагрузки устройства или если программа была выгружена из памяти самой операционной системой. Данный функционал включается при создании приложения разработчиком.
Кроме того, если программа свернута в фон, этот режим говорит iOS, чтобы она не закрывала сокет соединения, отмеченные флажком NSStreamNetworkServiceTypeVoIP. Например, можно узнать у разработчика, какой метод используется в конкретном приложении, и проверить, идут ли запросы в фоновом режиме.
Significant-change location
Этот функционал перезапускает программу в фоне по событию изменения координат, если она была выгружена из памяти. Метод не совсем надежный, так как трудно предсказать, в каком случае iOS запустит программу в фоне: это может произойти как сразу после завершения работы программы, так и через существенный промежуток времени (особенно если устройство не трогать).
Region monitoring location
Позволяет указать регион, за входом или выходом из которого iOS будет следить. В случае входа или выхода из этого региона iOS будет будить программу. Данную особенность нужно проверить, например, если программа должна отправлять текущие координаты по заданному пользователем интервалу.
Local Notifications
Используется, чтобы оповестить пользователя о том, что программа выгружается из памяти и не перезапускается (по не зависящим от пользователя причинам).
Действия, которые можно совершать в фоновом режиме
Ниже приведу список действий, которые можно совершать в фоновом режиме. Стоит помнить, что эти действия требуют определенной реализации и разрешений (доступов), которые должен дать непосредственно пользователь.
Xcode background mode | UIBackgroundModes value | Описание |
---|---|---|
Audio and AirPlay | audio | Приложение воспроизводит звуковой контент для пользователя или записывает аудио в фоновом режиме. Этот контент включает потоковое аудио или видео с использованием AirPlay. Пользователь должен разрешить приложениям использовать микрофон до первого использования |
Location updates | location | Приложение информирует пользователей об их местонахождении, даже когда оно работает в фоновом режиме |
Voice over IP | voip | Приложение предоставляет возможность пользователю совершать телефонные звонки, используя подключение к Интернету |
Newsstand downloads | newsstand-content | Приложение Newsstand, загружает и обрабатывает содержимое журнала или газеты в фоновом режиме |
External accessory communication | external-accessory | Приложение работает с hardware accessory, который должен регулярно доставлять обновления через платформу внешнего аксессуара |
Uses Bluetooth LE accessories | bluetooth-central | Приложение работает с аксессуаром Bluetooth, который должен регулярно доставлять обновления через Core Bluetooth framework |
Acts as a Bluetooth LE accessory | bluetooth-peripheral | Приложение поддерживает связь Bluetooth в периферийном режиме через Core Bluetooth framework. Использование этого режима требует авторизации пользователя |
Background fetch | fetch | Приложение регулярно загружает и обрабатывает небольшие объемы контента из сети |
Remote notifications | remote-notification | Приложение хочет начать загрузку контента, когда приходит push-уведомление. Используйте это уведомление, чтобы минимизировать задержку при показе контента, связанного с push-уведомлением |
Если приложение принудительно завершить, оно не сможет делать ничего из вышеперечисленного и не будет перезапущено системой.
Push-уведомления
Бывают два типа уведомлений — Local Notifications и Remote Notifications.
Local Notifications — это уведомления, которые приложение может запланировать и показать в будущем. Запланировать уведомление можно на конкретную дату или определенное местоположение.
Remote Notifications — это пуши от сервера. При получении пуша отображается уведомление или появляется бэйдж на иконке. Приложение при этом не запускается, а уведомления показывает система, поэтому мы в приложении не можем знать о всех пушах.
Приложение запускается только в том случае, если пользователь нажал на уведомление или выбрал какое-нибудь действие, например ответить или отклонить.
Начиная с iOS 10 доступна возможность отображения дополнительного контента в уведомлениях. Для тестировщиков это означает, что нужно не забыть проверить корректность отображения встроенного контента. Особенно нужно обратить внимание на его содержание. Встроенный контент должен соответствовать тексту сообщения и не нарушать ничьих прав.
Дизайн экранов и алертов. Сторонние клавиатуры
Заголовки в NavigationBar находится на разной высоте у iOS <11 и iOS ≥11. Большой заголовок делается системными средствами iOS, которые появились в 11 версии. На предыдущих версиях нет возможности сделать такой NavigationBar.
Некоторые системные алерты и текст на них мы не можем менять — например, системные алерты от маркета.
В ситуации, как на картинке ниже, нужно сравнить перевод текста сообщения с оригинальным текстом на английском языке. Есть шанс, что перевод некорректен. В такой ситуации сообщите о расхождениях команде разработки и менеджеру, чтобы они передали в Apple информацию об ошибке.
Иногда клавиатуры сторонних производителей недоступны по одной из следующих причин:
- Разработчик используемой программы не разрешает устанавливать клавиатуры сторонних производителей
- Текст вводится в защищенное текстовое поле (например, поле для ввода пароля), где вместо букв и цифр отображаются точки
- Используется цифровая, а не стандартная клавиатура
Во всех этих случаях до завершения ввода текста будет отображаться клавиатура по умолчанию.
Deep Links
Deep Linking (глубинное связывание) — технология, благодаря которой пользователь может перемещаться между приложениями в заранее определенные разделы. Подробнее можно узнать в статье «Deep Linking для мобильных приложений».
Мобильные дип линки (mobile deep links) все чаще используются во многих мобильных приложениях, но до сих пор многие разработчики и тестировщики сталкиваются с различными проблемами при их разработке и интеграции.
Допустим, приложение можно ассоциировать с каким-нибудь доменом в интернете, например https://example.com (у нас должен быть контроль над этим доменом), и ссылки на страницы в этом домене будут открываться в приложении. У пользователя есть возможность перейти из приложения в браузер Safari по той же самой ссылке. Система запоминает выбор пользователя и все последующие ссылки будут открываться одинаково — либо в приложении, либо в сафари. Из-за этого может быть разное поведение при клике по ссылке на разных устройствах.