Как собрать iOS-приложение без Mac
Соберите и выпустите приложение для iOS без Mac с Expo EAS, арендованным облачным Mac или CI. Сравните стоимость, подпись и тестирование на iPhone.
Писать, собирать, подписывать и публиковать iOS-приложение можно и без собственного Mac, но любой рабочий способ использует чужую macOS: серверы сборки Expo, арендованный Mac или CI-раннер.
Если вы работаете на Windows или Linux, у вас, скорее всего, уже есть рабочее приложение на React Native или Capacitor, iPhone на столе и руководство Getting Started, которое предлагает открыть Xcode. Но на вашу машину Xcode не устанавливается.
В этой статье разобраны легальные способы обойти это ограничение, их стоимость и тестирование готового приложения. Собрать приложение в облаке несложно. Тестировать без Mac гораздо труднее.
Главное
- Xcode,
codesignи iOS Simulator работают только на macOS, поэтому при любом способе без Mac сборка выполняется на чужом Mac. - В проектах на Expo и React Native команда
eas build --platform iosкомпилирует и подписывает приложение на серверах Expo, аeas submit --platform iosзагружает его в App Store Connect с Windows или Linux. - Apple Developer Program стоит $99 в год при любом способе, потому что подпись для App Store и распространение через TestFlight требуют членства в программе.
- iOS Simulator — это приложение для macOS, поэтому без собственного Mac тестировать приходится на физическом iPhone с помощью внутренней сборки EAS или TestFlight.
- Установка macOS на оборудование не от Apple, будь то хакинтош или виртуальная машина, нарушает условия лицензии Apple.
Почему инструментам сборки Apple нужна macOS?
Xcode, xcodebuild, утилита codesign и iOS Simulator работают только на macOS. Поэтому вопрос не в том, можно ли обойтись без Mac, а в том, чей Mac выполнит работу. Компиляция нативного iOS-кода, подпись бинарника дистрибутивным сертификатом и упаковка для App Store Connect происходят внутри инструментария Apple. Каждый из описанных ниже способов обходит это ограничение, но ни один не снимает его.
Сборка iOS-приложения без Mac с помощью Expo EAS
В проекте на React Native или Expo команда eas build --platform ios компилирует и подписывает приложение на серверах Expo. Если войти с учётной записью Apple Developer Program, EAS CLI может сам сгенерировать дистрибутивный сертификат и профиль подготовки (provisioning profile). Большинству читателей этой статьи подойдёт именно этот способ.
Если вы только знакомитесь с Expo, начните со статьи Getting Started with Expo. Полная последовательность действий из руководства Expo по настройке сборки выглядит так:
# Create a project if you don't have one
npx create-expo-app@latest my-app
cd my-app
# Install the EAS CLI and sign in to your Expo account
npm install --global eas-cli
eas login
eas whoami # confirms which account you're signed in as
# Generate the build configuration for the project
eas build:configure
# Build a signed iOS binary on Expo's servers
eas build --platform ios --message "First App Store build"
# Check build status and logs later
eas build:list
Если не хотите устанавливать пакет глобально, используйте npx eas-cli@latest везде, где в документации указано eas. При запуске сборки CLI спросит, взять ли на себя управление учётными данными iOS. Если согласиться и войти в учётную запись Apple, открывать «Связку ключей» (Keychain Access) или портал сертификатов не придётся вообще.
EAS Build работает «из коробки» с приложениями на Expo и React Native, в том числе созданными через react-native или ignite-cli. По словам Expo, сервис подходит и для других нативных проектов. Официального руководства EAS для Capacitor нет, поэтому команды на Capacitor обычно выбирают один из описанных ниже способов.
Для публикации нужна ещё одна команда:
eas submit --platform ios
EAS Submit работает на Windows, Linux и macOS. Команда отправляет сборку в App Store Connect, и после того как Apple обработает загрузку, сборка появится в TestFlight. Для этого шага нужна платная учётная запись Apple Developer. Авторизоваться можно с помощью API-ключа App Store Connect или Apple ID с паролем для приложения (app-specific password).
Аренда облачного Mac, когда нужен Xcode
Арендованный облачный Mac даёт полноценный рабочий стол macOS через удалённое подключение. Он нужен, когда требуется сам Xcode: для работы с нативными модулями, отладки на уровне Xcode или для проекта на Capacitor, у которого нет управляемого конвейера сборки. Такие машины сдают в аренду, например, MacStadium и MacinCloud. Вы получаете полный контроль, но и администрирование ложится на вас: установка и обновление Xcode, управление сертификатами и профилями, написание собственных скриптов сборки.
CI с раннерами на macOS
Облачный CI с раннерами на macOS подходит командам, у которых сборка уже автоматизирована скриптами. GitHub Actions предлагает облачные раннеры на macOS наряду с раннерами на Linux и Windows; аналогичные macOS-машины есть и у других CI-провайдеров. Раннер выполняет сборку, но подпись остаётся вашей задачей: сертификаты и профили нужно хранить в секретах и самостоятельно подключать к конвейеру. Если вы используете Expo, можно также запускать сборки EAS из CI и сохранить управляемую подпись Expo.
Чего делать не стоит: хакинтош и виртуальные машины с macOS
Запуск macOS на оборудовании не от Apple — как хакинтоша или в виртуальной машине на ПК с Windows или Linux — нарушает условия лицензии Apple. Лицензионное соглашение macOS Tahoe запрещает устанавливать и запускать macOS на любом компьютере, не произведённом Apple. Виртуальные машины с macOS разрешены только на Mac, который уже работает под macOS. Откажитесь от обоих вариантов.
Как тестировать iOS-приложение без Mac?
Без собственного Mac iOS-приложение тестируют на физическом iPhone — через development- или внутреннюю сборку EAS либо через TestFlight, — потому что iOS Simulator является приложением для macOS. Сборку можно полностью перенести в облако. А вот на тестировании отсутствие Mac действительно даёт о себе знать.
Для повседневной работы добавьте development client и собирайте приложение для внутреннего распространения:
npx expo install expo-dev-client
При внутреннем распространении EAS использует ad hoc-профиль. В профиле перечислены UDID (уникальные идентификаторы устройств) разрешённых устройств, и установить сборку можно только на устройство, которое было в этом списке на момент её создания. Зарегистрировать iPhone можно командой:
eas device:create
После регистрации устройства создайте новую сборку: сборки, сделанные до регистрации, на него не установятся. Такие сборки для устройств подписываются дистрибутивным сертификатом и ad hoc-профилем, и для того и другого требуется платная учётная запись Apple Developer Program.
Для более широкого тестирования TestFlight позволяет подключить до 10 000 внешних тестировщиков для каждого приложения. Пригласить их можно по электронной почте или по публичной ссылке, но сначала сборка должна пройти проверку TestFlight App Review.
Один пробел остаётся: нативная отладка в Xcode и iOS Simulator по-прежнему требуют macOS. Когда дойдёте до этого этапа, арендуйте облачный Mac на время работы.
Сколько это стоит и какой способ выбрать?
Apple Developer Program стоит $99 в год, причём во многих регионах Apple выставляет счёт в местной валюте. Этот взнос обязателен при любом способе без Mac, потому что подпись для App Store и распространение через TestFlight требуют членства в программе независимо от того, где выполняется сборка.
| Способ | Кто предоставляет macOS | Чем управляете вы | Дополнительные расходы |
|---|---|---|---|
| Expo EAS | Expo | Конфигурация приложения | Есть бесплатный тариф; см. цены EAS |
| Облачный Mac | Арендодатель | Xcode, сертификаты, скрипты | Зависит от провайдера |
| CI-раннер на macOS | CI-провайдер | Конвейер, секреты для подписи | Зависит от провайдера |
Бесплатный тариф EAS включает небольшой ежемесячный лимит iOS-сборок в более медленной очереди. Платные тарифы переводят в быструю очередь, допускают более длительные сборки и позволяют за дополнительную плату запускать больше сборок параллельно.
В типичном случае — приложение на React Native или Expo, которое собирают на Windows или Linux, — используйте Expo и физический iPhone. Оплатите членство за $99, собирайте и подписывайте приложение через EAS, тестируйте с помощью внутренних сборок и TestFlight, а Mac арендуйте только тогда, когда нужен сам Xcode.
Отсутствие собственного Mac означает, что вы арендуете инструментарий Apple вместо покупки оборудования. Сборка и публикация удалённо работают без проблем. Чем приходится жертвовать, так это симулятором и нативной отладкой. Следующий шаг: вступите в Apple Developer Program, выполните eas build:configure в своём проекте и зарегистрируйте iPhone командой eas device:create перед первой внутренней сборкой.
Часто задаваемые вопросы
Можно ли запустить приложение на iPhone без Mac и платной учётной записи Apple?
Да, для прототипирования — через Expo Go. Установите Expo Go из App Store, запустите проект Expo на Windows или Linux и отсканируйте QR-код камерой iPhone. Версия Expo SDK в проекте должна совпадать с версией Expo Go в App Store. Expo Go поставляется с фиксированным набором нативных библиотек, поэтому библиотеки с другим нативным кодом в нём не работают. Для удалённых push-уведомлений, универсальных ссылок, собственного названия и иконки приложения нужна development-сборка, а для её установки на iPhone без Mac требуется платная программа.
На сколько iPhone можно установить внутреннюю сборку EAS?
До 100 iPhone за год членства. Ad hoc-сборки устанавливаются только на устройства, зарегистрированные в вашей учётной записи Apple Developer, причём Apple считает каждое семейство устройств отдельно, так что можно зарегистрировать и 100 iPhone, и 100 iPad. Отключение устройства не освобождает его слот. Удалить устройства и восстановить лимит до 100 можно только в начале нового года членства. Для больших групп используйте TestFlight, где регистрация устройств не нужна.
Нужна ли новая iOS-сборка после каждого изменения кода?
Нет. EAS Update доставляет изменения JavaScript, стилей и изображений по воздуху (OTA) в сборки, содержащие библиотеку expo-updates, и пользователи получают новую версию при следующем запуске приложения. Нативные изменения, например добавление библиотеки с кодом на Swift или Objective-C, по-прежнему требуют новой сборки EAS, а для приложений в магазине — новой отправки в App Store. Сборка, в которую впервые добавляется expo-updates, сама должна быть новой.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.
Star on GitHub12k