Skip to main content
ProductsDesktop toolsTASTECADDrawing reviewTASTEFILESFile managementTASTEFTPFile transferTASTESSHRemote workspaceTASTEZIPCompression and extractionDeveloper toolsTASTECODERust integrated development environmentTASTESTUDIOIntegrated development and test environmentTASTEETLData integration (ETL)ServersTASTEREMOTERemote desktop serverTASTEGEOGeospatial serverTASTEMAILMail workspaceGet startedDownloadsDocumentationBuyAll products
Marketplace
News
TechNewsToday's dev newsDeveloper docsProgramming languagesRustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDartWeb front-end frameworksNext.jsReactVue.js · NuxtSvelteKitAngularServer frameworksSpring BootDjangoFastAPIASP.NET CoreNestJS · ExpressApp & desktop frameworksTauriFlutterReact NativeElectronAlgorithmsAlgorithm basicsCore algorithmsAdvanced algorithmsPractical algorithms
CommunityProjectsDevelopment logsPromptsAI tool issuesShowcaseCommunity guide
Work with usTech transferWebsite buildDesktop app buildRelease and payment pipelineSales partnerContact
ServicesRemote desktopCustom installer packages
TASTEDEV
Products

Desktop tools

TASTECADComplex drawings, opened with easeTASTEFILESJust the files you need, as fast as possibleTASTEFTPThe tidiest path for your filesTASTESSHA stronger link between you and your serversTASTEZIPPack faster, unpack safer

Developer tools

TASTECODEEdit, build, debug and test Rust apps in one windowTASTESTUDIOFrom editing to remote tests and approved AI fixesTASTEETLMove data while you watch the values

Servers

TASTEREMOTEA remote desktop you run on your own serverTASTEGEORebuilding a GeoServer-compatible geospatial server in RustTASTEMAILTake back control of your email

Get started

DownloadsLatest builds of every productDocsHow to use each productBuySubscriptions and perpetual licencesAll productsEvery product at a glance
All products
MarketplaceNews
Tech

News

Today's dev newsOfficial announcements on languages, frameworks, GitHub and AIDeveloper docsGuides to languages, frameworks and algorithms

Programming languages

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

Frameworks

Web front-end frameworksNext.jsReactVue.js · NuxtSvelteKitAngular
Server frameworksSpring BootDjangoFastAPIASP.NET CoreNestJS · Express
App & desktop frameworksTauriFlutterReact NativeElectron

Algorithms

Algorithm basicsComplexity analysis · Sorting · Searching · Basic data structures · Trees and heapsCore algorithmsGraph traversal · Shortest paths & minimum spanning trees · Dynamic programming · Greedy algorithms · Divide and conquer · BacktrackingAdvanced algorithmsString algorithms · Math and number theory · Bit manipulation · Segment trees · Union-findPractical algorithmsCoding interview strategy · LRU cache · Rate limiting · Consistent hashing
All development docs
Community
ProjectsDiscover builders and their workDevelopment logsDecisions and lessons learnedPromptsReusable instructionsAI tool issuesProblems and workarounds for Claude, Codex, GeminiShowcaseFinished resultsCommunity guideHow we build in the open
Work with us
Tech transferNative apps in Rust and eguiWebsite build10 languages, accounts, docs and downloadsDesktop app buildRust and egui, no WebViewRelease and payment pipelineSigning, MSI, deb, rpm, AppImage, hashesSales partnerRecommend us and earn 30%ContactBuilds, partnerships and investment
Services
Remote desktopReach your computer from a browserCustom installer packagesOnly the features you need, settings preloaded
Buy
EN
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
Log in
Log in
TASTEDEV

From small tools to better development.

support@tastedev.netSupport TASTEDEV
ProductsProduct lineupBuyDocsDownloadsMarketplaceSupport
CommunityProjectsDevelopment logsPromptsAI tool issuesShowcase
PoliciesPrivacy policyTerms of serviceSubscription termsRefund policyCommunity guidelines
AccountLog inSign up
Visitors
Today
012345678901234567890123456789012345678901234567890123456789
Yesterday
012345678901234567890123456789012345678901234567890123456789
Total views
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
Company
GXSOFT
Representative
CHOI YOUNG GU
Business registration number
853-44-00368
Address
9F V24, 351 Gyeongin-ro, Michuhol-gu, Incheon, Republic of Korea
Phone
+82-10-4404-1523
Email
whitecalvin@tastedev.net
Privacy officer
CHOI YOUNG GU

