101 lines
3.5 KiB
Markdown
101 lines
3.5 KiB
Markdown
# 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:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
./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):
|
|
|
|
```sh
|
|
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
|
|
```
|