Autosana runs your mobile apps on both our virtual device cloud (iOS Simulators and Android Emulators) and real devices in the cloud. The build you upload decides where it can run:
A simulator build of your full app already contains its App Clip, in YourApp.app/AppClips/. Upload the full app as usual.
You can also upload an App Clip on its own: an .app whose Info.plist contains NSAppClip, built for the simulator and zipped like any other .app. This is a valid upload.
Format: .apk (Android App Bundles, .aab, are not supported)
Architecture: a universal APK (recommended) runs on both emulators and real devices. An x86_64-only APK runs on emulators but not real devices.
Most build commands create universal APKs that include all architectures by default, so the same Android build works on both emulators and real devices — no separate build needed.
Select your framework to see build instructions:
React Native
Flutter
Native iOS
Native Android
Important: React Native apps must be built in Release mode. Debug builds will attempt to connect to Metro bundler and fail to run on the device. Release builds bundle the JavaScript code directly into the app, making them standalone.
eas build --platform ios --profile autosana-simulator
Once the build completes, EAS will provide a download URL for the build
Download and extract it to get the .app file
Compress the .app to a .zip and upload it to Autosana
This profile only creates a Simulator artifact; it does not enable APNs. If
the app uses expo-notifications, add its config plugin. During Expo Prebuild
or Continuous Native Generation, that plugin adds
aps-environment=development to the iOS app. If the app does not use
expo-notifications, declare the entitlement under ios.entitlements or
configure it in the native Xcode project. Follow Testing Push Notifications:
Configure an Expo EAS
build.
The output must contain aps-environment with the value development. Then run the complete architecture, entitlement, and bundle-ID preflight in Testing Push Notifications, compress the .app, and upload the resulting .zip.
Why Release configuration? Release builds provide production parity with
optimizations enabled, matching what your users experience. Debug builds work,
but they are not recommended because they do not reflect the production
environment.
Release builds provide better production parity but require signing configuration.Step 1: Configure Signing (if not already set up)Add this to your app/build.gradle:
android { buildTypes { release { // Use debug keystore for testing (not for Play Store) signingConfig signingConfigs.debug minifyEnabled false } }}
This uses the debug keystore for convenience. For Play Store releases, you’ll need a proper release keystore.
Step 2: Build the Release APKUsing Terminal:
cd /path/to/your/android/project./gradlew assembleRelease
To run on real iPhones instead of the simulator, upload an .ipa built for physical hardware (iphoneos) — not a zipped .app. The file extension is how we route the build: .ipa → real device, .app / .zip → simulator.
Signing matters. Use a Development or Ad Hoc signed .ipa. You do not need to register our device UDIDs — builds are automatically re-signed for the test device. Enterprise-signed builds fail to launch on our devices, and App Store builds aren’t supported. Re-signing strips some entitlements (e.g. Push Notifications, Apple Pay, App Groups), so features depending on them won’t work during tests.
If re-signing breaks Team-ID-prefixed Keychain access groups, expand Advanced during IPA upload and enable Fix Keychain access after re-signing. Most apps do not need this option.
Android needs no separate build — a universal .apk already runs on both emulators and real devices.
React Native (Expo)
Flutter
Native iOS / bare React Native
Use an EAS profile with internal distribution — note there is nosimulator: true:
The .ipa lands in ./build/ipa/. Upload it to Autosana.
After uploading your .ipa, start a run with Target: Real device (or device.physical: true via the API). See Real Device Testing for how to run and pick a device.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Autosana","colors":{"primary":"#0D9373","light":"#07C983","dark":"#0D9373"},"logo":{"light":"https://mintcdn.com/autosana/mTDCZgW2I2SWs-UB/logo/light.svg?fit=max\u0026auto=format\u0026n=mTDCZgW2I2SWs-UB\u0026q=85\u0026s=ccb4d8c65c27b826c24b21c2c40eece6","dark":"https://mintcdn.com/autosana/mTDCZgW2I2SWs-UB/logo/dark.svg?fit=max\u0026auto=format\u0026n=mTDCZgW2I2SWs-UB\u0026q=85\u0026s=e7d9ad801e878c55ff81cab43ea6b42a","href":"https://docs.autosana.ai"},"favicon":"https://mintcdn.com/autosana/tfnV7RyCfUuC94qX/logo/favicon.png?fit=max\u0026auto=format\u0026n=tfnV7RyCfUuC94qX\u0026q=85\u0026s=0010a2d74f105f6ba6f6c6fd0ba85b6c","styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"autosana","hasAudioNarration":false,"actualSubdomain":"autosana","customDomains":["docs.autosana.ai"],"gitSource":{"type":"github","owner":"autosana","repo":"autosanadashboard","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae66873149aa82e62104cdb","collectionId":"512b986e-957a-4fc9-97e7-f5e569ae17a1","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae66873149aa82e62104cdb"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae68259149aa82e621074cc","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Core Features","count":12},{"language":"default","tag":"APIs","count":11},{"language":"default","tag":"Integrations","count":11},{"language":"default","tag":"Getting Started","count":7},{"language":"default","tag":"Code-Managed Flows","count":6},{"language":"default","tag":"Uploading Your App","count":5},{"language":"default","tag":"Guides","count":5},{"language":"default","tag":"Best Practices","count":2}]},"assistantConfig":{"enableStarterQuestions":false},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"app-build-guide","slug":"/app-build-guide","pageMetadata":{"title":"Building Your Mobile App for Our Cloud","description":"Step-by-step guide to building your mobile app for our virtual device cloud","href":"/app-build-guide"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Step-by-step guide to building your mobile app for our virtual device cloud\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,hr:`hr`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Info,Note,Tab,Table,Tabs,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Testing a website?`}),` You don’t need to build anything - just enter your URL when creating an app. This guide is for mobile apps (iOS and Android) only.`]})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Add our `,_jsx(_components.a,{href:`/mcp-setup`,children:`MCP Server`}),` to help you build your app for our cloud.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`build-requirements`,children:`Build Requirements`}),`\n`,_jsxs(_components.p,{children:[`Autosana runs your mobile apps on both our `,_jsx(_components.strong,{children:`virtual device cloud`}),` (iOS Simulators and Android Emulators) and `,_jsx(_components.strong,{children:_jsx(_components.a,{href:`/real-device-testing`,children:`real devices in the cloud`})}),`. The build you upload decides where it can run:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Platform`}),_jsx(_components.th,{children:`Build`}),_jsx(_components.th,{children:`Runs on`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`iOS`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`.app`}),` (compressed as `,_jsx(_components.code,{children:`.zip`}),`)`]}),_jsx(_components.td,{children:`Simulator only`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`iOS`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`.ipa`})}),_jsx(_components.td,{children:`Real devices only`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Android`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`.apk`})}),_jsxs(_components.td,{children:[`Emulators `,_jsx(_components.strong,{children:`and`}),` real devices`]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`ios-builds`,children:`iOS Builds`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Simulator`}),` — a `,_jsx(_components.code,{children:`.app`}),` bundle compressed as `,_jsx(_components.code,{children:`.zip`}),`, built for the simulator SDK (`,_jsx(_components.code,{children:`arm64`}),`). Cheapest and fastest; covers most testing.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Real device`}),` — a `,_jsx(_components.code,{children:`.ipa`}),` built for physical hardware (`,_jsx(_components.code,{children:`iphoneos`}),`). Required for `,_jsx(_components.a,{href:`/real-device-testing`,children:`real-device testing`}),`.`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Building on an M1+ Mac will use `,_jsx(_components.code,{children:`arm64`}),` by default. Intel Macs will produce `,_jsx(_components.code,{children:`x86_64`}),` builds, which won’t work on our simulators.`]})}),`\n`,_jsxs(_components.p,{children:[`The simulator (`,_jsx(_components.code,{children:`.app`}),`) build steps are below; jump to `,_jsx(_components.a,{href:`#real-device-builds-ipa`,children:`Real device builds`}),` for `,_jsx(_components.code,{children:`.ipa`}),`.`]}),`\n`,_jsx(Heading,{level:`4`,id:`app-clips`,children:`App Clips`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A simulator build of your full app already contains its App Clip, in `,_jsx(_components.code,{children:`YourApp.app/AppClips/`}),`. Upload the full app as usual.`]}),`\n`,_jsxs(_components.li,{children:[`You can also upload an App Clip on its own: an `,_jsx(_components.code,{children:`.app`}),` whose `,_jsx(_components.code,{children:`Info.plist`}),` contains `,_jsx(_components.code,{children:`NSAppClip`}),`, built for the simulator and zipped like any other `,_jsx(_components.code,{children:`.app`}),`. This is a valid upload.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/guides-app-clips`,children:`Testing App Clips`}),` to open the App Clip in a test.`]}),`\n`,_jsx(Heading,{level:`3`,id:`android-builds`,children:`Android Builds`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Format`}),`: `,_jsx(_components.code,{children:`.apk`}),` (Android App Bundles, `,_jsx(_components.code,{children:`.aab`}),`, are not supported)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Architecture`}),`: a `,_jsx(_components.strong,{children:`universal`}),` APK (recommended) runs on both emulators and real devices. An `,_jsx(_components.code,{children:`x86_64`}),`-only APK runs on emulators but not real devices.`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Most build commands create universal APKs that include all architectures by default, so the same Android build works on both emulators and real devices — no separate build needed.`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(_components.p,{children:`Select your framework to see build instructions:`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`React Native`,icon:`react`,id:`react-native`,\"data-child-heading-ids\":`[\"react-native-ios\",\"react-native-with-expo-ios\",\"react-native-android\",\"react-native-with-expo-android\"]`,children:[_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Important:`}),` React Native apps must be built in Release mode. Debug builds will attempt to connect to Metro bundler and fail to run on the device. Release builds bundle the JavaScript code directly into the app, making them standalone.`]})}),_jsx(Heading,{level:`2`,id:`react-native-ios`,children:`React Native (iOS)`}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Build it with:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` react-native`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run-ios`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --mode`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Release`})]}),`\n`]})})}),_jsxs(_components.ol,{start:`2`,children:[`\n`,_jsx(_components.li,{children:`App file should be here:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`ios/build/Build/Products/Release-iphonesimulator/[YourApp].app`})}),`\n`]})})}),_jsx(Note,{children:_jsxs(_components.p,{children:[`In macOS, it should just be `,_jsx(_components.code,{children:`YourApp`}),` because macOS hides `,_jsx(_components.code,{children:`.app`}),` extensions`]})}),_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsxs(_components.li,{children:[`Go to Finder, compress `,_jsx(_components.code,{children:`YourApp`}),` to a `,_jsx(_components.code,{children:`.zip`}),` and upload/drag it into the Autosana app upload dialog`]}),`\n`]}),_jsx(Heading,{level:`3`,id:`react-native-with-expo-ios`,children:`React Native with Expo (iOS)`}),_jsx(_components.p,{children:`For Expo projects, use EAS Build to create simulator builds:`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Add this profile to your `,_jsx(_components.code,{children:`eas.json`}),`:`]}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"build\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"autosana-simulator\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"distribution\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"internal\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"ios\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"simulator\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsxs(_components.ol,{start:`2`,children:[`\n`,_jsx(_components.li,{children:`Run the build command:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`eas`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --platform`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ios`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --profile`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` autosana-simulator`})]}),`\n`]})})}),_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsx(_components.li,{children:`Once the build completes, EAS will provide a download URL for the build`}),`\n`,_jsxs(_components.li,{children:[`Download and extract it to get the `,_jsx(_components.code,{children:`.app`}),` file`]}),`\n`,_jsxs(_components.li,{children:[`Compress the `,_jsx(_components.code,{children:`.app`}),` to a `,_jsx(_components.code,{children:`.zip`}),` and upload it to Autosana`]}),`\n`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`This profile only creates a Simulator artifact; it does not enable APNs. If\nthe app uses `,_jsx(_components.code,{children:`expo-notifications`}),`, add its config plugin. During Expo Prebuild\nor Continuous Native Generation, that plugin adds\n`,_jsx(_components.code,{children:`aps-environment=development`}),` to the iOS app. If the app does not use\n`,_jsx(_components.code,{children:`expo-notifications`}),`, declare the entitlement under `,_jsx(_components.code,{children:`ios.entitlements`}),` or\nconfigure it in the native Xcode project. Follow `,_jsx(_components.a,{href:`/guides-push-notifications#configure-an-expo-eas-build`,children:`Testing Push Notifications:\nConfigure an Expo EAS\nbuild`}),`.`]})}),_jsx(Heading,{level:`2`,id:`react-native-android`,children:`React Native (Android)`}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Navigate to your Android directory and build the release APK:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`cd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` android`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`./gradlew`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` assembleRelease`})]}),`\n`]})})}),_jsxs(_components.ol,{start:`2`,children:[`\n`,_jsx(_components.li,{children:`The APK will be located at:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`android/app/build/outputs/apk/release/app-release.apk`})}),`\n`]})})}),_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsxs(_components.li,{children:[`Upload the `,_jsx(_components.code,{children:`.apk`}),` file to Autosana`]}),`\n`]}),_jsx(Heading,{level:`3`,id:`react-native-with-expo-android`,children:`React Native with Expo (Android)`}),_jsx(_components.p,{children:`For Expo projects, use EAS Build to create APK builds:`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Add this profile to your `,_jsx(_components.code,{children:`eas.json`}),`:`]}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"build\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"preview\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"distribution\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"internal\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"channel\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"preview\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"android\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"buildType\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"apk\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsxs(_components.ol,{start:`2`,children:[`\n`,_jsx(_components.li,{children:`Run the build command:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`eas`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --platform`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` android`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --profile`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` preview`})]}),`\n`]})})}),_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsxs(_components.li,{children:[`Once the build completes, EAS will provide a download URL for the `,_jsx(_components.code,{children:`.apk`}),` file`]}),`\n`,_jsx(_components.li,{children:`Download the APK and upload it to Autosana`}),`\n`]})]}),_jsxs(Tab,{title:`Flutter`,icon:`mobile`,id:`flutter`,\"data-child-heading-ids\":`[\"flutter-ios\",\"flutter-android\"]`,children:[_jsx(Heading,{level:`2`,id:`flutter-ios`,children:`Flutter (iOS)`}),_jsx(Note,{children:_jsxs(_components.p,{children:[`This builds a `,_jsx(_components.code,{children:`.app`}),` for the `,_jsx(_components.strong,{children:`simulator`}),`. To test on real iPhones, build a `,_jsx(_components.code,{children:`.ipa`}),` instead — see `,_jsx(_components.a,{href:`#real-device-builds-ipa`,children:`Real device builds`}),`.`]})}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Build the app for simulator:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`flutter`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ios`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --simulator`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`If your app uses flavors, add the `,_jsx(_components.code,{children:`--flavor`}),` flag:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`flutter`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ios`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --simulator`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --flavor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [flavorName]`})]}),`\n`]})})}),_jsxs(_components.ol,{start:`2`,children:[`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.code,{children:`.app`}),` file will be located at:`]}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`build/ios/iphonesimulator/Runner.app`})}),`\n`]})})}),_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsxs(_components.li,{children:[`Compress the `,_jsx(_components.code,{children:`.app`}),` to a `,_jsx(_components.code,{children:`.zip`}),` file`]}),`\n`,_jsxs(_components.li,{children:[`Drag or upload the `,_jsx(_components.code,{children:`.zip`}),` file into the Autosana app upload dialog`]}),`\n`]}),_jsx(Heading,{level:`2`,id:`flutter-android`,children:`Flutter (Android)`}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Build apk in debug mode:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`flutter`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` apk`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --debug`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`If your app uses flavors, add the `,_jsx(_components.code,{children:`--flavor`}),` flag:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`flutter`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` apk`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --debug`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --flavor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [flavorName]`})]}),`\n`]})})}),_jsxs(_components.ol,{start:`2`,children:[`\n`,_jsx(_components.li,{children:`File is located at:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`build/app/outputs/flutter-apk/app-debug.apk`})}),`\n`]})})}),_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsxs(_components.li,{children:[`Drag or upload the `,_jsx(_components.code,{children:`.apk`}),` file into the Autosana app upload dialog`]}),`\n`]})]}),_jsxs(Tab,{title:`Native iOS`,icon:`apple`,id:`native-ios`,\"data-child-heading-ids\":`[\"native-ios-xcode%2Fswiftui\",\"option-1%3A-using-xcode-graphical-interface\",\"option-2a%3A-ordinary-unsigned-simulator-build\",\"option-2b%3A-push-capable-signed-simulator-build\"]`,children:[_jsx(Heading,{level:`2`,id:`native-ios-xcode/swiftui`,children:`Native iOS (Xcode/SwiftUI)`}),_jsx(Heading,{level:`3`,id:`option-1-using-xcode-graphical-interface`,children:`Option 1: Using Xcode (Graphical Interface)`}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Open your project in Xcode`}),`\n`,_jsxs(_components.li,{children:[`At the top of Xcode, set:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The scheme to your app target (e.g., “MyApp”)`}),`\n`,_jsx(_components.li,{children:`The device to a simulator (e.g., “iPhone 16 Pro”)`}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`In Xcode menu, select `,_jsx(_components.strong,{children:`Product > Scheme > Edit Scheme`})]}),`\n`,_jsxs(_components.li,{children:[`Under `,_jsx(_components.strong,{children:`Run`}),`, change `,_jsx(_components.strong,{children:`Build Configuration`}),` to `,_jsx(_components.strong,{children:`Release`})]}),`\n`,_jsxs(_components.li,{children:[`Press `,_jsx(_components.strong,{children:`Command + B`}),` to build the project`]}),`\n`,_jsxs(_components.li,{children:[`After the build finishes, the `,_jsx(_components.code,{children:`.app`}),` file will be located at:`]}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`~`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`/Library/Developer/Xcode/DerivedData/`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`ProjectName`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`/Build/Products/Release-iphonesimulator/`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`AppName`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.app`})]}),`\n`]})})}),_jsxs(_components.ol,{start:`7`,children:[`\n`,_jsx(_components.li,{children:`Right click and open in Finder`}),`\n`,_jsxs(_components.li,{children:[`Right click and compress it to make a `,_jsx(_components.code,{children:`.zip`}),` file`]}),`\n`,_jsxs(_components.li,{children:[`Drag or upload the `,_jsx(_components.code,{children:`.zip`}),` file into the Autosana app upload dialog`]}),`\n`]}),_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Finding the build folder in Finder:`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Open Finder`}),`\n`,_jsxs(_components.li,{children:[`Press `,_jsx(_components.strong,{children:`Command + Shift + G`})]}),`\n`,_jsx(_components.li,{children:`Paste the path and press Enter`}),`\n`]})]}),_jsx(Heading,{level:`3`,id:`option-2a-ordinary-unsigned-simulator-build`,children:`Option 2A: Ordinary unsigned Simulator build`}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Open Terminal and navigate to the root of your Xcode project:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`cd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /path/to/your/project`})]}),`\n`]})})}),_jsxs(_components.ol,{start:`2`,children:[`\n`,_jsx(_components.li,{children:`Run this command to build the Release version for simulator:`}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`xcodebuild`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -scheme`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` YourAppScheme`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -sdk`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` iphonesimulator`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -configuration`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Release`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -destination`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'platform=iOS Simulator,OS=latest,name=iPhone 16 Pro'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -derivedDataPath`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./build`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ARCHS=arm64`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ONLY_ACTIVE_ARCH=NO`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` CODE_SIGN_IDENTITY=\"\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` CODE_SIGNING_REQUIRED=NO`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` CODE_SIGNING_ALLOWED=NO`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`})}),`\n`]})})}),_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsxs(_components.li,{children:[`After the build completes, your `,_jsx(_components.code,{children:`.app`}),` file will be located:`]}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`./build/Build/Products/Release-iphonesimulator/YourAppName.app`})}),`\n`]})})}),_jsxs(_components.ol,{start:`4`,children:[`\n`,_jsx(_components.li,{children:`Right click and open in Finder`}),`\n`,_jsxs(_components.li,{children:[`Right click and compress it to make a `,_jsx(_components.code,{children:`.zip`}),` file`]}),`\n`,_jsxs(_components.li,{children:[`Drag or upload the `,_jsx(_components.code,{children:`.zip`}),` file into the Autosana app upload dialog`]}),`\n`]}),_jsx(Warning,{children:_jsx(_components.p,{children:`This recipe explicitly disables signing. It cannot be used for APNs push\nnotification testing or any feature that requires a signed entitlement.`})}),_jsx(Heading,{level:`3`,id:`option-2b-push-capable-signed-simulator-build`,children:`Option 2B: Push-capable signed Simulator build`}),_jsxs(_components.p,{children:[`First enable `,_jsx(_components.strong,{children:`Push Notifications`}),` for the app target under `,_jsx(_components.strong,{children:`Signing \u0026 Capabilities`}),` in Xcode. Then build without the settings that disable signing:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`xcodebuild`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -scheme`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` YourAppScheme`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -sdk`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` iphonesimulator`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -configuration`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Release`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -destination`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'platform=iOS Simulator,OS=latest,name=iPhone 16 Pro'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -derivedDataPath`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./build`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ARCHS=arm64`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ONLY_ACTIVE_ARCH=NO`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`})}),`\n`]})})}),_jsxs(_components.p,{children:[`The signed `,_jsx(_components.code,{children:`.app`}),` is located at:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`./build/Build/Products/Release-iphonesimulator/YourAppName.app`})}),`\n`]})})}),_jsx(_components.p,{children:`Before compressing it, confirm that the signed entitlements contain the APNs development environment:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`codesign`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --entitlements`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` :-`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./build/Build/Products/Release-iphonesimulator/YourAppName.app`})}),`\n`]})})}),_jsxs(_components.p,{children:[`The output must contain `,_jsx(_components.code,{children:`aps-environment`}),` with the value `,_jsx(_components.code,{children:`development`}),`. Then run the complete architecture, entitlement, and bundle-ID preflight in `,_jsx(_components.a,{href:`/guides-push-notifications#verify-the-simulator-artifact`,children:`Testing Push Notifications`}),`, compress the `,_jsx(_components.code,{children:`.app`}),`, and upload the resulting `,_jsx(_components.code,{children:`.zip`}),`.`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Why Release configuration?`}),` Release builds provide production parity with\noptimizations enabled, matching what your users experience. Debug builds work,\nbut they are not recommended because they do not reflect the production\nenvironment.`]})})]}),_jsxs(Tab,{title:`Native Android`,icon:`android`,id:`native-android`,\"data-child-heading-ids\":`[\"native-android-kotlin%2Fjava\",\"option-1%3A-debug-build-recommended-for-quick-testing\",\"option-2%3A-release-build-production-parity\"]`,children:[_jsx(Heading,{level:`2`,id:`native-android-kotlin/java`,children:`Native Android (Kotlin/Java)`}),_jsx(Heading,{level:`3`,id:`option-1-debug-build-recommended-for-quick-testing`,children:`Option 1: Debug Build (Recommended for Quick Testing)`}),_jsx(_components.p,{children:`Debug builds work immediately without any signing configuration.`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Using Android Studio:`})}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Open your project in Android Studio`}),`\n`,_jsxs(_components.li,{children:[`From the menu bar, select `,_jsx(_components.strong,{children:`Build > Build Bundle(s) / APK(s) > Build APK(s)`})]}),`\n`,_jsx(_components.li,{children:`Wait for the build to complete`}),`\n`,_jsxs(_components.li,{children:[`Click on `,_jsx(_components.strong,{children:`locate`}),` in the notification that appears, or navigate to:`]}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`app/build/outputs/apk/debug/app-debug.apk`})}),`\n`]})})}),_jsxs(_components.ol,{start:`5`,children:[`\n`,_jsxs(_components.li,{children:[`Upload the `,_jsx(_components.code,{children:`.apk`}),` file to Autosana`]}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Using Terminal:`})}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`cd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /path/to/your/android/project`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`./gradlew`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` assembleDebug`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`APK location: `,_jsx(_components.code,{children:`app/build/outputs/apk/debug/app-debug.apk`})]}),_jsx(Heading,{level:`3`,id:`option-2-release-build-production-parity`,children:`Option 2: Release Build (Production Parity)`}),_jsx(_components.p,{children:`Release builds provide better production parity but require signing configuration.`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Step 1: Configure Signing (if not already set up)`})}),_jsxs(_components.p,{children:[`Add this to your `,_jsx(_components.code,{children:`app/build.gradle`}),`:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`android {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` buildTypes {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` release {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` // Use debug keystore for testing (not for Play Store)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` signingConfig signingConfigs.debug`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` minifyEnabled false`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsx(Note,{children:_jsx(_components.p,{children:`This uses the debug keystore for convenience. For Play Store releases, you’ll need a proper release keystore.`})}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Step 2: Build the Release APK`})}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Using Terminal:`})}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`cd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /path/to/your/android/project`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`./gradlew`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` assembleRelease`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`APK location: `,_jsx(_components.code,{children:`app/build/outputs/apk/release/app-release.apk`})]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Using Android Studio:`})}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Open your project in Android Studio`}),`\n`,_jsxs(_components.li,{children:[`From the menu bar, select `,_jsx(_components.strong,{children:`Build > Select Build Variant`})]}),`\n`,_jsx(_components.li,{children:`Change from “debug” to “release”`}),`\n`,_jsxs(_components.li,{children:[`Select `,_jsx(_components.strong,{children:`Build > Build Bundle(s) / APK(s) > Build APK(s)`})]}),`\n`]}),_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Which should I use?`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Debug`}),`: Faster builds, works immediately, easier debugging`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Release`}),`: Production-like optimizations, catches minification issues`]}),`\n`]})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsxs(Heading,{level:`2`,id:`real-device-builds-ipa`,children:[`Real device builds (`,_jsx(_components.code,{children:`.ipa`}),`)`]}),`\n`,_jsxs(_components.p,{children:[`To run on `,_jsx(_components.a,{href:`/real-device-testing`,children:`real iPhones`}),` instead of the simulator, upload an `,_jsx(_components.strong,{children:_jsx(_components.code,{children:`.ipa`})}),` built for physical hardware (`,_jsx(_components.code,{children:`iphoneos`}),`) — not a zipped `,_jsx(_components.code,{children:`.app`}),`. The file extension is how we route the build: `,_jsx(_components.code,{children:`.ipa`}),` → real device, `,_jsx(_components.code,{children:`.app`}),` / `,_jsx(_components.code,{children:`.zip`}),` → simulator.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Signing matters.`}),` Use a `,_jsx(_components.strong,{children:`Development`}),` or `,_jsx(_components.strong,{children:`Ad Hoc`}),` signed `,_jsx(_components.code,{children:`.ipa`}),`. You do `,_jsx(_components.strong,{children:`not`}),` need to register our device UDIDs — builds are automatically re-signed for the test device. Enterprise-signed builds fail to launch on our devices, and App Store builds aren’t supported. Re-signing strips some entitlements (e.g. Push Notifications, Apple Pay, App Groups), so features depending on them won’t work during tests.`]})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`If re-signing breaks Team-ID-prefixed Keychain access groups, expand `,_jsx(_components.strong,{children:`Advanced`}),` during IPA upload and enable `,_jsx(_components.strong,{children:`Fix Keychain access after re-signing`}),`. Most apps do not need this option.`]})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`Android needs no separate build — a universal `,_jsx(_components.code,{children:`.apk`}),` already runs on both emulators and real devices.`]})}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`React Native (Expo)`,icon:`react`,id:`react-native-expo`,children:[_jsxs(_components.p,{children:[`Use an EAS profile with internal distribution — note there is `,_jsx(_components.strong,{children:`no`}),` `,_jsx(_components.code,{children:`simulator: true`}),`:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"build\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"device\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"distribution\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"internal\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`eas`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --platform`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ios`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --profile`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` device`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`EAS provides a download URL for the `,_jsx(_components.code,{children:`.ipa`}),`. Upload that file to Autosana.`]})]}),_jsxs(Tab,{title:`Flutter`,icon:`mobile`,id:`flutter-2`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`flutter`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ipa`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --export-method`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` development`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`(The default export method is `,_jsx(_components.code,{children:`app-store`}),`, which won’t launch on our devices.)`]}),_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`.ipa`}),` is written to:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`build/ios/ipa/[YourApp].ipa`})}),`\n`]})})}),_jsxs(_components.p,{children:[`Upload that `,_jsx(_components.code,{children:`.ipa`}),` to Autosana.`]})]}),_jsxs(Tab,{title:`Native iOS / bare React Native`,icon:`apple`,id:`native-ios-%2F-bare-react-native`,children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Using Xcode:`})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Set the run destination to `,_jsx(_components.strong,{children:`Any iOS Device`}),` (not a simulator)`]}),`\n`,_jsx(_components.li,{children:_jsx(_components.strong,{children:`Product > Archive`})}),`\n`,_jsxs(_components.li,{children:[`In the Organizer, click `,_jsx(_components.strong,{children:`Distribute App`}),` and choose `,_jsx(_components.strong,{children:`Debugging`}),` (development) or `,_jsx(_components.strong,{children:`Release Testing`}),` (ad hoc) — not Enterprise or App Store Connect`]}),`\n`,_jsxs(_components.li,{children:[`Upload the exported `,_jsx(_components.code,{children:`.ipa`}),` to Autosana`]}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Using Terminal:`})}),_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`10`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`xcodebuild`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -scheme`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` YourAppScheme`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -sdk`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` iphoneos`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -configuration`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Release`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -archivePath`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./build/YourApp.xcarchive`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` archive`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`xcodebuild`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -exportArchive`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -archivePath`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./build/YourApp.xcarchive`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -exportPath`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./build/ipa`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -exportOptionsPlist`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ExportOptions.plist`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`ExportOptions.plist`}),` setting the signing method to `,_jsx(_components.code,{children:`debugging`}),` (or `,_jsx(_components.code,{children:`release-testing`}),`):`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`xml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`xml`,children:_jsxs(_components.code,{language:`xml`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`xml`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:` version`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"1.0\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:` encoding`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"UTF-8\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`?>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c!`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`DOCTYPE`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` plist`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`plist`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:` version`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"1.0\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`dict`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`key`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`method`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c/`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`key`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`debugging`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c/`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c/`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`dict`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c/`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`plist`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`.ipa`}),` lands in `,_jsx(_components.code,{children:`./build/ipa/`}),`. Upload it to Autosana.`]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`After uploading your `,_jsx(_components.code,{children:`.ipa`}),`, start a run with `,_jsx(_components.strong,{children:`Target: Real device`}),` (or `,_jsx(_components.code,{children:`device.physical: true`}),` via the API). See `,_jsx(_components.a,{href:`/real-device-testing`,children:`Real Device Testing`}),` for how to run and pick a device.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Building Your Mobile App for Our Cloud","description":"Step-by-step guide to building your mobile app for our virtual device cloud","href":"/app-build-guide"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Build Requirements","slug":"build-requirements","depth":2,"children":[{"title":"iOS Builds","slug":"ios-builds","depth":3,"children":[]},{"title":"App Clips","slug":"app-clips","depth":4,"children":[]},{"title":"Android Builds","slug":"android-builds","depth":3,"children":[]}]},{"title":"React Native (iOS)","slug":"react-native-ios","depth":2,"children":[{"title":"React Native with Expo (iOS)","slug":"react-native-with-expo-ios","depth":3,"children":[],"tabId":"react-native"}],"tabId":"react-native"},{"title":"React Native (Android)","slug":"react-native-android","depth":2,"children":[{"title":"React Native with Expo (Android)","slug":"react-native-with-expo-android","depth":3,"children":[],"tabId":"react-native"}],"tabId":"react-native"},{"title":"Flutter (iOS)","slug":"flutter-ios","depth":2,"children":[],"tabId":"flutter"},{"title":"Flutter (Android)","slug":"flutter-android","depth":2,"children":[],"tabId":"flutter"},{"title":"Native iOS (Xcode/SwiftUI)","slug":"native-ios-xcode/swiftui","depth":2,"children":[{"title":"Option 1: Using Xcode (Graphical Interface)","slug":"option-1-using-xcode-graphical-interface","depth":3,"children":[],"tabId":"native-ios"},{"title":"Option 2A: Ordinary unsigned Simulator build","slug":"option-2a-ordinary-unsigned-simulator-build","depth":3,"children":[],"tabId":"native-ios"},{"title":"Option 2B: Push-capable signed Simulator build","slug":"option-2b-push-capable-signed-simulator-build","depth":3,"children":[],"tabId":"native-ios"}],"tabId":"native-ios"},{"title":"Native Android (Kotlin/Java)","slug":"native-android-kotlin/java","depth":2,"children":[{"title":"Option 1: Debug Build (Recommended for Quick Testing)","slug":"option-1-debug-build-recommended-for-quick-testing","depth":3,"children":[],"tabId":"native-android"},{"title":"Option 2: Release Build (Production Parity)","slug":"option-2-release-build-production-parity","depth":3,"children":[],"tabId":"native-android"}],"tabId":"native-android"},{"title":"Real device builds (.ipa)","slug":"real-device-builds-ipa","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"autosana","siteName":"Autosana","title":"Building Your Mobile App for Our Cloud - Autosana","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-27T04:56:48.650Z","originalFileLocation":"app-build-guide.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Step-by-step guide to building your mobile app for our virtual device cloud\">\u003cmeta data-mint-head name=\"application-name\" content=\"Autosana\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/autosana/uGhYB-g6Mqq-UAaf/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/autosana/uGhYB-g6Mqq-UAaf/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/autosana/uGhYB-g6Mqq-UAaf/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/autosana/uGhYB-g6Mqq-UAaf/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/autosana/uGhYB-g6Mqq-UAaf/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/autosana/uGhYB-g6Mqq-UAaf/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/autosana/uGhYB-g6Mqq-UAaf/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/autosana/uGhYB-g6Mqq-UAaf/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/autosana/uGhYB-g6Mqq-UAaf/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Building Your Mobile App for Our Cloud - Autosana\">\u003cmeta data-mint-head property=\"og:description\" content=\"Step-by-step guide to building your mobile app for our virtual device cloud\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Autosana\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.autosana.ai/app-build-guide\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://autosana.mintlify.app/_mintlify/api/og/v2?division=Uploading+Your+App\u0026amp;title=Building+Your+Mobile+App+for+Our+Cloud\u0026amp;description=Step-by-step+guide+to+building+your+mobile+app+for+our+virtual+device+cloud\u0026amp;theme=585caf19b96d6b7f19feb974\u0026amp;signature=7b95cce0b058ee9f1148d9d40e364c9293cf958053c73555e363526bbb0bd2c4\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Building Your Mobile App for Our Cloud - Autosana\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Step-by-step guide to building your mobile app for our virtual device cloud\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://autosana.mintlify.app/_mintlify/api/og/v2?division=Uploading+Your+App\u0026amp;title=Building+Your+Mobile+App+for+Our+Cloud\u0026amp;description=Step-by-step+guide+to+building+your+mobile+app+for+our+virtual+device+cloud\u0026amp;theme=585caf19b96d6b7f19feb974\u0026amp;signature=7b95cce0b058ee9f1148d9d40e364c9293cf958053c73555e363526bbb0bd2c4\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/autosana/uGhYB-g6Mqq-UAaf/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Autosana\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0D9373\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.autosana.ai/app-build-guide\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/app-build-guide.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.autosana.ai/#organization\",\"name\":\"Autosana\",\"url\":\"https://docs.autosana.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/autosana/mTDCZgW2I2SWs-UB/logo/light.svg?fit=max\u0026auto=format\u0026n=mTDCZgW2I2SWs-UB\u0026q=85\u0026s=ccb4d8c65c27b826c24b21c2c40eece6\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.autosana.ai#website\",\"name\":\"Autosana\",\"url\":\"https://docs.autosana.ai\",\"publisher\":{\"@id\":\"https://docs.autosana.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.autosana.ai/app-build-guide#webpage\",\"url\":\"https://docs.autosana.ai/app-build-guide\",\"name\":\"Building Your Mobile App for Our Cloud\",\"description\":\"Step-by-step guide to building your mobile app for our virtual device cloud\",\"dateModified\":\"2026-10-27T04:56:48.650Z\",\"isPartOf\":{\"@id\":\"https://docs.autosana.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.autosana.ai/app-build-guide#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.autosana.ai/app-build-guide#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Uploading Your App\",\"item\":\"https://docs.autosana.ai/bundle-id\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building Your Mobile App for Our Cloud\",\"item\":\"https://docs.autosana.ai/app-build-guide\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.autosana.ai/app-build-guide#article\",\"headline\":\"Building Your Mobile App for Our Cloud\",\"name\":\"Building Your Mobile App for Our Cloud\",\"description\":\"Step-by-step guide to building your mobile app for our virtual device cloud\",\"url\":\"https://docs.autosana.ai/app-build-guide\",\"mainEntityOfPage\":{\"@id\":\"https://docs.autosana.ai/app-build-guide#webpage\"},\"dateModified\":\"2026-10-27T04:56:48.650Z\",\"publisher\":{\"@id\":\"https://docs.autosana.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.autosana.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Autosana\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Autosana","nav":{"global":null,"groups":[{"group":"Getting Started","pages":[{"title":"Intro(doc)tion","href":"/introduction"},{"title":"Quickstart","href":"/quickstart"},{"title":"Web Testing","href":"/web-testing"},{"title":"Mobile Testing","href":"/real-device-testing"},{"title":"MCP Server","href":"/mcp-setup"},{"title":"Install the CLI","href":"/install-cli"},{"title":"Local Testing","href":"/local-testing"}]},{"group":"Core Features","pages":[{"title":"Apps","href":"/apps"},{"title":"Flows","href":"/flows"},{"title":"Suites","href":"/suites"},{"title":"Automations","href":"/automations"},{"title":"Hooks","href":"/hooks"},{"title":"Environments","href":"/environments"},{"title":"Variables","href":"/variables"},{"title":"Notifications","href":"/notifications"},{"title":"Performance Monitoring","href":"/performance-monitoring"},{"title":"Network Traffic","href":"/network-traffic"},{"title":"Issues","href":"/issues"},{"title":"Team","href":"/team"}]},{"group":"Best Practices","pages":[{"title":"Writing Effective Flow Instructions","href":"/writing-effective-flow-instructions"},{"title":"Making Suites, Parallelizable, Isolated, and Repeatable","href":"/guides-parallelizable-isolated-tests"}]},{"group":"Code-Managed Flows","pages":[{"title":"Code-Managed Flows","sidebarTitle":"Overview","href":"/code-managed-flows"},{"title":"Files \u0026 Schema","href":"/code-managed-files"},{"title":"Running from the CLI","sidebarTitle":"Running from the CLI","href":"/code-managed-cli"},{"title":"Validation, Syncing \u0026 Pull Requests","sidebarTitle":"Syncing \u0026 Pull Requests","href":"/code-managed-sync"},{"title":"GitLab CI","sidebarTitle":"GitLab CI","href":"/gitlab-ci"},{"title":"Migrating Existing Flows","sidebarTitle":"Migrating","href":"/code-managed-migrate"}]},{"group":"Guides","pages":[{"title":"Multi-Device Testing","href":"/multi-device-testing"},{"title":"Testing Push Notifications","href":"/guides-push-notifications"},{"title":"Testing In-App Purchases","href":"/guides-in-app-purchases"},{"title":"Testing One-time Passwords (OTP)","href":"/guides-otp-testing"},{"title":"Testing App Clips","href":"/guides-app-clips"}]},{"group":"Integrations","pages":[{"title":"GitHub Bot","href":"/github-integration"},{"title":"Code Review","href":"/code-review"},{"title":"Jira Cloud","href":"/jira-integration"},{"title":"Linear Tickets","href":"/linear-integration"},{"title":"Slack Notifications","href":"/slack-integration"},{"title":"Grok Bot","href":"/grok-bot"},{"title":"Devin","href":"/devin"},{"title":"Dots","href":"/dots"},{"title":"Hermes Agent","href":"/hermes-agent"},{"title":"Webhooks","href":"/webhooks"},{"title":"Tailscale","href":"/private-network"}]},{"group":"Uploading Your App","pages":[{"title":"Finding Your Bundle ID","description":"Learn how to find your Bundle ID for iOS and Application ID for Android","href":"/bundle-id"},{"title":"Building Your Mobile App for Our Cloud","href":"/app-build-guide"},{"title":"Upload a Build","description":"Send a build from your computer to Autosana","href":"/upload-build"},{"title":"Github Action for App Uploads","href":"/ci-cd-integration"},{"title":"Run Location","href":"/run-location"}]},{"group":"APIs","pages":[{"title":"API Reference","href":"/api-reference"},{"title":"Apps API","href":"/api-apps"},{"title":"Suites \u0026 Flows API","href":"/api-suites-flows"},{"title":"Labels API","href":"/api-labels"},{"title":"Runs API","href":"/api-runs"},{"title":"Hooks API","href":"/api-hooks"},{"title":"Environment Variables API","href":"/api-env-vars"},{"title":"Members API","href":"/api-members"},{"title":"Usage API","href":"/api-usage"},{"title":"App Build Upload API","href":"/api-ci"},{"title":"Network Allowlist","href":"/network-allowlist"}]}]},"basePath":"","title":"Building Your Mobile App for Our Cloud - Autosana","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}