Тестирование на iOS 9 и выше: не баги приложений, а фичи платформы

an1c5zrgowqsya5p3luqvhexc_c.jpeg


3ucoo7wdrdjk5u1apjusvyc75s8.jpegОксана Фадеева, инженер по обеспечению качества Redmadrobot
У платформы iOS 9 и выше есть особенности, которые нужно учитывать при тестировании мобильных приложений. Некоторые из них могут ввести в заблуждение и восприниматься как дефект приложения, хотя на самом деле это специфика работы платформы.

В этой статье я опишу системные особенности iOS 9 и выше, на которые мы не можем повлиять, а также расскажу, на что еще надо обращать внимание при тестировании мобильных приложений на этой платформе. Надеюсь, это поможет вам сократить время тестирования своих приложений.


Данные, разрешения и безопасность


Передача данных

Начнем с одной из самых известных особенностей платформы. В iOS запрещена передача данных по соединениям http. Данные можно передавать только по https. Эту особенность нужно учесть при тестировании требований (если там есть описание API, в котором указан хост с типом соединения) и при постановке задачи для разработчика. Необходимо привести все к единому виду для iOS и Android.


Работа с файлами

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


Настройки

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


Разрешения от пользователя

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

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


t7rve4prcrbkcoxsc34xc-ipyvy.jpeg

Работа в фоновом режиме

У платформы 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 — это уведомления, которые приложение может запланировать и показать в будущем. Запланировать уведомление можно на конкретную дату или определенное местоположение.


vjf0bpmhy-1jvetq_nj5okvux0y.jpeg

Remote Notifications — это пуши от сервера. При получении пуша отображается уведомление или появляется бэйдж на иконке. Приложение при этом не запускается, а уведомления показывает система, поэтому мы в приложении не можем знать о всех пушах.
Приложение запускается только в том случае, если пользователь нажал на уведомление или выбрал какое-нибудь действие, например ответить или отклонить.


6n9vt3vdb4f_1za1pn75gljofgg.jpeg

Начиная с iOS 10 доступна возможность отображения дополнительного контента в уведомлениях. Для тестировщиков это означает, что нужно не забыть проверить корректность отображения встроенного контента. Особенно нужно обратить внимание на его содержание. Встроенный контент должен соответствовать тексту сообщения и не нарушать ничьих прав.


riec4qgukshluz_jglhdvi36rgk.gif
esqhiuy8yqiyh535a6te3-euczy.gif

Дизайн экранов и алертов. Сторонние клавиатуры

Заголовки в NavigationBar находится на разной высоте у iOS <11 и iOS ≥11. Большой заголовок делается системными средствами iOS, которые появились в 11 версии. На предыдущих версиях нет возможности сделать такой NavigationBar.


p52tl5fimjmigpjk9xrsx0on6-4.jpeg


Некоторые системные алерты и текст на них мы не можем менять — например, системные алерты от маркета.

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


d3trchgm9hfg2jxk8-3xilqxeoi.jpeg


Иногда клавиатуры сторонних производителей недоступны по одной из следующих причин:


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

Во всех этих случаях до завершения ввода текста будет отображаться клавиатура по умолчанию.


Deep Links

Deep Linking (глубинное связывание) — технология, благодаря которой пользователь может перемещаться между приложениями в заранее определенные разделы. Подробнее можно узнать в статье «Deep Linking для мобильных приложений».

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

Допустим, приложение можно ассоциировать с каким-нибудь доменом в интернете, например https://example.com (у нас должен быть контроль над этим доменом), и ссылки на страницы в этом домене будут открываться в приложении. У пользователя есть возможность перейти из приложения в браузер Safari по той же самой ссылке. Система запоминает выбор пользователя и все последующие ссылки будут открываться одинаково — либо в приложении, либо в сафари. Из-за этого может быть разное поведение при клике по ссылке на разных устройствах.


rzvs1o5ncuqa3nt2dpqmj2dtxbo.jpeg

© Habrahabr.ru