Как я могу зарегистрировать идентификатор Touch в Simulator из командной строки?

Я хочу зарегистрировать Touch ID в iOS Simulator из командной строки, чтобы я мог запускать некоторые автоматические тесты пользовательского интерфейса вокруг авторизации.

Я пробовал несколько вещей, которые не сработали:

  • xcrun simctl не имеет опции Touch ID
  • AppleScript для управления меню не работает, потому что osascript не имеет разрешений на доступ (и мне не нравится это инвазивное обходное решение)
  • Я пробовал редактировать симулятор plist перед запуском, но не смог найти соответствующую пару значений ключа

Если это имеет значение, я использую Frank и Cucumber для тестов.

Ответ 1

xcrun simctl spawn 'iPhone X' notifyutil -s com.apple.BiometricKit.enrollmentChanged '1' && xcrun simctl spawn 'iPhone X' notifyutil -p com.apple.BiometricKit.enrollmentChanged

Это зарегистрирует fingerprint. Код взят отсюда

Изменение: Вы можете использовать это для прикосновения пальца:

xcrun simctl spawn 'iPhone X' notifyutil -p com.apple.BiometricKit_Sim.fingerTouch.match
xcrun simctl spawn 'iPhone X' notifyutil -p com.apple.BiometricKit_Sim.fingerTouch.nomatch

Ответ 2

Насколько я знаю, нет никакого способа активировать это на симуляторе.

Как правило, чтобы проверить что-то вроде этого, я подделываю обратный вызов из компонента Apple или выхожу из представления предупреждения, если ожидаемого обратного вызова нет (например, при вызове openURL:, я открою вид предупреждения с URL-адресом, который должен быть открыт, чтобы проверить, будет ли открыта правильная вещь при открытии этого URL-адреса) во время тестирования.

Он чувствует себя немного взломанным, но, по крайней мере, говорит мне, что если компонент Apple даст мне ожидаемый обратный вызов, мое приложение примет ожидаемое действие.

Как вы узнаете, тестирует ли он? Ну, у вас есть пара вариантов.

Джон Рид получил хороший пост о том, как сказать, тестируете ли вы во время работы здесь: http://qualitycoding.org/app-delegate-for-tests/ - хотя он использует его для отключите делегат приложения, я использовал подобный метод, чтобы проверить, тестируется ли приложение в настоящее время или нет.

Я не уверен на 100%, что этот метод будет работать с Cucumber и Frank, поскольку я не знаю, работают ли они в том же процессе, что и тесты. Для вещей, которые не работают в том же процессе, что и тесты (например, тесты XCUI), я передал аргументы ProcessInfo при запуске приложения, чтобы он знал, что искать. Боль в заднице, и опять же, взломанная, но она, похоже, работает.

Ответ 3

Есть способ сделать это из командной строки (без привлечения специальных возможностей), но он также довольно инвазивен (и не очень прост). Вы можете использовать платформу Apple CoreSimulator способом, аналогичным тому, что делает проект Facebook FBSimulatorControl (но который не поддерживает функцию регистрации touchID).

Вы можете увидеть пример скрипта Swift здесь:

https://github.com/flockoffiles/SimTestCtl/blob/master/SimTestCtl/main.swift

С его помощью вы можете зарегистрировать или отменить регистрацию уже загруженного симулятора iOS (с заданным UUID).