Кнопка Distribute App в окне Organizer неактивна, а при попытке экспорта через меню Product → Archive Xcode выдаёт сообщение о невозможности создать IPA-файл — типичный признак проблемы с подписью кода или конфигурацией проекта. Экспорт IPA недоступен не из-за сбоя самого Xcode, а потому что среда не может подтвердить право подписать сборку: не найден действующий сертификат, профиль обеспечения (provisioning profile) не совпадает с bundle ID либо архив собран без нужных параметров.
Проблема встречается и у разработчиков с платным аккаунтом Apple Developer Program, и у тех, кто собирает приложение с бесплатной учётной записью для установки на своё устройство. Ниже разберём, как проверить каждое звено цепочки подписи и вернуть возможность экспорта, не прибегая к рискованным действиям вроде ручной правки файлов проекта.
Как устроен экспорт IPA и где цепочка рвётся
Чтобы получить файл .ipa, Xcode выполняет три этапа: компиляцию, архивацию (создание .xcarchive) и экспорт с переподписью. Недоступность экспорта почти всегда означает, что сбой произошёл на втором или третьем этапе: архив либо не распознан как приложение iOS, либо не может быть подписан выбранным способом распространения.
Важно понимать: сам архив при этом часто существует и отображается в Organizer (Window → Organizer). Проблема касается именно шага Distribute, где Xcode проверяет сертификаты, профили и соответствие требованиям выбранного метода дистрибуции — App Store Connect, Ad Hoc, Enterprise или Development.
- 🔐 Сертификат подписи — отсутствует, отозван или истёк срок действия в Связке ключей.
- 📄 Provisioning profile — не покрывает bundle ID приложения или не включает нужные устройства.
- ⚙️ Схема сборки — архив создан для симулятора или с конфигурацией Debug без настроек подписи.
- 👤 Учётная запись Apple ID — не добавлена в Xcode или истёк срок сессии авторизации.
Проверка учётной записи разработчика в Xcode
Первым делом откройте настройки среды: Xcode → Settings → Accounts. Убедитесь, что ваш Apple ID присутствует в списке и рядом с ним нет предупреждений о необходимости повторного входа. Если сессия истекла, Xcode не сможет запросить у серверов Apple актуальные сертификаты и профили, и экспорт будет заблокирован.
Выберите свою команду (Team) и нажмите Manage Certificates. Здесь видно, какие сертификаты подписи существуют локально. Если список пуст или нужный сертификат отмечен как недействительный, создайте новый через кнопку «+» — для экспорта сборок под App Store или Ad Hoc нужен сертификат типа Apple Distribution, для тестовой установки на устройства — Apple Development.
⚠️ Внимание: отзыв сертификата Apple Distribution делает невозможной подпись новых сборок всеми, кто им пользовался. В командной разработке согласуйте отзыв с коллегами, прежде чем пересоздавать сертификат.
Настройки подписи в самом проекте
Откройте настройки таргета: вкладка Signing & Capabilities. Самый надёжный вариант для большинства случаев — включить Automatically manage signing и выбрать свою команду в выпадающем списке Team. Тогда Xcode сам создаст и обновит профиль обеспечения, а вероятность несовпадения bundle ID и профиля исчезает.
Если автоматическое управление отключено (это часто встречается в проектах с CI/CD), проверьте вручную: профиль, указанный для конфигурации Release, должен быть актуальным, содержать правильный App ID и не быть просроченным. Устаревший профиль — одна из самых частых причин, почему экспорт IPA недоступен именно на шаге Distribute.
☑️ Проверка подписи перед архивацией
Почему архив может не подходить для экспорта
Не каждый архив в Organizer можно превратить в IPA. Если кнопка Distribute App неактивна для конкретного архива, проверьте, как он был собран. Архив, созданный при выбранной цели-симуляторе, не является архивом приложения для устройства — в Organizer он либо не появится вовсе, либо будет помечен иначе, и экспорт для него недоступен.
Перед архивацией убедитесь, что в панели выбора цели стоит Any iOS Device или подключённое физическое устройство, а не симулятор. Затем выполните Product → Archive. Также проверьте схему сборки: Product → Scheme → Edit Scheme → Archive — конфигурация должна быть Release (или иная, для которой настроена подпись).
Ещё одна возможная причина — в проекте задан параметр Skip Install в значении NO для вспомогательных таргетов (например, встроенных фреймворков или библиотек). Тогда архив формируется как «универсальный» пакет без единого приложения, и Xcode не предлагает стандартный экспорт IPA. Для основного таргета приложения Skip Install должен быть NO, для вложенных библиотек — YES.
Способы дистрибуции и их ограничения
Даже при корректном архиве экспорт может быть недоступен для конкретного способа распространения. Каждый метод предъявляет свои требования к аккаунту и профилю, и несоответствие любому из них блокирует кнопку далее в мастере экспорта.
| Метод | Требуемый аккаунт | Типичная причина блокировки |
|---|---|---|
| App Store Connect | Платный Apple Developer Program | Приложение не создано в App Store Connect или нет прав у роли |
| Ad Hoc | Платный Apple Developer Program | UDID устройства не добавлен в профиль |
| Enterprise | Apple Developer Enterprise Program | Нет корпоративной программы или сертификата |
| Development | Любой, включая бесплатный | Устройство не зарегистрировано в профиле разработки |
Обратите внимание: метод Enterprise доступен только участникам отдельной корпоративной программы Apple. Если у вас обычный платный аккаунт, этот пункт будет недоступен или приведёт к ошибке — это не сбой, а ограничение типа учётной записи.
Ошибки на финальном шаге экспорта
Иногда мастер экспорта запускается, но завершается ошибкой вроде «No profiles for ... were found» или сообщением о невозможности подписать компонент. Это значит, что локальное состояние профилей рассинхронизировалось с серверами Apple. Помогает последовательность: в Xcode → Settings → Accounts выбрать команду и нажать Download Manual Profiles, затем повторить экспорт.
Если ошибка сохраняется, попробуйте очистить производные данные: удалите содержимое папки ~/Library/Developer/Xcode/DerivedData (сам проект это не затронет), перезапустите Xcode и создайте архив заново. Просроченные профили также можно удалить вручную из ~/Library/MobileDevice/Provisioning Profiles — при следующей сборке с автоматической подписью Xcode скачает свежие.
Экспорт через командную строку
Если графический интерфейс капризничает, экспорт можно выполнить через xcodebuild: сначала создать архив командой xcodebuild -archivePath, затем экспортировать с флагом -exportArchive и файлом ExportOptions.plist, где задаётся метод дистрибуции и команда. Этот способ не обходит требования к сертификатам — он лишь даёт более подробный текст ошибки в логе, что помогает диагностике.
⚠️ Внимание: перед удалением профилей и DerivedData убедитесь, что у вас есть доступ к аккаунту разработчика для их повторной загрузки. Без интернета и действующей авторизации восстановить профили не получится, и сборка остановится полностью.
Когда ничего не помогает
Если сертификаты действительны, профили свежие, а экспорт по-прежнему недоступен, проверьте версию Xcode: устаревшая среда может некорректно работать с новыми требованиями Apple к подписи. Обновление через App Store или с портала разработчиков нередко снимает необъяснимые блокировки. Параллельно стоит посмотреть статус сервисов Apple — иногда проблема на стороне серверов, и достаточно повторить попытку позже.
Для проектов со сложной структурой (несколько таргетов, расширения, watch-компаньоны) полезно временно упростить конфигурацию: собрать архив только основного приложения и проверить, станет ли экспорт доступен. Так вы локализуете, какой именно компонент ломает подпись, вместо перебора настроек вслепую.
Частые вопросы
Почему кнопка Distribute App серая и не нажимается?
Чаще всего архив не распознан как архив iOS-приложения: он собран для симулятора, либо в проекте неверно настроен параметр Skip Install у вложенных таргетов. Пересоберите архив с целью Any iOS Device и проверьте настройки таргетов.
Можно ли экспортировать IPA с бесплатным аккаунтом разработчика?
Да, но только методом Development для установки на зарегистрированные устройства. Методы App Store Connect, Ad Hoc и Enterprise требуют платных программ Apple.
Что делать, если Xcode пишет, что профиль не найден?
Включите Automatically manage signing в настройках таргета или нажмите Download Manual Profiles в разделе Accounts. Если профиль создан вручную, проверьте, что его bundle ID совпадает с идентификатором приложения и срок действия не истёк.
Влияет ли истёкший сертификат на уже собранные архивы?
Да. Экспорт — это повторная подпись, поэтому для неё нужен действующий сертификат на момент экспорта, даже если архив был создан раньше, когда сертификат ещё работал.
Нужно ли удалять старые provisioning-профили?
Не обязательно, но очистка просроченных профилей из ~/Library/MobileDevice/Provisioning Profiles помогает, когда Xcode подхватывает устаревший профиль вместо актуального. Перед удалением убедитесь, что сможете загрузить свежие профили из своего аккаунта.