Build for Mobile
Shipping a game to mobile means packaging it for iOS and Android, signing it, dealing with stores, and accepting hard truths about touch input and battery. Engine choice (Unity, Godot, Unreal, custom WebGL via Capacitor) determines the pipeline; the user-facing concerns are the same.
Per-engine build paths, signing, store assets
EXAMPLE
# ===== Engine choice -> build pipeline ===== # Unity: Build Settings -> Android / iOS, Player Settings, IL2CPP backend. # Cloud Build or Unity Build Automation for CI. # Godot: Project -> Export -> Add 'Android' / 'iOS'. Templates downloaded once. # Unreal: File -> Package Project -> Android / iOS. Native tooling required. # Web -> mobile via Capacitor / Cordova: build WebGL, wrap in a native shell. # ===== iOS ===== # 1) Pre-reqs: Apple Developer account, macOS + latest Xcode, App Store Connect. # 2) Set the bundle id in your engine (e.g. au.com.example.shop-game). # 3) Engine writes an Xcode project; open with xcodebuild or in Xcode. # 4) Signing: enable 'Automatically manage signing' for dev, set the Team. # For CI: fastlane match for shared, encrypted certs/profiles. # 5) Required Info.plist keys (game-specific): # NSPhotoLibraryUsageDescription if Save-Image / Share-Image # NSCameraUsageDescription if AR features # NSMicrophoneUsageDescription if voice chat / mic input # GCSupportsControllerUserInteraction = true if MFi controllers # 6) Build archive + upload: # xcodebuild archive -workspace MyGame.xcworkspace -scheme MyGame \ # -archivePath build/MyGame.xcarchive -configuration Release # xcodebuild -exportArchive -archivePath build/MyGame.xcarchive \ # -exportPath build/ -exportOptionsPlist export.plist # xcrun altool --upload-app -f build/MyGame.ipa -u apple-id -p app-specific-password # 7) TestFlight: internal testers (no review), external testers (light review). # ===== Android ===== # 1) Pre-reqs: Android Studio + JDK 17, Google Play Console. # 2) Set application id (engine config or build.gradle). # 3) Generate signing key ONCE — keep it forever: # keytool -genkey -v -keystore game-release.jks -keyalg RSA -keysize 2048 \ # -validity 36500 -alias game-release # 4) Engine writes build.gradle / signingConfigs. Store credentials in a # key.properties file kept OUT of git. # 5) Build the release App Bundle (.aab — what Play wants): # cd android && ./gradlew bundleRelease # Output: app/build/outputs/bundle/release/app-release.aab # 6) Upload to Play Console -> Internal testing -> Create release -> Upload .aab # 7) AndroidManifest entries you usually need: # <uses-feature android:glEsVersion='0x00030000' android:required='true'/> # <uses-permission android:name='android.permission.INTERNET'/> # <uses-permission android:name='android.permission.VIBRATE'/> # <meta-data android:name='unityplayer.ForwardNativeEventsToDalvik' value='true'/> (Unity) # ===== Cross-cutting concerns ===== # Performance budget # - Mid-tier Android (Snapdragon 6XX) is your real baseline, not flagships # - Frame target 60 fps where you can, 30 fps consistent beats 60 jittery # - Battery: 30 minute test session must stay < 1 hour to full drain # - Thermal throttle hits 8-15 minutes in — test it # - Profile on REAL devices; emulators lie about perf # Touch input + accessibility # - Minimum tap target 44 pt iOS / 48 dp Android # - Don't make critical buttons in screen corners (case-grip) # - Respect 'Reduce Motion' settings; offer a control-remap screen # - Test with one hand AND in landscape # Storage + offline # - StreamingAssets / OBB for big assets (over 200 MB main APK is rejected on Play) # - Use Asset Bundles / Addressables to download progressively # - Save game uses local + cloud (Game Center / Google Play Games Services) # Monetisation (if any) # - IAP via StoreKit (iOS) + Play Billing v6 (Android) # - Show prices in the user's currency, never hardcode # - Implement restore-purchases — required for App Store approval # Privacy + ATT # - iOS App Tracking Transparency prompt required if you track across apps # - Privacy nutrition label (App Store) + Data Safety form (Play) # - Children's category triggers COPPA/UK Age-Appropriate Design Code rules # ===== CI integration ===== # fastlane on macOS GitHub Actions runner for iOS # fastlane on linux runner for Android (gradle bundle + supply) # Both inside a workflow that: # - bumps versionCode/Build automatically # - signs from a Match repo / GPG-encrypted keystore # - uploads to TestFlight / Play internal track # - posts the build link to Slack
Why it matters
Test on a mid-tier Android device, not a flagship and not the simulator. The performance gap between a $1500 iPhone Pro and a $300 Android handset is the difference between "feels great" and "uninstall after 3 minutes" — and that mid-tier device is what most of your users will have.
Tip: Tweak the snippet with Try it Yourself », then sit the quiz at the bottom of the page.
Example
Example
// Unity / Unreal / Godot all export to iOS + Android. // Test on real devices early; emulators lie about performance.Try it Yourself »
Discussion
Loading…