Сборка iOS-приложения на облачном Mac прошла успешно, а кнопка подтверждения в симуляторе нажимается. Но это ещё не значит, что команда проверила тактильный отклик. Симулятор позволяет убедиться, что код подготовил нужное событие, но не даёт почувствовать вибрацию. Разделите эти задачи: первую автоматизируйте, вторую проверяйте на физическом устройстве с поддержкой тактильного отклика.
Сначала определите смысл отклика
Возьмём сообщение «Сохранено». Отклик должен срабатывать один раз после успешного сохранения, а не сразу после нажатия кнопки. Если сохранить данные не удалось, интерфейс должен показать ошибку, но не воспроизводить отклик успешного действия. Прежде чем писать тесты, зафиксируйте три части контракта: условие срабатывания, тип события и число срабатываний.
Не заменяйте тактильным откликом текст или видимое состояние интерфейса. Пользователь может отключить системный тактильный отклик или пользоваться устройством, которое не поддерживает выбранную тактильную функцию. Результат сохранения всегда должен подтверждаться визуально; тактильный отклик лишь добавляет к нему ещё один воспринимаемый сигнал.
Автоматические тесты подтверждают, «какой отклик был запрошен». Проверка на физическом устройстве отвечает на вопрос, «уместен ли этот отклик по ощущениям». Одно не заменяет другое.
Отделите описание события от кода воспроизведения
Если параметры события разбросаны по обработчикам нажатий, тестам остаётся лишь косвенно выяснять, что произошло, нажимая кнопки в интерфейсе. Сначала создайте функцию, которая формирует события, а затем используйте её в слое воспроизведения. Так тесты смогут напрямую проверять количество и тип событий, а также их относительное время — независимо от того, вибрирует ли устройство.
Проверяйте события на облачном Mac
В примере ниже сообщение «Сохранено» представлено одним коротким событием. Значения параметров — отправная точка, а не универсальная рекомендация по интенсивности; окончательные значения нужно подобрать и подтвердить на физическом устройстве.
import CoreHaptics
func confirmationEvents() -> [CHHapticEvent] {
let event = CHHapticEvent(
eventType: .hapticTransient,
parameters: [
CHHapticEventParameter(parameterID: .hapticIntensity, value: 0.65),
CHHapticEventParameter(parameterID: .hapticSharpness, value: 0.35)
],
relativeTime: 0
)
return [event]
}
В тестовом таргете проекта сначала проверьте контракт, для которого не требуется устройство воспроизведения. Тесты и код приложения должны обращаться к одной и той же функции confirmationEvents(). Не создавайте в тесте отдельную копию события: со временем параметры в двух местах могут разойтись.
import XCTest
import CoreHaptics
@testable import YourApp
final class ConfirmationHapticsTests: XCTestCase {
func testConfirmationIsOneImmediateEvent() {
let events = confirmationEvents()
XCTAssertEqual(events.count, 1)
XCTAssertEqual(events[0].relativeTime, 0)
XCTAssertEqual(events[0].eventType, .hapticTransient)
}
}
Замените YourApp на фактическое имя модуля и запустите тестовый таргет на облачном Mac через уже используемый в проекте общий способ запуска тестов. Здесь проверяется определение события; настоящая вибрация от симулятора не требуется. Если позже команда решит заменить одиночный отклик ритмом из двух частей, сначала обновите контракт и тесты, а затем оцените ощущения на физическом устройстве.
Ошибка воспроизведения не должна менять результат сохранения
Перед созданием движка и проигрывателя слой воспроизведения должен проверить CHHapticEngine.capabilitiesForHardware().supportsHaptics. Запуск движка, создание паттерна или воспроизведение могут завершиться ошибкой. Такие ошибки следует фиксировать для внутренней диагностики тактильного отклика, но нельзя из-за них считать уже успешно выполненное сохранение неудачным. После прерывания работы движка не предполагайте, что прежний проигрыватель по-прежнему пригоден: заново подготовьте состояние воспроизведения с учётом жизненного цикла приложения.
| Ситуация | Что должно гарантировать приложение | Работа с тактильным откликом |
|---|---|---|
| Сохранение успешно, тактильный отклик поддерживается | Показать состояние завершённого сохранения | Запросить воспроизведение события успеха |
| Сохранение успешно, тактильный отклик не поддерживается | Показать то же состояние завершённого сохранения | Пропустить воспроизведение |
| Сохранение не удалось | Показать понятную ошибку | Не воспроизводить событие успеха |
| Ошибка при воспроизведении | Сохранить результат уже завершённого сохранения | Прекратить текущую попытку воспроизведения и записать диагностические сведения |
Проверяйте момент вызова, а не ощущения в симуляторе
Оберните действие воспроизведения в заменяемый интерфейс. В тестах сценария сохранения подставьте реализацию, которая считает вызовы: после успеха ожидайте один вызов, после ошибки — ноль. Если бизнес-логика блокирует повторные нажатия, они тоже не должны вызывать лишнее воспроизведение. Отдельно проверьте ветку для устройства без поддержки тактильного отклика: видимый результат не должен меняться. Такие проверки надёжнее вопроса «вибрировал ли симулятор» и точнее отражают то, что код действительно может гарантировать.
Оценку ощущений оставьте для физического устройства
На физическом устройстве проверьте как минимум успешное и неудачное сохранение, быстрые последовательные действия и первое действие после возвращения из фонового режима. Посмотрите, совпадает ли тактильный сигнал по времени с появлением состояния завершения; не сливаются ли сигналы при повторных нажатиях; можно ли по-прежнему запросить отклик после прерывания звука системой или ухода приложения в фон. Меняйте только один параметр за раз и записывайте модель тестового устройства, версию системы и наблюдения, чтобы не принять субъективные различия за регрессию в коде.
На облачном Mac можно выполнить сборку, тесты в симуляторе и проверку контракта событий. Сами ощущения команда всё равно должна подтвердить на устройстве с поддержкой тактильного отклика. Анимация кнопки, видимая через удалённый рабочий стол, не доказывает, что тактильный отклик прошёл приёмку.
Проверьте границы перед слиянием изменений
Перед слиянием убедитесь в четырёх вещах: рабочий код и тесты используют одну функцию генерации событий; неудачное сохранение не запускает отклик успеха; при отсутствии поддержки тактильного отклика или ошибке воспроизведения результат остаётся ясно видимым; записи о проверке на физическом устройстве включают наблюдения за моментом срабатывания и последовательными действиями. Если по итогам такой проверки параметры меняются, обновите ожидаемые значения в тестах событий и повторно запустите автоматические проверки.
При таком разделении задач тесты на облачном Mac контролируют воспроизводимые факты, а проверка на физическом устройстве — ощущения, о которых симулятор ничего сказать не может.
Часто задаваемые вопросы
Можно ли оценить качество тактильного отклика только в симуляторе iOS?
Нет. В нём проверяют параметры событий и условия вызова; силу отклика и совпадение с изображением оценивают на поддерживаемом физическом устройстве.
Нужно ли считать действие неуспешным, если Core Haptics недоступен?
Нет. Основное действие и обновление видимого состояния должны завершиться; тактильный отклик остаётся необязательным дополнением.
Выделенный Mac для следующего эксперимента
Выберите физический Mac mini, узел и период оплаты. Модель и доступность уточняйте в консоли — там отображаются актуальные данные.