← Back
ios-bundles

ios-bundles/CarrierSIM

View on GitHub ↗
Stars
159
Forks
16
Watchers
159
Open issues
10
Contributors
3
Language
Python
License
MIT License
Default branch
master
Created Sep 28, 2026Updated Oct 1, 2026

Star growth

Today—
This week—
This month—

Star history will appear here once this repo has been tracked for a couple of days.

README

CarrierSIM

Скрипт привязывает SIM-карты iPhone по IMSI к системному пакету оператора Vodafone_hu или к любому другому пакету, который есть в iOS телефона. Задуман для включения звонков по Wi-Fi (VoWiFi) в России. Заодно включается кодек EVS и 5G на части диапазонов.

Работает на macOS и Windows. На Linux не работает: там нет нужной библиотеки Apple.

Работает на iPhone 12–18, включая модели mini, Pro, Pro Max, Plus, Air и e, с iOS 18–27, включая iOS 27.0.1 и 27.2 beta 2.

Экспериментальный инструмент. Работа на будущих версиях iOS не гарантируется.

Что нужно

  • Python 3.11 или новее, рекомендуется 3.12. На Windows нужна 64-битная версия.
  • Windows: iTunes x64 с сайта Apple. Версия из Microsoft Store и Apple Devices могут не подойти.
  • macOS: ничего дополнительно ставить не нужно.
  • iPhone, кабель USB и интернет для первого запуска. Потом можно без кабеля, по Wi-Fi (пункт 10).

Как запустить

  1. Распакуйте архив целиком в «Загрузки».
  2. Подключите iPhone кабелем, разблокируйте его и нажмите «Доверять». Закройте Finder и iTunes, если в них идёт синхронизация.
  3. Запустите файл двойным щелчком:
    • macOS: Запуск macOS.command
    • Windows: Запуск Windows.cmd
  4. В меню выберите 1 и дождитесь сообщения «Готово».

При первом запуске скрипт сам скачает нужные библиотеки в папку .venv. Это займёт пару минут.

Без Python: готовая сборка

К релизу прикладываются архивы CarrierSIM-vN-macOS-arm64.zip, CarrierSIM-vN-macOS-x86_64.zip и CarrierSIM-vN-Windows-x64.zip. Python и библиотеки уже внутри. Их собирает GitHub Actions (.github/workflows/standalone.yml) из того же тега, происхождение подтверждено attestation: gh attestation verify CarrierSIM-vN-….zip -R ios-bundles/CarrierSIM.

  1. Распакуйте архив целиком. Рядом с CarrierSIM (CarrierSIM.exe) лежат bundle.yaml, assets.zip и README. runs появится там же.
  2. macOS: сборка не подписана Apple. Один раз снимите карантин со всей папки: xattr -dr com.apple.quarantine ~/Downloads/CarrierSIM (путь укажите свой, куда распаковали), потом запустите CarrierSIM двойным щелчком. Без этого macOS не даст открыть файл или его библиотеки.
  3. Windows: iTunes x64 с сайта Apple нужен так же, как и скрипту. Запустите CarrierSIM.exe.

Меню и флаги те же, что у скрипта: CarrierSIM --status, CarrierSIM --bundle Vodafone_ro --sims 1 и так далее. Сборка для macOS arm64 проверена без телефона (--check, меню). Сборки для Windows и Intel Mac на железе не запускались.

Меню

Пункт Что делает
1 Установить профиль по bundle.yaml (МТС России — Vodafone_ro, остальные — Vodafone_hu)
2 Показать SIM и план установки, ничего не записывая
3 Проверить компьютер и файлы, телефон не нужен
4 Вернуть штатный профиль (выбранной SIM или всем)
5 Восстановить после сбоя
6 Справка по флагам
7 Выбрать другой профиль и SIM (1, 2 или обе): сначала план и паспорт профиля, запись после подтверждения
8 Диагностика связи: IMS, VoLTE/VoWiFi/VoNR, сеть, 5G SA (только чтение журнала)
9 Проверка звонка: канал (Wi-Fi/LTE/5G) и кодек EVS/AMR (только чтение журнала)
10 Переключить связь с iPhone: кабель или Wi-Fi (эксперимент). В режиме Wi-Fi все действия с телефоном идут без кабеля
11 Отчёт о профиле для темы или issue: журнал CommCenter и что вы проверили сами (только чтение)

Какой профиль ставить: bundle.yaml

Файл bundle.yaml рядом со скриптом задаёт пакет для пункта 1:

# Пакет по умолчанию для SIM России (250) и Беларуси (257)
default: Vodafone_hu
# Пакет для конкретного оператора: MCCMNC без пробела (250 01 = МТС RU)
25001: Vodafone_ro

Для каждой SIM сначала ищется строка с её MCCMNC, затем default. Без файла ставится Vodafone_hu. default действует только на SIM операторов России (MCC 250) и Беларуси (MCC 257): зарубежная SIM сохраняет свой профиль, в плане (пункт 2) она помечена «не трогаю». Чтобы сменить профиль зарубежной SIM, добавьте строку с её MCCMNC или выберите её номер в пункте 7 (флаг --sims 1 или 2): явно выбранный слот получает профиль при любом операторе. Имя пакета — как папка в /System/Library/Carrier Bundles/iPhone на телефоне, без .bundle. Пункт 7 и флаг --bundle на время запуска заменяют файл.

Паспорт профиля

Пункты 1, 2 и 7 под планом показывают свойства выбранного пакета из таблицы ios-bundles.github.io: приоритет VoWiFi дома, VoWiFi в роуминге, подпись сети при звонке по Wi-Fi, номер активации iMessage/FaceTime, значок LTE/4G, переключатель VoLTE, 5G, EVS, доп. услуги через IMS (XCAP) и визуальную голосовую почту. Например, у Vodafone_tr номер активации iMessage местный турецкий, 13191: из российской сети он недоступен, и слетевшая активация по номеру может не восстановиться (так пишут в теме на 4pda). У Vodafone_ro VoWiFi в роуминге выключен.

Это содержимое файлов пакета из iOS 27.0 для iPhone 17, не проверка на телефоне: на деле оператор может вести себя иначе. Таблица скачивается раз в неделю в runs/bundles.json. Без интернета паспорт просто не показывается. Если имя пакета отличается от таблицы только регистром (mts_ua вместо MTS_ua), скрипт остановится до записи. Имени, которого нет в таблице, он подскажет похожие и продолжит: в другой iOS пакет может быть.

После установки: включить VoWiFi

  1. «Настройки → Сотовая связь → нужная SIM» → включите «Вызовы по Wi-Fi».
  2. Включите авиарежим, затем включите Wi-Fi.
  3. Дождитесь, когда рядом с названием оператора появится отметка Wi-Fi.
  4. Выключите авиарежим. Дальше VoWiFi должен подключаться сам.

Отчёт о профиле: пункт 11

Какой профиль лучше для какого оператора, решают отзывы, а не таблица свойств пакета. Пункт 11 (флаг --report) собирает их в одном виде:

  1. 90 секунд читает журнал CommCenter, как пункт 8. На это время включите и через 10 секунд выключите авиарежим, Wi-Fi не выключайте.
  2. По каждой SIM спрашивает, что вы проверили руками: звонок по VoWiFi в авиарежиме, включается ли VoWiFi сам, остаётся ли звонок без Wi-Fi в 4G/5G (VoLTE), полосу 5G из *3001#12345#*, iMessage с номера, SMS по Wi-Fi, режим модема, объединение вызовов. Отвечайте «д» (да), «н» (нет) или Enter (не проверял). Вопросы задаются только в терминале: если скрипт запущен без него, вопросы пропускаются, а в отчёте появляется строка «Ручные проверки: не заданы».
  3. Печатает блок между «===== Отчёт» и «===== конец отчёта» и сохраняет его в runs/ДАТА-report/report.txt.

В отчёте модель, iOS, оператор, загруженный профиль с версией, сводка журнала и ваши ответы. Номера, IMSI и ICCID в нём нет. Блок вставьте в тему или в issue по шаблону «Отчёт о профиле». Телефон не меняется.

Частые вопросы после установки

Слетит ли профиль после обновления iOS или перезагрузки? По отзывам в теме на 4pda не слетает: после обновления 27.0 на 27.0.1 и после перезагрузок профиль остаётся. Закроет ли Apple сам способ записи в следующих версиях iOS, неизвестно.

Поменял SIM, и профиль пропал. Профиль привязан к IMSI. Новая SIM, перевыпуск eSIM или перенос номера с eSIM на пластиковую SIM дают новый IMSI, поэтому профиль нужно поставить заново пунктом 1 или 7.