© 2026 TASTEDEVProduct information is based on verified development sources.Released · improving

React Native docs
React Native
Getting Started with React NativeProject StructureCore ConceptsData and StateTestingDeployment
Discussions

React Native guide · 6/6

Deployment

Getting a React Native app to users means producing a release build, signing it according to each platform's rules and submitting it to Google Play and the App Store. This chapter covers doing that with Expo's EAS, doing it with the native tools directly, and shipping over-the-air updates.

Before you ship

  • Developer accounts: the App Store requires the Apple Developer Program (annual fee); Google Play requires a Play Console developer account (one-time registration fee).
  • App identifiers: the iOS bundle identifier and the Android package name cannot change once the app is in the store, so choose them carefully.
  • Versions: keep the user-facing version separate from the number that increases with every build (iOS buildNumber, Android versionCode).
{
  "expo": {
    "version": "1.2.0",
    "ios": { "bundleIdentifier": "com.example.myapp", "buildNumber": "12" },
    "android": { "package": "com.example.myapp", "versionCode": 12 }
  }
}

In a release build the JavaScript is bundled ahead of time into the app (as Hermes bytecode) and runs without a dev server. Always try the release build on a real device before submitting.

Building with EAS Build

EAS Build is Expo's cloud build service, and it works with both Expo projects and plain React Native projects. You can build iOS apps without a Mac, and EAS can generate and store your signing keystore, certificates and provisioning profiles.

npm install -g eas-cli
eas login
eas build:configure
eas build --platform android --profile production
eas build --platform ios --profile production

eas build:configure creates eas.json, which holds your build profiles:

{
  "cli": { "appVersionSource": "remote" },
  "build": {
    "development": { "developmentClient": true, "distribution": "internal" },
    "preview": { "distribution": "internal" },
    "production": { "autoIncrement": true }
  },
  "submit": { "production": {} }
}

development produces development builds, preview is for internal testing and production is for store submission; autoIncrement bumps the build number for you. Inspect and manage credentials with eas credentials, and run eas build --local to build on your own machine.

Submitting with EAS Submit

eas submit --platform ios
eas submit --platform android
eas build --platform all --auto-submit

iOS builds are uploaded to App Store Connect, where you can run a TestFlight beta before submitting for review. Android submissions need a Google service account key, and Google Play requires the very first upload to be done manually in the Play Console. Google Play expects an AAB (Android App Bundle), not an APK.

Building with the native tools

To ship a Community CLI project without EAS, use the platform tools directly. On Android, create an upload key and add a signing config to Gradle:

keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
// android/app/build.gradle
android {
    signingConfigs {
        release {
            storeFile file(MYAPP_UPLOAD_STORE_FILE)
            storePassword MYAPP_UPLOAD_STORE_PASSWORD
            keyAlias MYAPP_UPLOAD_KEY_ALIAS
            keyPassword MYAPP_UPLOAD_KEY_PASSWORD
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

Keep the MYAPP_UPLOAD_... values in ~/.gradle/gradle.properties rather than the repository, and back up the keystore safely. Then run ./gradlew bundleRelease in the android folder to produce android/app/build/outputs/bundle/release/app-release.aab. With Play App Signing, Google manages the final app signing key.

On iOS, run Product > Archive in Xcode with the Release configuration and upload from the Organizer to App Store Connect. Signing requires a distribution certificate and provisioning profile from your Apple Developer account.

Over-the-air updates

When only JavaScript and assets such as images change, you can push an update to installed apps without a store review. Expo provides this through expo-updates and EAS Update.

npx expo install expo-updates
eas update:configure
eas update --channel production --message "Fix login screen copy"

Apps download the new update for their channel and apply it on a later launch. Changes to native code or native configuration still need a new store build, and an update is only delivered to builds with a matching runtimeVersion. Updates must also follow store policies, so changes to an app's primary purpose still go through review.

Summary

  • Before shipping, set up developer accounts, bundle identifier and package name, and versions and build numbers.
  • EAS Build and EAS Submit handle signing and store submission in a few commands.
  • Without EAS, use an upload key and bundleRelease on Android, and an Xcode archive on iOS.
  • Ship JavaScript-only fixes quickly with EAS Update.

Official documentation:

  • React Native: Publishing to Google Play Store
  • React Native: Publishing to Apple App Store
  • Expo: EAS Build
  • Expo: EAS Submit
  • Expo: EAS Update
Questions about this chapter?
Previous chapterTesting

0 comments

Top commentsNewest first

Sign in · Sign in to leave a comment.