Экспорт проекта для macOS
Шаблоны, C# и архитектуры, подпись, нотариализация и проверка готового .app.
Что получится
Пакет Game.app с исполняемым файлом, ресурсами и библиотеками проекта. .app — каталог с внутренней структурой, а не один файл. Для передачи с Windows выбирайте ZIP: прямое копирование .app с Windows не сохраняет Unix-права исполняемых файлов.
Этот маршрут относится к экспорту проекта. Сборка редактора и шаблонов описана в сборке для macOS.
Подготовьте экспорт
- Проверьте запуск проекта и его главного уровня в редакторе. Для C# сначала устраните ошибки сборки.
- Подготовьте macOS-шаблоны именно вашей сборки Reckfell 1.0.0. Экспортёр ищет
macos.zip; архив редактора Windows его не заменяет. Для собственной сборки задайте архивы вcustom_template/debugиcustom_template/releaseсоответствующего пресета. Совпадение номера версии само по себе не доказывает совпадение модулей и SDK. - В окне экспорта проекта добавьте пресет macOS. Задайте
application/bundle_identifier, напримерcom.yourstudio.yourgame, и не меняйте его между выпусками одной игры. Отображаемое имя приложения — отдельная настройка. - Выберите
binary_format/architecture:arm64для Apple silicon,x86_64для Intel илиuniversalдля обоих. Нативные расширения и сторонние библиотеки тоже должны иметь нужные архитектуры. Один универсальный файл движка этого не обеспечивает. Что означает universal binary. - Проверьте
application/min_macos_version_x86_64иapplication/min_macos_version_arm64. Значения пресета по умолчанию —11.00и13.00; это метаданные пакета, а не результат проверки вашей игры на этих версиях ОС. Итоговые требования зависят также от рендера, .NET и библиотек. - Создайте отдельный каталог результата вне проекта. Для контрольного выпуска используйте release-экспорт с выключенным Export With Debug. Старый результат в выбранном пути может быть заменён; не экспортируйте поверх единственной принятой сборки.
Выберите способ доставки
| Задача | Настройка и результат |
|---|---|
| Проверка у себя | export/distribution_type=0 (Testing), подпись ad-hoc, нотариализация выключена. Это не готовый публичный выпуск. |
| Распространение вне магазина | export/distribution_type=1 (Distribution), Developer ID-подпись, нотариализация и проверка готового пакета на Mac. |
| Mac App Store | Отдельный маршрут: доступен при экспорте с macOS; нужны подписи магазина, provisioning profile, installer identity и App Sandbox. Developer ID не заменяет эти настройки. |
ZIP и .app предусмотрены на всех хостах экспорта. DMG и PKG создаются только на macOS; список форматов также зависит от distribution type. Наличие пункта экспорта не подтверждает наличие шаблонов или работоспособность C#-публикации на вашем хосте.
Если проект использует C#
Используйте .NET-редактор, совместимые .NET-шаблоны и SDK проекта. Экспортный плагин выполняет dotnet publish, а не только обычный build. В режиме universal он отдельно публикует x86_64 и arm64; для каждой архитектуры нужны подходящие нативные зависимости NuGet/расширений.
На macOS опубликованные данные размещаются в Contents/Resources/data_<project>_<platform>_<arch>. Не удаляйте их из .app и не распространяйте один исполняемый файл из Contents/MacOS. Опция dotnet/embed_build_outputs не встраивает эти данные в PCK на macOS.
Если есть Failed to build project или Publish succeeded but project assembly not found, разбирайте MSBuild/publish-журнал. Существующий ZIP и успешный build в редакторе не доказывают успешную публикацию обеих архитектур.
Подпись и нотариализация
На Mac для прямого распространения выберите Xcode codesign и Developer ID Application identity из Keychain. Пустая identity либо - означает ad-hoc. Встроенная ad-hoc-подпись не удостоверяет разработчика и не подходит для нотариализации. На других хостах предусмотрен rcodesign, но его наличие не доказывает корректную подпись пакета с .NET/динамическими библиотеками: проверяйте окончательный пакет на Mac.
Для нотариализации задайте Team ID и один способ авторизации: Apple ID с app-specific password либо App Store Connect API credentials. Не сохраняйте реальные пароли и приватные ключи в примерах, репозитории или журналах. В этой статье сервис Apple не вызывается.
Выключите codesign/entitlements/debugging для распространения. При создании entitlements экспортёр учитывает CSharpScript и добавляет разрешения для JIT. Если задан codesign/entitlements/custom_file, встроенная генерация заменяется вашим файлом: необходимые разрешения для .NET и библиотек нужно сохранить самостоятельно. Не включайте все разрешения подряд.
Ветка Xcode notarytool отправляет архив и выводит UUID, но не ждёт итогового принятия. UUID — идентификатор заявки, а не статус Accepted. Проверьте статус/журнал средствами Apple, дождитесь Accepted, затем прикрепите ticket через stapler. ZIP напрямую не stapling-уют: ticket прикрепляют к приложению/DMG, затем заново упаковывают окончательный ZIP. После этого содержимое приложения не изменяйте. Официальный процесс Apple.
Проверьте результат на Mac
Распакуйте именно доставляемый архив. В терминале macOS замените путь на свой:
APP="/absolute/path/Game.app"
EXEC=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleExecutable' "$APP/Contents/Info.plist")
plutil -lint "$APP/Contents/Info.plist"
file "$APP/Contents/MacOS/$EXEC"
lipo -archs "$APP/Contents/MacOS/$EXEC"
codesign --verify --deep --strict --verbose=2 "$APP"
spctl --assess --type execute --verbose=4 "$APP"Для universal основной исполняемый файл должен содержать x86_64 и arm64; отдельно проверьте архитектуры подключённых библиотек. Чистая проверка подписи не равна принятию Gatekeeper. Ошибки разрешений, политики запуска и журнал приложения разобраны в запуске на macOS.
Запустите release-пакет на целевом Mac и проверьте главный уровень, ввод, звук, сохранения в user:// и функции расширений. Для универсального выпуска проверьте обе архитектуры. Результат экспорта без ошибок не заменяет этот запуск: некоторые ошибки подписи экспортёр выводит как предупреждения.
Граница проверки статьи: настройки и ветки экспорта сверены с исходниками Reckfell 1.0.0, C#-плагином и инструкциями Apple. Здесь не выполнялись экспорт .app, публикация C# для macOS, подпись, нотариализация или запуск на Mac; это шаги проверки вашей сборки, а не уже полученные результаты.