Exporting a project for macOS
Templates, C# and architectures, signing, notarization and final .app validation.
Expected output
A Game.app bundle containing the executable, resources and project libraries. An .app is a directory with an internal layout, not a single file. Choose ZIP when transferring from Windows: directly copying an .app from Windows does not preserve Unix executable permissions.
This workflow exports a project. Building the editor and templates is covered in compiling for macOS.
Prepare the export
- Check that the project and its main level run in the editor. For C#, resolve build errors first.
- Prepare macOS templates for your particular Reckfell 1.0.0 build. The exporter looks for
macos.zip; a Windows editor archive is not a substitute. For a custom build set the preset'scustom_template/debugandcustom_template/releasearchives. Matching version numbers alone do not establish matching modules and SDKs. - Add a macOS preset in the project export dialog. Set
application/bundle_identifier, for examplecom.yourstudio.yourgame, and keep it stable between releases of the same game. The displayed application name is a separate setting. - Choose
binary_format/architecture:arm64for Apple silicon,x86_64for Intel, oruniversalfor both. Native extensions and third-party libraries also need the corresponding architectures. A universal engine executable alone does not provide them. What a universal binary contains. - Review
application/min_macos_version_x86_64andapplication/min_macos_version_arm64. Preset defaults are11.00and13.00; these are bundle metadata rather than proof that your game runs on those OS versions. Actual requirements also depend on the renderer, .NET and libraries. - Create a separate output directory outside the project. For release validation export a release build with Export With Debug disabled. Existing output at the selected path can be replaced; do not overwrite your only accepted build.
Choose distribution
| Goal | Configuration and result |
|---|---|
| Local testing | export/distribution_type=0 (Testing), ad-hoc signing, notarization disabled. This is not a finished public release. |
| Distribution outside the store | export/distribution_type=1 (Distribution), Developer ID signing, notarization and final-bundle validation on a Mac. |
| Mac App Store | A separate workflow available when exporting on macOS; requires store signing, a provisioning profile, installer identity and App Sandbox. Developer ID does not replace those settings. |
ZIP and .app are implemented for all export hosts. DMG and PKG creation require macOS; the format list also depends on distribution type. An export option does not establish installed templates or working C# publishing on your host.
C# projects
Use the .NET editor, compatible .NET templates and the project SDK. The export plugin runs dotnet publish, not just a regular build. For universal, it publishes x86_64 and arm64 separately; each architecture needs matching native NuGet/extension dependencies.
On macOS, published data goes into Contents/Resources/data_<project>_<platform>_<arch>. Do not delete it from the .app or distribute only the executable from Contents/MacOS. The dotnet/embed_build_outputs option does not embed these outputs in the PCK on macOS.
For Failed to build project or Publish succeeded but project assembly not found, inspect the MSBuild/publish log. An existing ZIP and a successful editor build do not prove successful publishing for both architectures.
Signing and notarization
On a Mac, choose Xcode codesign and a Developer ID Application identity from Keychain for direct distribution. An empty identity or - means ad-hoc signing. Built-in ad-hoc signing does not identify the developer and cannot be used for notarization. Other hosts offer rcodesign, but installing it does not establish correct signing of a bundle containing .NET/dynamic libraries: verify the final bundle on a Mac.
For notarization configure Team ID and one authentication method: Apple ID with an app-specific password, or App Store Connect API credentials. Keep real passwords and private keys out of examples, repositories and logs. This article does not call Apple's service.
Disable codesign/entitlements/debugging for distribution. Generated entitlements account for CSharpScript and include JIT permissions. If codesign/entitlements/custom_file is set, your file replaces built-in generation: retain the permissions required by .NET and your libraries yourself. Do not enable every entitlement indiscriminately.
The Xcode notarytool branch submits an archive and prints a UUID without waiting for final acceptance. A UUID identifies a request, not an Accepted result. Check status/logs using Apple's tools, wait for Accepted, then attach the ticket with stapler. ZIP archives are not stapled directly: staple the application/DMG, then rebuild the final ZIP. Do not modify application contents afterwards. Apple's official workflow.
Validate on a Mac
Extract the actual archive you intend to distribute. Replace the path in a macOS terminal:
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"For universal, the main executable should contain both x86_64 and arm64; inspect bundled libraries separately. Passing signature verification does not equal Gatekeeper acceptance. Permission failures, launch policy and application logs are covered in running on macOS.
Launch the release bundle on a target Mac and test the main level, input, audio, user:// saves and extension features. Test both architectures for a universal release. An export without errors does not replace this launch: some signing failures are reported as warnings by the exporter.
Review boundary: settings and export branches were reviewed against Reckfell 1.0.0 source, its C# plugin and Apple instructions. No .app export, macOS C# publishing, signing, notarization or Mac launch was performed here; those are validation steps for your build rather than existing results.