Скрипт привязывает 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).
- Распакуйте архив целиком в «Загрузки».
- Подключите iPhone кабелем, разблокируйте его и нажмите «Доверять». Закройте Finder и iTunes, если в них идёт синхронизация.
- Запустите файл двойным щелчком:
- macOS:
Запуск macOS.command - Windows:
Запуск Windows.cmd
- macOS:
- В меню выберите 1 и дождитесь сообщения «Готово».
При первом запуске скрипт сам скачает нужные библиотеки в папку .venv. Это займёт пару минут.
| Пункт | Что делает |
|---|---|
| 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 все действия с телефоном идут без кабеля |
Файл bundle.yaml рядом со скриптом задаёт пакет для пункта 1:
# Пакет по умолчанию для всех операторов
default: Vodafone_hu
# Пакет для конкретного оператора: MCCMNC без пробела (250 01 = МТС RU)
25001: Vodafone_roДля каждой SIM сначала ищется строка с её MCCMNC, затем default. Без файла ставится Vodafone_hu. Имя пакета — как папка в /System/Library/Carrier Bundles/iPhone на телефоне, без .bundle. Пункт 7 и флаг --bundle на время запуска заменяют файл.
- «Настройки → Сотовая связь → нужная SIM» → включите «Вызовы по Wi-Fi».
- Включите авиарежим, затем включите Wi-Fi.
- Дождитесь, когда рядом с названием оператора появится отметка Wi-Fi.
- Выключите авиарежим. Дальше VoWiFi должен подключаться сам.
Профиль оператора для 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 (см. ниже).
Шаги:
- Триггер. Через
installation_proxyставит подписанный IPCC другого оператора (AVEA_tr,Swisscom_chилиO2_Germany— тот, что не совпадает с вашими SIM). Установка IPCC заставляет CommCenter заново выбрать пакеты. Если каталога на телефоне ещё нет, она его создаёт. Пакет триггера остаётся в каталоге, но к вашим SIM не относится. - Копия. Забирает каталог в
/var/mobile/Media, читает его по AFC и сохраняет вruns/…/original.zip. - Запись. Добавляет в корень каталога симлинки с именем из 15 цифр IMSI каждой выбранной SIM на
/System/Library/Carrier Bundles/iPhone/Vodafone_hu.bundle(или на пакет, выбранный в пункте 7). Остальное содержимое каталога не меняется. - Проверка. Читает записанный каталог обратно и сравнивает с планом. Затем снова ставит триггер и по журналу 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-симлинки, добавленные скриптом.
- Папка
runsхранит копии каталога и журналы операций. Пока установка идёт, не удаляйте её. Переносить её в новую версию не нужно: остатки прошлых запусков скрипт убирает с телефона сам. Не публикуйте её: в журналах есть идентификаторы SIM и телефона. - Версия CarrierSIM указана в меню, начале
session.log,environment.jsonи блоке диагностики. Суффикс-devозначает версию в разработке. «Сборка скрипта» — первые 12 символов SHA256 файлаcarrier.py, позволяющие различать изменения внутри одной версии. Без подключения телефона версию можно посмотреть командойpython carrier.py --version.
macOS пишет «Запуск macOS.command повреждено… Переместите в Корзину». Файл не повреждён: macOS так блокирует неподписанные файлы, скачанные из интернета или Telegram.
- Нажмите «Отменить».
- Откройте «Терминал», напечатайте
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 из папки с распакованными файлами. Затем перезагрузите компьютер.
«iPhone запрещает установку (InstallProhibited)». В «Экранном времени» запрещена установка приложений: «Настройки → Экранное время → Ограничения контента и конфиденциальности → Покупки в iTunes Store и App Store → Установка приложений» — поставьте «Да» на время установки. То же бывает у телефонов с профилем управления (MDM).
«iPhone запрещает изменить Books/Books.plist, а в нём остались записи скрипта». Сохраните папку runs с резервными копиями. В одном случае помогла такая последовательность:
- Отключите iPhone от компьютера.
- Закройте все приложения на iPhone, смахнув их в переключателе приложений.
- Принудительно перезагрузите iPhone: быстро нажмите и отпустите кнопку увеличения громкости, затем кнопку уменьшения громкости, после этого удерживайте боковую кнопку до логотипа Apple (инструкция Apple).
- После загрузки разблокируйте iPhone и подключите его к компьютеру.
- В той же папке CarrierSIM повторите пункт 5 меню (
--recover). Если ошибка повторится, отправьте автору текст ошибки и журнал сеанса.
«Служебные файлы Books постоянно меняются». Закройте приложение «Книги» на iPhone, дождитесь окончания загрузки книг и повторите.
«Скрипт не может работать из этой папки». Скопируйте папку CarrierSIM в «Загрузки» и запустите оттуда.
Пункт 10 в меню или флаг --wifi. Те же службы идут через usbmuxd по сети, как синхронизация Finder по Wi-Fi. Полный цикл установки по Wi-Fi проверен на iPhone 16 Pro Max / iOS 27.0.1: работает, но медленнее, чем по кабелю.
Доверие по Wi-Fi не выдаётся: без готовой пары скрипт остановится и попросит кабель. Сеть должна пропускать Bonjour: гостевые сети и изоляция клиентов на роутере не подойдут.
Подготовка (с кабелем, один раз)
- Подключите iPhone кабелем, разблокируйте, нажмите «Доверять».
- Запустите меню, пункт 2. SIM должны показаться: доверие есть.
- Откройте Finder → iPhone в боковой панели → вкладка «Основные» → включите «Показывать этот iPhone, если он подключён к Wi-Fi» → «Применить». На Windows то же в iTunes, «Обзор» → «Параметры».
- Закройте Finder/iTunes и отключите кабель.
Проверка связи (ничего не пишет)
- iPhone и компьютер в одной сети Wi-Fi (не гостевой, без изоляции клиентов). iPhone разблокирован, экран не гаснет.
- Меню: 10 (должно стать «Wi-Fi»), затем 2.
- Появились SIM и план — связь по Wi-Fi работает. «iPhone не виден по Wi-Fi» — не включена галка из шага 3, телефон спит или сеть режет Bonjour. «Нет доверия» — повторите шаги 1–2.
Установка
- Кабель держите под рукой. Меню: 10 → Wi-Fi, затем 1.
- Установка идёт дольше, чем по кабелю, — это нормально. Если сеть нестабильна и выпадает «Сбой AirTraffic», подключите кабель и повторите в режиме «кабель».
- При сбое скрипт сам откатывает телефон, тоже по Wi-Fi. Если телефон уснул или пропал из сети посреди записи, этап прерывается через 5 минут, дальше откат. Не откатил — подключите кабель, 10 → кабель, 5.
- «Готово» — проверьте 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.
Протокол переноса основан на 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