Files
aetherbound-guild/docs/runtime/M49_IOS_EXPORT_PREFLIGHT.md
T

3.5 KiB

M49 iOS Export Preflight

Scope

This is the local, debug-only iOS validation boundary for Aetherbound Guild. It does not authorize TestFlight, App Store submission, distribution signing or release packaging.

Verified configuration

  • Godot: 4.6.1.stable.official.14d19694e
  • Xcode: 26.1.1
  • Team ID: X75CUV458P
  • Bundle ID: com.wusu.aetherboundguild (proposed owner-local ID)
  • Architecture: arm64
  • Deployment target: iOS 14.0
  • Orientation: UIInterfaceOrientationLandscapeLeft and UIInterfaceOrientationLandscapeRight
  • Signing mode: Xcode automatic signing with the local Apple Development identity/profile available on this Mac

Export verification

The following command generated an Xcode project outside the repository:

HOME=/Users/wusumac /Applications/Godot.app/Contents/MacOS/Godot \
  --headless --audio-driver Dummy --path runtime \
  --export-debug "iOS Device Debug" \
  /private/tmp/aetherbound-ios-export-final-20260906-e/AetherboundGuild

Result: Godot export exited 0, and /private/tmp/aetherbound-ios-export-final-20260906-e/AetherboundGuild.xcodeproj was created. The generated project contains one AetherboundGuild target and one matching scheme.

arm64 Xcode verification

The signed device configuration was built with:

xcodebuild \
  -project /private/tmp/aetherbound-ios-export-final-20260906-e/AetherboundGuild.xcodeproj \
  -scheme AetherboundGuild -sdk iphoneos -configuration Debug \
  -derivedDataPath /private/tmp/aetherbound-ios-signed-derived-20260906-e build

Result: ** BUILD SUCCEEDED **. The resulting app is arm64, has bundle ID com.wusu.aetherboundguild, is signed by Apple Development: wu ShengHua (E2D99JSE7J), and carries Team ID X75CUV458P.

Non-blocking warnings

  • Godot resizes the single opaque 1024px boot image for the required iOS icon slots. This is an export warning, not a build failure; a dedicated square app icon can replace it later without changing the runtime.
  • Xcode reports empty camera/microphone/photo usage descriptions because the generated Godot template emits those optional keys. The current game does not request those capabilities.

Device state

xcrun devicectl list devices currently reports the three known iPhones as unavailable, so an install/launch check could not yet be performed. M49-C remains open until the owner's iPhone is connected, unlocked, trusted and has Developer Mode enabled.

For regular development, the checked-in helper now uses the stable ignored directory build/ios/ under the repository. From the repository root, rerun the export after source changes and open the same Xcode project:

./tools/export_runtime_ios.sh
open build/ios/AetherboundGuild.xcodeproj

The Xcode project contains the exported game data from the moment of export; rerunning the helper is therefore required after changing Godot scenes, scripts or assets.

When a device is available, use its identifier from devicectl in this sequence (the -allowProvisioningUpdates flag lets Xcode refresh the managed development profile after the owner signs in):

xcrun devicectl list devices

xcodebuild \
  -project build/ios/AetherboundGuild.xcodeproj \
  -scheme AetherboundGuild -destination 'id=<DEVICE_UDID>' \
  -configuration Debug -derivedDataPath build/ios-derived \
  -allowProvisioningUpdates build

xcrun devicectl device install app --device <DEVICE_UDID> \
  build/ios-derived/Build/Products/Debug-iphoneos/AetherboundGuild.app

xcrun devicectl device process launch --device <DEVICE_UDID> \
  com.wusu.aetherboundguild