Симптом: SwiftUI Preview на удалённом Mac остаётся пустым, не обновляется или завершается ошибкой, хотя проект собирается.
Быстрый маршрут: сначала откройте Preview Diagnostics и найдите первое содержательное сообщение об ошибке; затем сравните обычную сборку с минимальным Preview и проверьте выбранную цель запуска. Не удаляйте все кэши и не переустанавливайте Xcode, пока не установлена конкретная причина.
Это руководство подойдёт вам, если вы разрабатываете SwiftUI-приложение на удалённом Mac и не можете понять, почему Canvas не показывает интерфейс.
Оно полезно и тогда, когда обычный Build успешен, но Preview не запускается или падает.
Для небольшой команды отдельно рассмотрена проверка учётной записи, прав на каталоги и удалённой сессии.
SECTION 01Причины, по которым SwiftUI Preview на удалённом Mac не отображается
Фраза «Preview не работает» объединяет несколько разных неисправностей. Canvas может быть закрыт или приостановлен; компиляция предварительного просмотра может завершиться ошибкой; процесс Preview может не запуститься либо запуститься и упасть уже при выполнении кода. Пока эти случаи не разделены, очистка DerivedData — не диагностика, а действие наугад.
Сначала зафиксируйте, что именно видно в Xcode:
- Canvas не открыт, скрыт или поставлен на паузу;
- в Canvas отображается ошибка обновления;
- Preview долго не появляется и затем сообщает о сбое запуска;
- Preview появляется, но пропадает после выполнения кода;
- обычный Build успешен, однако предварительный просмотр не компилируется либо не выполняется.
В документации по взаимодействию с Preview в Canvas описаны работа с холстом и диагностика. Откройте Canvas, проверьте, включено ли обновление, и обратите внимание на выбранный вариант предварительного просмотра. Затем откройте Issue navigator и Preview Diagnostics. Запишите первое содержательное сообщение об отказе, а не только итоговую строку: следующие сообщения в журнале часто описывают последствия начальной ошибки.
Успешный обычный Build сам по себе не доказывает, что Preview исправен. Он подтверждает, что прошёл путь сборки выбранной схемы, но не удостоверяет запуск конкретного предварительного просмотра, доступность его данных и работу процесса в выбранном окружении. Это различие важно при разборе Xcode Canvas: отдельный Preview может использовать код и зависимости, которые обычный Build не выполнял тем же способом.
SECTION 02Проверка SwiftUI-файла до очистки данных сборки
Начните с небольшого контрольного примера в том же проекте. Он поможет отделить проблему файла интерфейса от общей неисправности Preview или проекта. Создайте простой SwiftUI View без сетевых запросов, чтения локальных секретов и сложной инициализации:
import SwiftUI
struct PreviewProbe: View {
var body: some View {
Text("Проверка Preview")
.padding()
}
}
#Preview {
PreviewProbe()
}
Синтаксис примера и способ добавления предварительного просмотра сверяйте с документацией по созданию Preview в файлах интерфейса. Важно не только наличие #Preview: откройте именно нужный файл, убедитесь, что Xcode распознал представление и показывает для него доступный Preview. Если проект использует иной шаблон предварительного просмотра, придерживайтесь синтаксиса, поддерживаемого установленной версией Xcode.
Дальше сравните контрольное представление с проблемным экраном:
- Если минимальный View отображается, а исходный — нет, исследуйте код целевого экрана и его зависимости.
- Если оба не отображаются, ищите общую проблему в схеме, среде запуска, версии Xcode или пользовательской сессии.
- Если не отображается только конкретный вариант Preview, проверьте именно его данные и настройки, не меняя весь проект.
В исходном экране временно замените сложные входные данные безопасными локальными значениями. Проверьте, что все обязательные параметры инициализатора заполнены, а Preview не зависит от уже авторизованного пользователя, доступного только на рабочей машине файла или ответа сервера. Если экран требует объект состояния или сервиса, создайте для Preview контролируемую заглушку. Это не исправление производственного кода, а способ определить, какая зависимость ломает предварительный запуск.
Проверьте также, что файл принадлежит нужному target и что используемые типы доступны этому target. Если контрольное представление расположено в другом модуле или не включено в сборку целевого приложения, сравнение теряет смысл. Не переписывайте весь экран ради диагностики: сокращайте код по одному участку и после каждого изменения проверяйте Preview, пока не останется воспроизводимый минимальный пример.
SECTION 03Проверка схемы, Simulator и настроек сборки
На следующем этапе проверьте, в какой среде Xcode пытается показать интерфейс. Сверьте активную схему, платформу приложения, целевое устройство Preview и доступность соответствующего runtime. Установка или изменение окружения могут повлиять на сборку и тестирование проекта, поэтому не переключайте цель только ради исчезновения сообщения об ошибке.
Документация по запуску приложения на симулируемых и физических устройствах описывает отдельные способы проверки запуска. А справочник настроек сборки Xcode поможет понять, какие параметры относятся к target и его компиляции. Сопоставьте сведения из Xcode с настройками проекта, а не задавайте произвольные значения, найденные в чужом сообщении об ошибке.
| Наблюдение | Что оно подтверждает | Следующая проверка |
|---|---|---|
| Минимальный Preview работает, проблемный экран — нет | Canvas и базовая среда могут выполнять Preview | Инициализация экрана, данные, зависимости и код выполнения |
| Обычный Build проходит, но Preview сообщает об ошибке | Обычная сборка и запуск Preview не эквивалентны | Первое сообщение Preview Diagnostics, target и процесс Preview |
| Не запускается ни контрольный Preview, ни проектная сборка | Проблема может быть шире одного SwiftUI-файла | Схема, настройки target, доступность зависимостей и ошибки сборки |
| Preview не стартует, а Simulator запускает приложение | Отказ ограничен путём предварительного просмотра или его окружением | Диагностика Preview, доступ к файлам, пользовательская сессия |
| Preview появляется, но падает после начала выполнения | Представление дошло до выполнения, но авария может быть в коде | Стек сбоя, инициализация, побочные эффекты и данные Preview |
Таблица задаёт направление проверки, но не заменяет журнал. Например, работающий Simulator не доказывает, что Preview использует тот же процесс или ту же конфигурацию. И наоборот, ошибка Canvas ещё не говорит о том, что приложение не запустится в Simulator или на физическом устройстве. Если меняете схему, target или runtime, сохраняйте исходное значение и проверяйте, не затрагивает ли изменение обычную сборку.
SECTION 04Диагностика ошибок зависимостей, JIT и кэша
Если Preview Diagnostics указывает на отсутствующий модуль, объектный файл, подпись или JIT, двигайтесь от первой ошибки к конкретной зависимости. Проверьте, какой target собирается, какой продукт зависимости должен быть доступен и где Xcode ожидает получить соответствующий файл. Ошибка, возникшая при загрузке модуля, не означает автоматически, что повреждён весь DerivedData.
Полезно задавать журналу вопросы по порядку: на каком компоненте оборвался запуск? Упоминает ли сообщение имя модуля или target? Относится ли отказ к созданию файла, загрузке объекта или проверке подписи? Совпадает ли указанная конфигурация с активной схемой? Если обычная сборка использует продукт, которого нет в контексте Preview, найдите расхождение в настройках и графе зависимостей. Не удаляйте сразу все данные сборки: это может увеличить время восстановления и уничтожить часть сведений, нужных для сравнения.
Особенно осторожно действуйте, если журнал сообщает о каталоге Previews JIT, которым владеет другая учётная запись. В примечаниях к Xcode 27.2 Beta указано улучшение сообщения для конкретного случая, связанного с таким каталогом. Это описание относится к названной ситуации и версии, а не устанавливает универсальную причину сбоев Preview. Сначала проверьте, применимы ли эти примечания к вашей версии Xcode и совпадает ли фактическая формулировка ошибки.
Не исправляйте проблему массовым изменением владельца системных или общих каталогов. Сначала подтвердите, кто запускает Xcode, кто создал каталог и имеет ли текущая учётная запись доступ к нужным файлам. Если диагноз не указывает на права, широкое изменение разрешений добавляет новый риск, но не устраняет первопричину. В обсуждении разработчиков об ошибке предварительного просмотра можно сверить контекст отдельного случая; обсуждение не следует трактовать как доказательство того, что такой сбой типичен для любого удалённого Mac.
SECTION 05Проверка удалённой сессии и общих каталогов
В небольшой команде один и тот же Mac могут использовать разные разработчики или автоматические процессы. В таком случае проверьте не только сам проект, но и фактического владельца процесса Xcode, доступ пользователя к исходникам, каталогам сборки и файлам, которые читает экран. Проблема может зависеть от того, кто запустил Xcode, а не от расположения компьютера.
Сравните эти условия в рабочей сессии:
- Xcode открыт под той же учётной записью, которой принадлежат проект и каталоги сборки;
- проект доступен на чтение и запись текущему пользователю;
- в пути проекта нет каталога, доступного только другой учётной записи;
- Preview и обычный Build запускаются в согласованной пользовательской сессии;
- минимальный контрольный проект проверяется под тем же пользователем, что и проблемное приложение.
Если вы используете SSH для проверки файлов, не предполагайте, что графическая сессия Xcode автоматически выполняется от того же пользователя или наследует все её параметры. Сверьте пользователя процесса и права на конкретные каталоги, на которые указывает диагностика. При командной проверке можно использовать id -un для текущего пользователя и ls -ld для каталога, но результаты этих команд сами по себе не объясняют сбой: сопоставьте их с путём из журнала и процессом, запустившим Xcode.
Для проверки отделите рабочий сценарий от общего: запустите минимальный Preview в чистом проекте под той же учётной записью, затем повторите проверку под отдельным пользователем, если это допустимо для вашей команды. Не переносите вывод из одного профиля на другой. Если неисправность появляется только при смене пользователя, зафиксируйте, какие файлы и каталоги создаются в каждой сессии, и устраните конкретное расхождение. Не следует автоматически выдавать всем пользователям полный доступ ко всем рабочим каталогам.
SECTION 06Выбор следующей проверки по результату диагностики
Используйте условия, а не универсальную команду очистки:
- Если Canvas закрыт или обновление приостановлено, то включите его и проверьте выбранный Preview; иначе перейдите к сообщению Preview Diagnostics.
- Если минимальный View работает, то изолируйте код, параметры и зависимости исходного экрана; иначе проверьте схему, runtime, target и сессию.
- Если журнал называет модуль или объектный файл, то проверяйте target и конкретную зависимость; иначе не удаляйте кэши только на основании предположения.
- Если ошибка прямо указывает на JIT-каталог или владельца, то сверьте пользователя и применимые примечания к установленной версии; иначе не меняйте глобальные права.
- Если Preview работает, но сборка или запуск приложения не прошли, то продолжайте проверку в соответствующем пути; иначе не считайте успешный Canvas заменой тестирования.
Переходить к очистке DerivedData разумно, когда диагностика указывает на повреждённый артефакт или когда более точные проверки уже исключили код, зависимости, target и пользователя. Перед очисткой сохраните сообщение об ошибке и зафиксируйте, что именно собираетесь удалить. Так вы сможете проверить, изменился ли результат, а не просто увидеть временное исчезновение симптома.
SECTION 07FAQ: дополнительные различия при сбое Preview
Почему обычный Build успешен, а Preview остаётся пустым? Обычная сборка не подтверждает запуск конкретного предварительного просмотра. У Preview могут отличаться входные данные, путь исполнения, зависимости или условия доступа к пользовательским файлам. Сначала проверьте состояние Canvas и первое сообщение Preview Diagnostics, затем создайте минимальный View в том же проекте и сравните результаты. Так вы отделите ошибку файла от ошибки окружения.
Где понять, что означает Preview Update Error? Начните с диагностических сведений Preview и связанного сообщения в Issue navigator. Найдите первое сообщение, которое указывает на компиляцию, target, зависимость или запуск процесса; длинный стек ниже может содержать только последствия. Затем сопоставьте его с активной схемой и обычным Build. Если в журнале есть конкретное имя модуля, исследуйте его, а не очищайте данные проекта целиком.
Что делать, если в сообщении фигурируют JIT и права на каталог? Проверьте владельца указанного каталога, пользователя Xcode и учётную запись, которой доступен проект. Не меняйте разрешения на системном уровне, пока не подтвердили, что проблема именно в правах. Сверьте текст ошибки с примечаниями к своей версии Xcode: опубликованное исправление для отдельного сценария не означает, что все сбои Preview вызваны JIT-каталогом.
Можно ли считать Preview и Simulator одной проверкой? Нет. Canvas Preview предназначен для быстрого просмотра конкретного интерфейса, а запуск приложения в Simulator проверяет другой путь выполнения. После восстановления Preview отдельно запустите приложение в Simulator; для проверки доставки и настроек выпуска используйте соответствующий процесс архивирования. Документация по распространению приложения для тестирования и выпуска описывает отдельный этап распространения, а не подтверждение того, что Canvas исправен.
SECTION 08Подтверждение исправления на разных уровнях
После устранения причины повторите ту же последовательность, на которой сбой воспроизводился. Откройте исходный файл, запустите тот же вариант Preview и убедитесь, что обновляется именно он, а не только контрольный View. Затем выполните обычный Build выбранной схемы. Если меняли настройки target, проверьте, что они не повлияли на приложение и другие конфигурации проекта.
После этого отдельно запустите приложение в Simulator с подходящей целью. Границы проверки здесь важны: Preview подтверждает отображение выбранного интерфейса в контексте Canvas; Simulator показывает поведение приложения в симулируемой среде; тест на физическом устройстве выявляет условия, которые не воспроизводятся в Simulator. Ни успешный Preview, ни запуск в Simulator не заменяют проверку на реальном устройстве, если вашему приложению важны конкретные аппаратные возможности.
Для выпуска используйте самостоятельную проверку Archive и процесса распространения. Это отдельный этап от повседневного просмотра SwiftUI-интерфейса. Если Archive не проходит, вернитесь к соответствующим сообщениям сборки и подписи, а не объявляйте проблему Preview нерешённой. При этом если архивирование успешно, оно тоже не доказывает, что обновление Canvas работает: фиксируйте результаты каждого пути отдельно.
Запишите короткий итог диагностики для команды: исходный симптом, первое содержательное сообщение, изменённое условие и результат повторной проверки. Удалите из заметок имена пользователей, названия внутренних каталогов и другие чувствительные сведения. Если причина была в конкретной зависимости или правах, зафиксируйте это без вывода, что все последующие сбои Preview устроены так же.
Если ошибка указывает на недоступный runtime, изоляцию пользователей или постоянные ограничения текущей удалённой среды, сравните стоимость исправления этой среды с работой на управляемом Mac. Локальный компьютер удобнее, когда нужны физические интерфейсы и стабильная личная настройка; уже имеющийся удалённый Mac может быть предпочтительнее, если он доступен под нужной учётной записью и имеет требуемое окружение. Аренда не исправит неверную схему или ошибку в коде, зато может избавить от обслуживания собственного постоянно включённого узла и несогласованных пользовательских сессий. Если для удалённой SwiftUI-разработки важны полный Xcode и отдельная рабочая среда, изучите условия аренды MACNOX и варианты доступа к удалённому Mac; выбирайте такой вариант только после проверки, что причина действительно в среде, а не в проекте.