- PVSM.RU - https://www.pvsm.ru -
Всем привет! Меня зовут Паша Лесюк, я работаю мобильным тестировщиком в компании Циан. В этой статье я расскажу о возможностях управления яблочными симуляторами из командной строки.

simctl — утилита командной строки для взаимодействия с симуляторами. Она очень похожа на ADB для Android, устанавливается вместе со средой разработки Xcode и используется вместе с xcrun (Xcode-раннер командной строки). Двоичный файл программы можно найти по пути:
/Applications/Xcode.app/Contents/Developer/usr/bin/simctl
Работа с контентом устройств [14]
Снятие скриншота и видео с устройства [15]
Добавление медиа на устройство [16]
Открытие URL на устройстве [17]
Управление сертификатами устройства [18]
Установка приложения на устройство [19]
Запуск приложения на устройстве [20]
Предоставление, отзыв и сброс разрешений приложения [21]
Отображение информации о приложении [22]
Отображение пути к контейнерам установленного приложения [23]
Закрытие приложения на устройстве [24]
Удаление приложения с устройства [25]
Симуляция отправки пуш-уведомления [26]
Изменение и очистка статус-бара устройства [27]
Установка темной или светлой темы [28]
Работа с логами и внутренними механизмами устройств [29]
Выполнение указанной операции на устройстве [30]
Включение и отключение подробного логирования на устройстве [31]
Отображение логов с устройства [32]
Сбор диагностической информации и логов [33]
Заключение [34]
Включение и отключение полноэкранного режима окна симулятора [35]
Включение и отключение отображения нажатий на устройстве [36]
Команда simctl без подкоманд выводит в консоль список всех доступных подкоманд (далее будет использоваться термин «команда»).
$ xcrun simctl
Для просмотра подробной информации по команде нужно использовать команду help с названием искомой команды.
$ xcrun simctl help list
Команда list выводит список всех установленных устройств и окружений. Рядом с каждым устройством будет отображен UDID (уникальный идентификатор устройства), который можно прокидывать в некоторые подкоманды simctl.
$ xcrun simctl list
Пример UDID:
4599F586-F482-4E9C-92A7-8AC4EF348BD9
Список можно фильтровать по заголовкам: devices, devicetypes, runtimes, pairs.
$ xcrun simctl list devices
== Devices ==
-- iOS 11.0 --
iPhone 7 (422566D6-AD4C-40E5-AC64-233043A00814) (Shutdown)
-- iOS 13.4 --
iPhone 8 (CB87B315-F01A-41AA-9C85-6FE24E5A66B9) (Shutdown)
Вместе с фильтром по заголовку можно использовать поисковый запрос или параметр available, который выведет список всех доступных пунктов.
$ xcrun simctl list devices available
Примером поискового запроса может служить выборка по устройствам c экраном 12.9 дюймов.
$ xcrun simctl list devicetypes 12.9
== Device Types ==
iPad Pro (12.9-inch) (com.apple.CoreSimulator.SimDeviceType.iPad-Pro)
iPad Pro (12.9-inch) (2nd generation) (com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-)
iPad Pro (12.9-inch) (3rd generation) (com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-)
iPad Pro (12.9-inch) (4th generation) (com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---4th-generation-)
Можно вывести более подробную информацию списка c помощью параметра -v.
$ xcrun simctl list -v devices
== Devices ==
-- iOS 11.0 (15A8401) [/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 11.0.simruntime] --
iPhone 7 (7B68E927-161C-440C-AABE-654CD96E8694) (Shutdown)
-- iOS 13.3 (17C45) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime] --
iPhone 8 (F3909F6E-E227-4BD7-939F-D3D05B1B8AAD) (Shutdown)
Можно вывести информацию в формате JSON с помощью параметра -j или --json.
$ xcrun simctl list -j -v devices
{
"devices" : {
"com.apple.CoreSimulator.SimRuntime.iOS-13-3" : [
{
"dataPath" : "/Users/pavel/Library/Developer/CoreSimulator/Devices/9EA47EEB-F19F-44EE-9854-EA06BEB8FBD1/data",
"logPath" : "/Users/pavel/Library/Logs/CoreSimulator/9EA47EEB-F19F-44EE-9854-EA06BEB8FBD1",
"udid" : "9EA47EEB-F19F-44EE-9854-EA06BEB8FBD1",
"isAvailable" : true,
"deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus",
"state" : "Shutdown",
"name" : "iPhone-7-Plus"
},
{
"dataPath" : "/Users/pavel/Library/Developer/CoreSimulator/Devices/F3909F6E-E227-4BD7-939F-D3D05B1B8AAD/data",
"logPath" : "/Users/pavel/Library/Logs/CoreSimulator/F3909F6E-E227-4BD7-939F-D3D05B1B8AAD",
"udid" : "F3909F6E-E227-4BD7-939F-D3D05B1B8AAD",
"isAvailable" : true,
"deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",
"state" : "Shutdown",
"name" : "iPhone 8"
}
],
...
Для создания нового симулятора используется команда create, после которой указываются имя устройства, его тип и среда (эти данные есть в выводе команды list). После выполнения команды отобразится UDID созданного симулятора.
$ xcrun simctl create iPhone-7-Plus com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus com.apple.CoreSimulator.SimRuntime.iOS-13-4
9EA47EEB-F19F-44EE-9854-EA06BEB8FBD1
Команда boot запускает устройство с указанным UDID, делая его доступным для взаимодействия.
$ xcrun simctl boot CB87B315-F01A-41AA-9C85-6FE24E5A66B9
️После запуска устройства можно передавать команду
bootedвместоUDID. Если запущено несколько устройств, то simctl выберет одно из них.
Чтобы увидеть симулятор в действии нужно запустить приложение «Simulator».
$ open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/
Команда upgrade позволяет повысить версию среды устройства до необходимой.
$ xcrun simctl upgrade 422566D6-AD4C-40E5-AC64-233043A00814 com.apple.CoreSimulator.SimRuntime.iOS-13-4
Команда clone позволяет клонировать существующее устройство, копируя его тип и среду.
$ xcrun simctl clone booted NewPhone
Для сброса симулятора к настройкам по умолчанию используется команда erase. Перед очисткой симулятора его нужно выключить, иначе возникнет ошибка.
$ xcrun simctl erase booted
Если нужно сбросить данные всех симуляторов, то нужно использовать команду erase all.
$ xcrun simctl erase all
Изменить имя устройства можно с помощью команды rename.
$ xcrun simctl rename booted MyiPhone
Команда getenv позволяет выводить значения переменных среды устройства. Например, встроенная переменная симулятора SIMULATOR_SHARED_RESOURCES_DIRECTORY указывает на путь, где хранятся данные симулятора.
$ xcrun simctl getenv booted SIMULATOR_SHARED_RESOURCES_DIRECTORY
/Users/pavel/Library/Developer/CoreSimulator/Devices/F3909F6E-E227-4BD7-939F-D3D05B1B8AAD/data
Команда bootstatus позволяет убедиться в том, что устройство загружено и готово к работе. Имеет три необязательных ключа:
-b — загружает указанный симулятор, если он не загружен.-d — отображает информацию о миграции данных.-c — постоянно отслеживает состояние загрузки и выключения.$ xcrun simctl bootstatus booted
$ xcrun simctl bootstatus booted -c
Когда работа с симулятором закончена, можно выключить его, используя команду shutdown.
$ xcrun simctl shutdown booted
Для выключения всех симуляторов используется команда shutdown all.
$ xcrun simctl shutdown all
В ходе работы с симуляторами может накапливаться большое количество старых устройств, многие из которых могут быть недоступны для последних версий iOS. Для их удаления используется команда delete unavailable.
$ xcrun simctl delete unavailable
Для удаления конкретного симулятора используется команда delete.
$ xcrun simctl delete booted
Для удаления всех устройств используется команда delete all.
$ xcrun simctl delete all
Можно просто использовать шорткат ⌘⇧4, навести курсором на окно симулятора, нажать пробел и сделать скриншот. Но тогда на скриншоте кроме самого экрана будут видны рамки симулятора.

Для снятия скриншота только экрана используется команда io в связке со screenshot. Можно сохранять изображения в формате .png, .tiff, .bmp, .gif и .jpeg.
$ xcrun simctl io booted screenshot ~/Pictures/app-screenshot.png

Аналогично, можно просто использовать шорткат ⌘S в открытом приложении «Simulator», скриншот окна сохранится на рабочем столе.
Также можно использовать команду io в связке с recordVideo для записи видео взаимодействия с экраном симулятора. Можно сохранять видео в формате .mov, .h264, .mp4 и .fmp4.
$ xcrun simctl io booted recordVideo ~/Movies/app-preview.mp4
Для завершения записи нужно нажать ⌃C в окне терминала.
Команда addmedia используется для добавления фото или видео на симулятор.
$ xcrun simctl addmedia booted ~/Pictures/test.png
$ xcrun simctl addmedia booted ~/Pictures/test.gif
$ xcrun simctl addmedia booted ~/Pictures/test.mp4
Также можно просто перетащить файл из Finder в окно симулятора.
Команда openurl открывает указанный URL на симуляторе.
$ xcrun simctl openurl booted "https://www.google.com/"
Также может использоваться кастомная схема, ассоциированная с нативным приложением.
$ xcrun simctl openurl booted maps://
Команда keychain позволяет добавлять сертификаты в доверенное корневое хранилище или keychain, а также сбрасывать keychain.
$ xcrun simctl keychain booted add-root-cert ~/my-selfsigned.cer
$ xcrun simctl keychain booted add-cert ~/my-selfsigned.cer
$ xcrun simctl keychain booted reset
Можно легко установить приложение на симулятор если известен путь к файлу .app. Для этого используется команда install.
$ xcrun simctl install booted ~/Циан.app
Также можно просто перетащить приложение из Finder в окно симулятора.
Перечень opensource-приложений для iOS можно найти тут [37].
Запуск приложения осуществляется с помощью команды launch и указанием bundle ID.
$ xcrun simctl launch booted ru.cian.mobile
Как узнать bundle ID описано тут [38].
Команда privacy может предоставлять, отзывать и сбрасывать разрешения приложения.
$ xcrun simctl privacy <device> <action> <service> <bundle ID>
Значения action (действия) могут быть следующие:
Значения service (службы) могут быть следующие:
Пример использования:
$ xcrun simctl privacy booted grant photos ru.cian.mobile
$ xcrun simctl privacy booted grant location ru.cian.mobile
$ xcrun simctl privacy booted revoke all ru.cian.mobile
На данный момент не все сервисы доступны для настройки. Отсутствуют уведомления, здоровье, Bluetooth и Face ID.
Команда appinfo выводит информацию о приложении.
$ xcrun simctl appinfo booted ru.cian.mobile
Формат отображения информации следующий:
{
ApplicationType = User;
Bundle = <PATH_TO_APP_FILE>;
BundleContainer = <PATH_TO_APP_FILE_FOLDER>;
CFBundleDisplayName = "Циан";
CFBundleExecutable = "Циан";
CFBundleIdentifier = "ru.cian.mobile";
CFBundleName = "Циан";
CFBundleVersion = 1;
DataContainer = <PATH_TO_DATA_FOLDER>;
GroupContainers = {
<GROUP_CONTAINER_NAME> = <PATH_TO_GROUP_CONTAINER_FOLDER>;
};
Path = <PATH_TO_APP_FILE>;
SBAppTags = (
);
}
Можно вывести путь к контейнерам приложения через команду get_app_container с указанием bundle ID. У команды есть несколько опций для указания типа контейнера:
app указывает на расположение самого приложения и используется по умолчанию.$ xcrun simctl get_app_container booted ru.cian.mobile
$ xcrun simctl get_app_container booted ru.cian.mobile app
data указывает на расположение данных приложения.$ xcrun simctl get_app_container booted ru.cian.mobile data
groups указывает на расположение группы приложений. Если групп несколько, то нужно использовать имя искомой группы.$ xcrun simctl get_app_container booted ru.cian.mobile groups
$ xcrun simctl get_app_container booted ru.cian.mobile group.ru.cian.mobile.widget
Закрытие приложения осуществляется с помощью команды terminate и указанием bundle ID.
$ xcrun simctl launch terminate ru.cian.mobile
Можно удалить приложение с симулятора с помощью команды uninstall, используя bundle ID.
$ xcrun simctl uninstall booted ru.cian.mobile
Для отправки пуша нужно подготовить файл, который должен содержать структуру в формате JSON и сохранить его с расширением .apns (Apple Push Notification service):
{
"aps": {
"alert": {
"title": "Tester on Steroids",
"body": "About mobile apps testing"
},
"badge": 3,
"sound": "default"
}
}
Затем нужно дать разрешение на отправку приложению уведомлений. После этого нужно выполнить команду push с указанием устройства, bundle ID и пути до файла .apns.
$ xcrun simctl push booted ru.cian.mobile ~/Documents/mocks/push.apns

Если добавить в файл параметр "Simulator Target Bundle", то необходимость указывать каждый раз bundle ID отпадает.
{
"aps": {
"alert": {
"title": "Tester on Steroids",
"body": "About mobile apps testing"
},
"badge": 3,
"sound": "default"
},
"Simulator Target Bundle": "ru.cian.mobile"
}
$ xcrun simctl push booted ~/Documents/mocks/push.apns
Также, если указан параметр "Simulator Target Bundle", то файл можно просто перетащить в окно симулятора.
У команды status_bar есть три подкоманды:
override принимает параметры для элементов статус-бара и меняет их в зависимости от значений.$ xcrun simctl status_bar booted override --time 10:30 --dataNetwork wifi --wifiMode active --wifiBars 2 --cellularMode active --cellularBars 3 --operatorName @tester_on_steroids --batteryState charging --batteryLevel 75

list выводит значения перезаписанных параметров.$ simctl status_bar booted list
Current Status Bar Overrides:
=============================
Time: 10:30
DataNetworkType: 1
Cell Mode: 3, Cell Bars: 3
Operator Name: @tester_on_steroids
Battery State: 1, Battery Level: 75, Not Charging: 1
clear очищает перезаписанный статуc-бар.$ simctl status_bar booted clear
Данная опция доступна для симуляторов с iOS от 13.0 и выше. C помощью команды ui appearance можно поменять тему устройства на темную или светлую.
$ xcrun simctl ui booted appearance dark
$ xcrun simctl ui booted appearance light
Команда spawn создает указанный процесс на симуляторе.
$ xcrun simctl spawn booted defaults write ru.cian.mobile ResetDatabase -bool YES
Здесь используется интерфейс defaults, в котором флагу ResetDatabase устанавливается значение YES. Это удобный способ менять пользовательские настройки до запуска приложения.
Команда logverbose позволяет включать и отключать подробное логирование на устройстве. Для того, чтобы изменения вступили в силу, нужно перезапустить симулятор.
$ simctl logverbose booted enable
$ simctl logverbose booted disable
В iOS существует пять уровней логов:
Для того, чтобы просмотреть вывод логов с симулятора в командной строке, необходимо выполнить следующую команду:
$ xcrun simctl spawn booted log stream
По умолчанию вывод логов будет включать в себя уровни default, error и fault. Для использования уровней info и debug нужно использовать аргумент --level. --level=info будет отображать уровни по умолчанию, а так же info. --level=debug будет отображать уровни по умолчанию, а так же info и debug.
$ xcrun simctl spawn booted log stream --level=info
$ xcrun simctl spawn booted log stream --level=debug
Также можно фильтровать логи. Например, по конкретному приложению или по типу ивентов и сообщений.
$ xcrun simctl spawn booted log stream --predicate 'processImagePath endswith "Циан"'
$ xcrun simctl spawn booted log stream --predicate 'eventMessage contains "error" and messageType == info'
Чтобы выключить вывод логов нужно нажать ⌃C в окне терминала.
C помощью операции log collect можно сделать дамп журнала логов.
$ xcrun simctl spawn booted log collect
С помощью команды diagnose можно сгенерировать подробный журнал всего, что происходило в сессии приложения «Simulator».
$ xcrun simctl diagnose
Журнал будет включать в себя:
В журнале будет содержаться конфиденциальная информация, поэтому с этими данными нужно быть осторожным.
После генерации журнала будет открыта папка с архивом, содержащим всю информацию.
В заключение хотелось бы поделиться еще парой полезных команд для работы с симуляторами.
Позволяет использовать окно симулятора в полноэкранном режиме macOS. Например, можно открыть отдельный рабочий стол с Xcode и симулятором.
defaults write com.apple.iphonesimulator AllowFullscreenMode 1
defaults write com.apple.iphonesimulator AllowFullscreenMode 0
Отображает тапы на симуляторе. Удобно при записи видео.
defaults write com.apple.iphonesimulator ShowSingleTouches 1
defaults write com.apple.iphonesimulator ShowSingleTouches 0
Автор: Павел Лесюк
Источник [40]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/testirovanie/354045
Ссылки в тексте:
[1] Работа с объектами устройств: #f1
[2] Просмотр списка доступных команд и информации по ним: #s1
[3] Просмотр списка доступных устройств, сред выполнения, устройств и пар устройств: #s2
[4] Создание нового устройства: #s3
[5] Запуск устройства: #s4
[6] Апгрейд устройства: #s5
[7] Клонирование устройства: #s6
[8] Очистка данных и настроек устройства: #s7
[9] Переименование устройства: #s8
[10] Вывод переменных среды устройства: #s9
[11] Проверка состояния загрузки устройства: #s10
[12] Выключение устройства: #s11
[13] Удаление устройств: #s12
[14] Работа с контентом устройств: #f2
[15] Снятие скриншота и видео с устройства: #s13
[16] Добавление медиа на устройство: #s14
[17] Открытие URL на устройстве: #s15
[18] Управление сертификатами устройства: #s16
[19] Установка приложения на устройство: #s17
[20] Запуск приложения на устройстве: #s18
[21] Предоставление, отзыв и сброс разрешений приложения: #s19
[22] Отображение информации о приложении: #s20
[23] Отображение пути к контейнерам установленного приложения: #s21
[24] Закрытие приложения на устройстве: #s22
[25] Удаление приложения с устройства: #s23
[26] Симуляция отправки пуш-уведомления: #s24
[27] Изменение и очистка статус-бара устройства: #s25
[28] Установка темной или светлой темы: #s26
[29] Работа с логами и внутренними механизмами устройств: #f3
[30] Выполнение указанной операции на устройстве: #s27
[31] Включение и отключение подробного логирования на устройстве: #s28
[32] Отображение логов с устройства: #s29
[33] Сбор диагностической информации и логов: #s30
[34] Заключение: #f4
[35] Включение и отключение полноэкранного режима окна симулятора: #s31
[36] Включение и отключение отображения нажатий на устройстве: #s32
[37] тут: https://github.com/dkhamsing/open-source-ios-apps
[38] тут: https://yandex.ru/support/partner2/mobile-apps/app/bundle-id.html
[39] мой блог: https://t.me/tester_on_steroids
[40] Источник: https://habr.com/ru/post/506504/?utm_source=habrahabr&utm_medium=rss&utm_campaign=506504
Нажмите здесь для печати.