Есть значок 5G, а скорость как в LTE. Значок и переключатель 5G ещё не значат, что телефон в сети 5G. Наберите *3001#12345# и нажмите вызов, откроется Field Test. Полосы с буквой n (n1, n7, n40) относятся к 5G NR, полосы с буквой b к LTE. NSA значит 5G поверх LTE: если рядом видны только b-полосы, телефон работает в LTE. n78 и n79 в России недоступны при любом пакете: разрешённые полосы задаёт подписанный файл GRI в Default.bundle, скрипт его не меняет.

Пропал переключатель VoLTE. У многих пакетов, в том числе Vodafone_hu, Vodafone_ro и Vodafone_tr, переключателя нет, а VoLTE включён всегда. Проверить просто: выключите Wi-Fi и позвоните. Если сеть во время звонка не падает в 3G и интернет работает, VoLTE работает.

VoWiFi включается только в авиарежиме или при слабом сигнале. Когда звонить через Wi-Fi, а когда через сотовую сеть, решают пакет и оператор. У части пакетов в домашней сети приоритет у сотовой связи. Сравнить пакеты по этому признаку можно на ios-bundles.github.io.

В строке оператора «Vodafone TR Wi-Fi» или «4G» вместо «LTE». Название сети при звонке через Wi-Fi и значок задаёт пакет. На связь это не влияет, а поменять их, не меняя пакет, нельзя: пакеты подписаны Apple.

Предлагают «Обновить настройки оператора». В теме один человек нажал «Обновить», и профиль слетел наполовину: 5G пропал. Ставил он версией v3. У другого с Vodafone_tr это предложение приходит каждый день, у третьего с тем же пакетом не приходит ни разу. Проверенных данных пока нет, поэтому обновление лучше не принимать. Если профиль всё же слетел, поставьте его заново пунктом 1 или 7 и опишите случай в issue #16.

МегаФон: SMS через VoWiFi не приходят. Звонки через Wi-Fi при этом работают. По словам нескольких человек в теме, МегаФон не передаёт SMS через VoWiFi вообще, и пакет здесь ничего не изменит. На Билайне SMS через VoWiFi ходят.

Билайн: переключатель «Вызовы по Wi-Fi» есть, а VoWiFi не работает. Сперва проверьте, что услуга подключена на номере. По отзывам в теме Билайн выключает её у SIM, которая стояла в телефоне без официальной поддержки VoWiFi. Помогает одно из двух. Позвонить в поддержку и попросить включить VoWiFi на номере (бывает, что отказывают). Или вставить SIM в Android либо в iPhone 13 и старее, включить там VoWiFi и вернуть SIM в iPhone.

T2 и VoWiFi. На 30.09.2026 у T2 VoWiFi на iPhone в теме ни у кого не заработал со штатной настройкой, хотя пробовали много пакетов; 5G при этом появляется. Один человек завёл его с пакетом Nova_is и подменой адреса ePDG в своём DNS, у двух других так не вышло. Поддержка T2 отвечает, что VoWiFi у них только для Android. То же пишут про операторов на сети T2, например Ростелеком и Т-Мобайл.

Как это работает

