Сначала установите, возникает ли ошибка только у цели Mac Catalyst и связан ли отсутствующий символ с API, предназначенным для iOS 27.1; затем сверьте примечания именно к Xcode 27.2 RC и повторите сборку на том же коммите. Apple описывала похожий сбой и способ изоляции кода в примечаниях к Beta 2, но этот факт не доказывает, что проблема сохранилась в RC.
Материал предназначен разработчикам, которые поддерживают общую кодовую базу для iOS и Mac Catalyst и видят ошибку символа или члена только при сборке Catalyst. Если обе платформы падают одинаково, сначала следует искать общую проблему исходного кода, зависимостей или настроек.
Последняя проверка — 29 октября 2026 года: статус RC сверяется по записи Apple о выпуске Xcode 27.2 RC, а состояние известной ошибки — по примечаниям к RC и примечаниям к Xcode 27.2 Beta 2. При выходе финальной версии или обновлении записи Apple проверку нужно повторить.
Проверка области сбоя
Первое диагностическое решение — сравнить результаты сборки двух платформ на одной и той же ревизии проекта. Нельзя менять зависимости, исходники или настройки между запусками: иначе различие результатов перестанет указывать на целевую платформу и может отражать побочное изменение.
Зафиксируйте для каждого запуска целевую платформу, выбранный SDK, конфигурацию и полный текст первой ошибки компилятора. Для проверки инструментальной среды пригодятся команды Xcode:
xcodebuild -version
xcodebuild -showsdks
Они показывают установленную версию Xcode и доступные SDK; описание их назначения есть в справочнике Apple по инструментам командной строки Xcode. Вывод этих команд не заменяет фактическую сборку проекта: сам факт наличия SDK не подтверждает поддержку конкретного API выбранной платформой.
Затем повторите сборку iOS и Mac Catalyst, явно задавая соответствующую схему и параметры назначения, принятые в проекте. Сохраните не только краткое сообщение интерфейса Xcode, но и полный журнал: важны первая ошибка, предшествующие предупреждения, имя модуля и команда компиляции. Если ошибка появляется в общем файле, отметьте, откуда этот файл подключается в каждом target.
В примечаниях Apple к Xcode 27.2 Beta 2 зафиксирован сценарий, при котором проект с API, относящимся к iOS 27.1, мог завершаться ошибкой при сборке Mac Catalyst; там же описан workaround с условиями компиляции. Это исторически подтверждённый факт о Beta 2, а не заключение о состоянии RC. Статус последнего следует устанавливать по примечаниям к Xcode 27.2 RC, а не переносить вывод из предыдущего предварительного выпуска.
Практическое разделение выглядит так:
- Если iOS и Catalyst завершаются одной и той же ошибкой в общем коде, сначала проверьте доступность API, синтаксис, зависимости и настройки проекта.
- Если iOS собирается, а Catalyst сообщает, что символ или член не найден, проверяйте платформенную область API и компиляционные условия.
- Если Catalyst падает до компиляции конкретного файла либо ошибка относится к настройке SDK, проверьте выбранные инструменты, target и build settings.
- Если RC не упоминает этот дефект, это означает лишь, что по доступной записи нельзя уверенно подтвердить его статус. Для вывода нужен воспроизводимый тест конкретного проекта.
При сопоставлении SDK и платформы используйте страницу Apple с требованиями Xcode и поддерживаемыми SDK. Версия инструментария, версия SDK и поддерживаемая платформа — разные параметры; указание только версии Xcode не позволяет однозначно описать условия ошибки.
Диагностика отсутствующего символа
Фраза компилятора вроде «не найден член» ещё не объясняет причину. В первую очередь нужно определить точный тип, символ и место первого обращения, а затем выяснить, относится ли API к конкретной версии iOS или доступен также Mac Catalyst. Одинаковые имена типов в SDK не гарантируют одинаковый набор доступных API на разных платформах.
Рабочая последовательность проверки:
- Откройте первую ошибку, а не последнюю строку сводки. Последующие сообщения часто возникают из-за одного недоступного типа или объявления.
- Найдите объявление и все обращения к символу: вызовы, расширения, свойства, протоколы и типы, содержащие его в сигнатуре.
- Проверьте, в каком target компилируется файл и не включён ли он одновременно в несколько целей с разными настройками.
- Сверьте поддержку символа с документацией для соответствующей платформы и SDK, а не только с результатом поиска по имени API.
- Сопоставьте найденное ограничение с примечаниями к RC. Запись о проблеме в Beta 2 — повод проверить конкретный сценарий, но не доказательство, что любой похожий сбой вызван тем же дефектом.
Для Mac Catalyst также важно различать общий исходный файл и одинаковую среду исполнения. Приложение использует общую часть iPad-приложения, но Mac-версия может требовать платформенных решений и отдельной проверки поведения. Общее описание разработки Mac Catalyst дано в документации Apple по созданию Mac-версии приложения для iPad.
В частности, если символ предназначен только для iOS, проверьте, не просачивается ли он в интерфейс общего модуля: скрытый за условием вызов не поможет, если недоступный тип уже присутствует в общей сигнатуре. И наоборот, если документация подтверждает поддержку Catalyst, но компилятор сообщает обратное, сохраните минимальный фрагмент и сравните точные параметры сборки, прежде чем менять код.
Условная компиляция и границы workaround
Условная компиляция Swift подходит для отделения платформенной реализации там, где код действительно не должен входить в сборку Mac Catalyst. Синтаксис платформенного условия следует сверять с документацией и примечаниями конкретного выпуска. Для иллюстрации структуры, а не как универсальное исправление, условие может выглядеть так:
#if !targetEnvironment(macCatalyst)
// Вызовы, предназначенные только для iOS
#endif
Такой блок имеет смысл только в том случае, если он охватывает все объявления и обращения, зависящие от исключаемого API. Проверьте связанные расширения, типы параметров, возвращаемые значения и код, вызываемый из общего слоя. Если символ используется в публичном интерфейсе модуля, изоляции одного места вызова может быть недостаточно.
У Objective-C другой синтаксис: условия платформы обычно строятся на макросах из TargetConditionals.h, а не на директивах Swift. Их применимость и точную форму нужно проверить в контексте проекта и актуальной документации; нельзя копировать Swift-условие в Objective-C-файл или считать, что одно условие автоматически изолирует смешанную Swift/Objective-C-зависимость.
Важна и семантика обходного решения. Условие может исключить реализацию для Catalyst, но это не равнозначно исправлению компилятора и не подтверждает отсутствие ошибки в RC. Если приложение должно предоставлять ту же функцию на Mac, понадобится доступная для этой платформы реализация либо осознанно ограниченное поведение. Проверка должна включать не только успешное завершение компиляции, но и выполнение соответствующего сценария.
| Проверяемый признак | Что он позволяет заключить | Следующее действие |
|---|---|---|
| Ошибка появляется на iOS и Mac Catalyst | Проблема, вероятно, не ограничена платформой Catalyst | Проверить общий код, зависимости и настройки |
| iOS собирается, Catalyst не находит API | Возможны платформенное ограничение или ошибка инструментов | Сверить поддержку API и журнал RC |
| API исключён условием, но ошибка остаётся | Условие может не покрывать объявление или другой путь вызова | Найти все зависимости от символа и проверить сборку модуля |
| После условия сборка проходит, но функция пропала | Обходное решение изменило состав реализации | Проверить поведение обеих платформ и предусмотреть замену |
| Примечания RC не подтверждают прежний дефект | Статус для данного проекта остаётся неопределённым | Зафиксировать воспроизведение, не объявляя проблему общей |
Это различие особенно важно для проекта с общими файлами: условие вокруг одного вызова может скрыть симптом в конкретной точке, но не устранить несовместимость на границе модулей. Workaround из заметок к Beta 2 следует применять только к соответствующему сценарию и после сверки формулировки с оригинальными примечаниями Apple.
Проверка условий сборки после workaround
Если условная компиляция добавлена, а ошибка сохраняется, не расширяйте её вслепую. Сначала проверьте, действительно ли неудачная сборка использует ожидаемые target, SDK и конфигурацию. В крупном проекте экранная схема Xcode, скрипт CI и локальная команда могут передавать разные параметры.
Для фиксации настроек сохраните команду сборки и вывод build settings. Например, запрос можно выполнить через xcodebuild с той же схемой и назначением, которые использовались при проблемном запуске:
xcodebuild -showBuildSettings \
-scheme "$SCHEME" \
-destination "$DESTINATION" \
> build-settings.txt
Значения переменных здесь задаются проектом; это пример формы команды, а не готовые параметры для любого репозитория. Сравните настройки iOS и Mac Catalyst, особенно состав исходных файлов, определения условий компиляции, выбранный SDK и параметры конфигурации. Если схема задаёт несколько целей, выясните, какая именно из них породила ошибку.
Для проверки областей исходного кода составьте перечень зависимостей от проблемного символа: сам вызов, декларации, обёртки, общие протоколы и участки инициализации. Затем проверьте, что исключённый блок не нужен другому коду внутри того же файла. Если на Catalyst сохраняется обращение через псевдоним типа или общий интерфейс, компилятор всё ещё может встретить недоступный API, даже когда видимый вызов окружён условием.
Наконец, соберите обе платформы повторно. Успех только одного target не подтверждает, что условие корректно обработано для другого. Отдельно проверьте функциональный сценарий, который использовал исключённый API: компилятор оценивает корректность сборки, но не гарантирует сохранение ожидаемого поведения приложения.
Не применяйте workaround только по сходству текста ошибки. Один и тот же текст может появиться при разных причинах — например, из-за платформенного ограничения, другой конфигурации target или несовпадающего SDK. Пока эти варианты не разделены, изменение условий способно скрыть диагностический сигнал и усложнить последующее воспроизведение.
Минимальное воспроизведение и обращение в Apple
Когда iOS собирается, а Mac Catalyst нет, минимальное воспроизведение помогает отделить дефект инструментария от особенностей проекта. Начните с неизменной ревизии репозитория и подготовьте два запуска: для iOS и для Catalyst. Если сравнение проведено на разных коммитах или с разными зависимостями, результат не показывает влияние платформы.
Сведите пример к проблемному типу или вызову, удаляя несвязанные файлы, не меняя семантику ошибки. Сохраните:
- точную версию Xcode и перечень доступных SDK;
- целевую платформу, схему, конфигурацию и параметры сборки;
- полный журнал от начала компиляции до завершения;
- первый фрагмент исходного кода, который воспроизводит ошибку;
- результат сборки iOS на том же коммите;
- фактические условия компиляции и сведения о включённых файлах.
Такой набор материалов позволяет повторить проверку и уменьшает риск, что отчёт описывает локальную настройку, а не проблему инструмента. В обращении не следует утверждать, что неисправность затрагивает все проекты, если воспроизведение выполнено только на одном проекте. Укажите, что проверено, а что остаётся неизвестным; статус RC отделяйте от подтверждённого описания Beta 2.
Для отправки отчёта используйте Apple Feedback Assistant. Перед отправкой убедитесь, что минимальный пример действительно воспроизводит сбой, а приложенные журналы соответствуют указанной версии Xcode и целевой платформе. При изменении записи Apple или выходе финальной версии проверку следует повторить, поскольку вывод о предварительном выпуске не заменяет проверку нового состояния инструментария.
Локальная машина может осложнить сравнение, если на ней нет места для нескольких SDK или невозможно оставить отдельную среду для повторной проверки; однако это операционные ограничения конкретного рабочего места, а не доказательство несовместимости Xcode. Если для диагностики нужна отдельная машина, удалённый Mac позволяет повторять сборки в изолированной среде, но сам по себе не гарантирует, что ошибка будет воспроизведена. Перед переносом проверки полезно сравнить варианты удалённого Mac для российских пользователей с возможностями среды ViewMini; для выбора нужно заранее определить, какие версии Xcode и SDK требуются проекту.
Частые вопросы
Почему сборка Mac Catalyst в Xcode 27.2 RC не находит API из iOS?
Проверьте, доступен ли символ для выбранного SDK и целевой платформы: совпадение имени API не подтверждает одинаковую поддержку iOS и Mac Catalyst. Apple описывала ошибку при использовании API, относящегося к iOS 27.1, в примечаниях к Xcode 27.2 Beta 2. Это подтверждает проблему Beta 2, но не доказывает, что она сохранилась в RC.
Как проверить ошибку Mac Catalyst при использовании API iOS 27.1?
Зафиксируйте первую ошибку компилятора, файл и строку, после чего сверьте поддержку символа с документацией SDK и примечаниями Xcode. На одной ревизии проекта сравните сборки iOS и Mac Catalyst, не меняя зависимости и настройки. Если ошибка возникает только у Catalyst, проверьте платформенные условия и реальные параметры сборки, а не только текст сообщения.
Что проверить после изоляции кода Mac Catalyst условной компиляцией Swift?
Убедитесь, что условие охватывает не только объявление API, но и все обращения к нему: расширения, свойства, типы и вызовы из общих файлов. Затем соберите оба целевых варианта и проверьте сценарии приложения, которые зависят от исключённого кода. В Objective-C применяются соответствующие макросы платформы, а не синтаксис условной компиляции Swift.
Остаётся ли workaround из Xcode 27.2 Beta 2 актуальным для RC?
Не считайте его подтверждённым для RC только потому, что он приведён для Beta 2. Прочитайте примечания к RC и повторите сборку на конкретном проекте с неизменным коммитом, отдельно для iOS и Mac Catalyst. Если запись Apple не подтверждает ни сохранение ошибки, ни исправление, укажите, что статус требует воспроизведения, и не переносите вывод на другие проекты.
Если локальная среда не позволяет повторяемо проверить оба target, не стоит сразу менять код под неподтверждённую причину. Сначала определите необходимые Xcode, SDK и условия запуска, затем решите, оправдан ли отдельный удалённый Mac для независимой проверки. По сравнению с единственной локальной машиной такая схема помогает отделить диагностический эксперимент от основного рабочего окружения, но требует отдельно контролировать настройки и журналы; для стабильной постоянной нагрузки или доступа к физическим интерфейсам может быть предпочтительнее собственная машина. Ошибка компиляции Mac Catalyst в Xcode 27.2 RC должна считаться подтверждённой для конкретного проекта только после воспроизведения на зафиксированной среде.
Часто задаваемые вопросы
Почему сборка Mac Catalyst в Xcode 27.2 RC не находит API из iOS?
Начните с проверки, действительно ли символ доступен выбранному SDK и целевой платформе: одинаковое имя API не означает одинаковую поддержку iOS и Mac Catalyst. Apple описывала похожую ошибку для вызовов API, относящихся к iOS 27.1, в примечаниях к Xcode 27.2 Beta 2. Это подтверждает проблему бета-версии, но само по себе не доказывает, что она сохранилась в RC.
Как проверить ошибку Mac Catalyst при использовании API iOS 27.1?
Зафиксируйте первую ошибку компилятора, файл и строку, затем проверьте платформенную поддержку символа по документации SDK и примечаниям Xcode. На той же ревизии проекта сравните сборки iOS и Mac Catalyst, не меняя зависимости и настройки между запусками. Если ошибка есть только у Catalyst, проверьте кодовые пути и фактические параметры сборки, а не только текст сообщения.
Что проверить после изоляции кода Mac Catalyst условной компиляцией Swift?
Убедитесь, что условие окружает не только объявление API, но и все обращения к нему, включая свойства, расширения и вызовы из общих файлов. После этого соберите оба целевых варианта, проверьте доступные сценарии приложения и убедитесь, что iOS-реализация не исчезла. Для Objective-C используйте соответствующие макросы платформы, а не синтаксис Swift.
Остаётся ли workaround из Xcode 27.2 Beta 2 актуальным для RC?
Не считайте его подтверждённым для RC только потому, что он был указан для Beta 2. Сначала прочитайте примечания к выпуску RC и проверьте результат на конкретном проекте с неизменным коммитом и раздельными сборками платформ. Если записи об ошибке или её исправлении нет, фиксируйте статус как требующий воспроизведения и не распространяйте вывод на другие проекты.
Читайте также
Проверьте сборку Mac Catalyst на отдельном Mac
Арендуйте физический Mac ViewMini и воспроизведите сборку в отдельной среде.