Профиль оператора для SIM выбирает процесс CommCenter. Пакеты лежат в двух местах:

  • /System/Library/Carrier Bundles/iPhone/*.bundle — системные пакеты, подписаны Apple, раздел только для чтения;
  • /var/mobile/Library/Carrier Bundles/iPhone — пользовательский каталог: обновления пакетов (IPCC) и симлинки, по которым CommCenter находит пакет для SIM.

Скрипт меняет только пользовательский каталог.

Компьютер общается с iPhone по USB или, в режиме Wi-Fi, по локальной сети через службы, которые телефон открывает после «Доверять». Скрипт использует пять из них:

  • AFC (Apple File Conduit, com.apple.afc) — доступ к файлам телефона, но только внутри /var/mobile/Media. Этой службой пользуются приложения для импорта фото и файловые менеджеры для iPhone. К /var/mobile/Library и /System она доступа не даёт.
  • installation_proxy — установка приложений и пакетов оператора IPCC.
  • syslog_relay — системный журнал телефона, из него читаются сообщения CommCenter.
  • streaming_zip_conduit — загрузка ZIP-архива с распаковкой в /var/mobile/Media.
  • AirTraffic (com.apple.atc) — синхронизация медиатеки iTunes/Finder.

Первые четыре скрипт вызывает через библиотеку pymobiledevice3, AirTraffic — через библиотеку Apple (см. ниже).

Шаги:

  1. Триггер. Через installation_proxy ставит подписанный IPCC другого оператора (AVEA_tr, Swisscom_ch или O2_Germany — тот, что не совпадает с вашими SIM). Установка IPCC заставляет CommCenter заново выбрать пакеты. Если каталога на телефоне ещё нет, она его создаёт. Пакет триггера остаётся в каталоге, но к вашим SIM не относится.
  2. Копия. Забирает каталог в /var/mobile/Media, читает его по AFC и сохраняет в runs/…/original.zip.
  3. Запись. Добавляет в корень каталога симлинки с именем из 15 цифр IMSI каждой выбранной SIM на /System/Library/Carrier Bundles/iPhone/Vodafone_hu.bundle (или на пакет, выбранный в пункте 7). Остальное содержимое каталога не меняется.
  4. Проверка. Читает записанный каталог обратно и сравнивает с планом. Затем снова ставит триггер и по журналу CommCenter (Resolved path, Verification Result) проверяет, какой пакет выбран для каждой SIM и принята ли его подпись. Если в пункте 7 выбранный пакет не выбран ни для одной SIM (такого пакета нет в этой iOS), каталог возвращается из копии.

Каталог лежит вне /var/mobile/Media, поэтому через AFC записать его нельзя. Перенос сделан по методу AirLift: архив с деревом каталога загружается в Media через streaming_zip_conduit, а затем служба синхронизации AirTraffic (протокол iTunes) в ходе поддельной синхронизации книг перемещает его на место по относительному пути. Служебные файлы, которые AirTraffic оставляет в /var/mobile/Media/Books, скрипт удаляет, а исходное состояние Books сверяет с копией. Протокол AirTraffic реализован закрытой библиотекой Apple AirTrafficHost: на macOS она входит в систему, на Windows ставится с iTunes. Под Linux её нет, поэтому там скрипт не работает.

Пункт 4 удаляет из корня каталога все симлинки с именем из 15 цифр. Остальное содержимое каталога, включая симлинки по MCCMNC и пакеты IPCC, не трогается.

Если что-то пошло не так

  • «Прошлая операция не завершилась». Выберите пункт 5, затем повторите нужный пункт.
  • Вернуть штатный выбор пакетов. Пункт 4 удаляет IMSI-симлинки, добавленные скриптом.
  • «Журнал iPhone оборвался» в пунктах 8 и 9. При включении авиарежима iPhone может закрыть поток журнала. Скрипт переподключается и дочитывает до конца отведённого времени, а в конце пишет, сколько было переподключений. Если журнал не возвращается больше 20 секунд (по Wi-Fi авиарежим может оборвать всю связь), отчёт собирается по тому, что пришло до обрыва; если журнала не было совсем (например, выдернут кабель), сбор останавливается с ошибкой.
  • «Выбор не подтверждён» (код выхода 3). По каждой SIM скрипт пишет, что выбрала iOS: «iOS выбрала X вместо Y» (если iOS выбрала другой пакет, скрипт сам возвращает прежние настройки), «подпись не принята» или «нет выбора пакета для этой SIM». Если iOS в журнале выбирала пакеты, но не этот, скрипт возвращает прежние настройки. Если журнал пересканирования пустой, каталог остаётся записанным: включите авиарежим на 15 секунд и посмотрите пунктом 2 строку «сейчас».
  • Папка runs хранит копии каталога и журналы операций. Пока установка идёт, не удаляйте её. Переносить её в новую версию не нужно: остатки прошлых запусков скрипт убирает с телефона сам. Не публикуйте её: в журналах есть идентификаторы SIM и телефона. Стандартная runs уже исключена в .gitignore. Если указываете свою папку через --runs внутри клона репозитория, исключите её сами, лучше в .git/info/exclude: например, для --runs wifi-runs добавьте строку /wifi-runs/. Скрипт правила git не меняет.
  • Версия CarrierSIM указана в меню, начале session.log, environment.json и блоке диагностики. Суффикс -dev означает версию в разработке. «Сборка скрипта» — первые 12 символов SHA256 файла carrier.py, позволяющие различать изменения внутри одной версии. Без подключения телефона версию можно посмотреть командой python carrier.py --version.

macOS пишет «Запуск macOS.command повреждено… Переместите в Корзину». Файл не повреждён: macOS так блокирует неподписанные файлы, скачанные из интернета или Telegram.

  1. Нажмите «Отменить».
  2. Откройте «Терминал», напечатайте bash с пробелом в конце, перетащите в окно файл Запуск macOS.command и нажмите Enter.

Можно один раз снять метку карантина с папки, и дальше двойной щелчок будет работать:

/usr/bin/xattr -r -s -d com.apple.quarantine "$HOME/Downloads/CarrierSIM"

Windows не видит iPhone. В «Проводнике» телефон есть (как Apple iPhone, видны фото), а iTunes и скрипт его не находят. Значит, не установлен драйвер Apple Mobile Device USB. Переустановка iTunes не всегда помогает. Скачайте драйвер «Apple Mobile Device USB Driver» из Microsoft Update Catalog, распакуйте .cab и в командной строке от администратора выполните pnputil /add-driver usbaapl64.inf /install из папки с распакованными файлами. Затем перезагрузите компьютер.

«Grappa session could not be established». Скрипт пишет «iPhone не принял компоненты Apple на этом компьютере» (версии до этой — «Сбой AirTraffic: Синхронизация закончилась преждевременно»), в журнале iPhone эта строка. Встречалось на Windows. Значит, iPhone не принял установленные компоненты Apple, и повтор не поможет. Удалите iTunes (и версию из Microsoft Store, если есть), установите iTunes x64 с сайта Apple, запустите его один раз и повторите. Ставьте полный установщик iTunes, а не только AppleMobileDeviceSupport64.msi из него. В одном случае помогла только версия 12.11.0.26, и перед первым запуском пришлось удалить старую медиатеку iTunes (иначе iTunes выдавал ошибку).

«iPhone запрещает установку (InstallProhibited)». В «Экранном времени» запрещена установка приложений: «Настройки → Экранное время → Ограничения контента и конфиденциальности → Покупки в iTunes Store и App Store → Установка приложений» — поставьте «Да» на время установки. То же бывает у телефонов с профилем управления (MDM).

«iPhone запрещает изменить Books/Books.plist, а в нём остались записи скрипта». Сохраните папку runs с резервными копиями. В одном случае помогла такая последовательность:

  1. Отключите iPhone от компьютера.
  2. Закройте все приложения на iPhone, смахнув их в переключателе приложений.
  3. Принудительно перезагрузите iPhone: быстро нажмите и отпустите кнопку увеличения громкости, затем кнопку уменьшения громкости, после этого удерживайте боковую кнопку до логотипа Apple (инструкция Apple).
  4. После загрузки разблокируйте iPhone и подключите его к компьютеру.
  5. В той же папке CarrierSIM повторите пункт 5 меню (--recover). Если ошибка повторится, отправьте автору текст ошибки и журнал сеанса.

«Служебные файлы Books постоянно меняются». Закройте приложение «Книги» на iPhone, дождитесь окончания загрузки книг и повторите.

«Скрипт не может работать из этой папки». Скопируйте папку CarrierSIM в «Загрузки» и запустите оттуда.

Без кабеля: Wi-Fi (экспериментально)

Пункт 10 в меню или флаг --wifi. Те же службы идут через usbmuxd по сети, как синхронизация Finder по Wi-Fi. Полный цикл установки по Wi-Fi проверен на iPhone 16 Pro Max / iOS 27.0.1: работает, но медленнее, чем по кабелю. Если шаг AirTraffic по Wi-Fi не подключается («AirTraffic не ответил по Wi-Fi за 170 с»), а по кабелю проходит сразу, на macOS проверьте разрешение «Локальная сеть» для терминала («Системные настройки → Конфиденциальность и безопасность → Локальная сеть»): AirTraffic соединяется с iPhone напрямую, и без разрешения macOS молча режет соединение. В tmux, screen и SSH разрешения нет, запускайте Запуск macOS.command (в готовой сборке — CarrierSIM) из Finder или обычное окно терминала. В этом случае скрипт один раз откатывает телефон и не повторяет попытки по Wi-Fi. Дальше подключите кабель, пункт 10 → «кабель» и повторите. Если откат по Wi-Fi не прошёл (сообщение «Автовосстановление не завершено»), сначала выполните пункт 5 по кабелю.

Доверие по Wi-Fi не выдаётся: без готовой пары скрипт остановится и попросит кабель. Сеть должна пропускать Bonjour: гостевые сети и изоляция клиентов на роутере не подойдут.

На macOS терминалу нужно разрешение «Локальная сеть» («Системные настройки → Конфиденциальность и безопасность → Локальная сеть»). Статус и чтение идут через системную службу usbmuxd и работают без него, а шаг AirTraffic соединяется с iPhone напрямую, и без разрешения macOS его молча режет. Скрипт проверяет это перед установкой. При первом запуске macOS может показать окно «Локальная сеть»: нажмите «Разрешить», скрипт ждёт ответа до 20 с. Нет разрешения — останавливается с подсказкой. Откат (пункт 5) проверяет только перед возвратом каталога операторов: если осталось вернуть одни Книги, разрешение не нужно. Из tmux, screen и SSH macOS разрешения не спрашивает и доступ запрещает: запускайте Запуск macOS.command (в готовой сборке — CarrierSIM) из Finder или обычное окно терминала.

Как проверить

Подготовка (с кабелем, один раз)

  1. Подключите iPhone кабелем, разблокируйте, нажмите «Доверять».
  2. Запустите меню, пункт 2. SIM должны показаться: доверие есть.
  3. Откройте Finder → iPhone в боковой панели → вкладка «Основные» → включите «Показывать этот iPhone, если он подключён к Wi-Fi» → «Применить». На Windows то же в iTunes, «Обзор» → «Параметры».
  4. Закройте Finder/iTunes и отключите кабель.

Проверка связи (ничего не пишет)

  1. iPhone и компьютер в одной сети Wi-Fi (не гостевой, без изоляции клиентов). iPhone разблокирован, экран не гаснет.
  2. Меню: 10 (должно стать «Wi-Fi»), затем 2.
  3. Появились SIM и план — связь по Wi-Fi работает. «iPhone не виден по Wi-Fi» — не включена галка из шага 3, телефон спит или сеть режет Bonjour. «Нет доверия» — повторите шаги 1–2.

Установка

  1. Кабель держите под рукой. Меню: 10 → Wi-Fi, затем 1.
  2. Установка идёт дольше, чем по кабелю, — это нормально. Если сеть нестабильна и выпадает «Сбой AirTraffic», подключите кабель и повторите в режиме «кабель».
  3. При сбое скрипт сам откатывает телефон, тоже по Wi-Fi. Если телефон уснул или пропал из сети посреди записи, этап прерывается через 5 минут, дальше откат. Не откатил — подключите кабель, 10 → кабель, 5.
  4. «Готово» — проверьте VoWiFi по разделу «После установки».

Журналы каждого запуска лежат в runs, host.jsonl — ответы AirTraffic. Их и прикладывайте к отчёту.

Для продвинутых

python3 carrier.py --status                          # SIM и план, без записи
python3 carrier.py --wifi --status                   # то же по Wi-Fi
python3 carrier.py                                   # Vodafone HU на все SIM
python3 carrier.py --bundle O2_Germany --sims 1      # другой профиль, только SIM 1
python3 carrier.py --restore                         # вернуть штатные профили
python3 carrier.py --restore --sims 2               # только для SIM 2
python3 carrier.py --help                            # все флаги

На Windows вместо python3 пишите py. Подробное техническое описание есть в README.txt.


Лицензия

Собственный код CarrierSIM распространяется под MIT. Copyright © 2026 Vladimir B / vlw и участники проекта. При распространении копий или существенных частей кода сохраняйте авторское уведомление и текст лицензии.

Сторонний код сохраняет свои лицензии. Лицензия CarrierSIM не распространяется на файлы Apple, включая IPCC-триггеры в assets.zip, системные пакеты операторов и библиотеки Apple: права на них принадлежат соответствующим правообладателям.

Протокол переноса основан на AirLift (MIT, лицензия в LICENSE-AirLift.txt).

Автоматические проверки

Workflow Tests запускается на коммитах в ветках и в pull request. Матрица проверяет Python 3.11–3.14 на Windows, Linux, macOS 15 и 26 (Apple Silicon и Intel) и macOS 27 (Apple Silicon, образ GitHub xcode-27 в режиме public preview): установку зависимостей через тот же код, что использует запускатель, импорты сервисов, компиляцию исходников и регрессионные тесты. Это 28 сочетаний Python и ОС. Фактические версии ОС и Python и архитектура выводятся в журнал задания. Общий статус Python compatibility успешен только после прохождения всей матрицы; его можно назначить обязательной проверкой в правилах ветки.

Тесты проверяют архивы и резервные копии, конфигурацию профилей, выбор и восстановление SIM, обработку ошибок, служебные файлы Books и логи. Они используют временные файлы и имитацию границ подключения, не подключаются к телефону и не заменяют проверку на реальном iPhone.

Локальный запуск без установки зависимостей и подключения телефона:

python -m unittest discover -s tests -v