{"id":8619,"date":"2025-06-26T18:41:47","date_gmt":"2025-06-26T13:11:47","guid":{"rendered":"https:\/\/innovationm.co\/?p=8619"},"modified":"2025-06-26T18:41:47","modified_gmt":"2025-06-26T13:11:47","slug":"react-native-expo-multi-flavors-dev-staging-prod-implementation","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/","title":{"rendered":"How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">Maintaining different environments for development, staging, and production is essential in any large-scale mobile app. In this post, I\u2019ll walk you through how I implemented <strong class=\"mn gx\">multi environment (flavor) support<\/strong>\u00a0in a React Native app built with\u00a0<strong class=\"mn gx\">Expo + EAS<\/strong> \u2014 covering both Android and iOS \u2014 using separate configurations, build schemes, and runtime environment handling.<\/p>\n<h1 id=\"7201\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">\ufe0f Overview<\/h1>\n<p id=\"c980\" class=\"pw-post-body-paragraph ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">We wanted three independent variants of our app:<\/p>\n<ul class=\"\" style=\"text-align: justify;\">\n<li id=\"5882\" class=\"ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\"><strong class=\"mn gx\">Development<\/strong>\u00a0(for internal testing)<\/li>\n<li id=\"bcef\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\"><strong class=\"mn gx\">Staging<\/strong>\u00a0(for UAT and QA)<\/li>\n<li id=\"c74b\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\"><strong class=\"mn gx\">Production<\/strong>\u00a0(live on the stores)<\/li>\n<\/ul>\n<p id=\"23e5\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Each variant had its own:<\/p>\n<ul class=\"\" style=\"text-align: justify;\">\n<li id=\"135e\" class=\"ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">Bundle IDs \/ Package Names<\/li>\n<li id=\"6d40\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">App names<\/li>\n<li id=\"12a9\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">App icons (optional)<\/li>\n<li id=\"c6fc\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">Deep links<\/li>\n<li id=\"2f22\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">Environment-specific variables (API endpoints, tokens, etc.)<\/li>\n<\/ul>\n<h1 id=\"79c6\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">\u2699\ufe0f Project Structure<\/h1>\n<p id=\"97b2\" class=\"pw-post-body-paragraph ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">We used the following files to organize the environment-based configuration:<\/p>\n<ul class=\"\" style=\"text-align: justify;\">\n<li id=\"5e3d\" class=\"ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\"><code class=\"cx pc pd pe pf b\">app.config.ts<\/code>: Dynamic Expo config per environment<\/li>\n<li id=\"4624\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\"><code class=\"cx pc pd pe pf b\">eas.json<\/code>: EAS build profiles for each flavor<\/li>\n<li id=\"a524\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\"><code class=\"cx pc pd pe pf b\">gradle<\/code>\u00a0files: Product flavors and build variants on Android<\/li>\n<li id=\"cd8f\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">Xcode targets +\u00a0<code class=\"cx pc pd pe pf b\">.xcconfig<\/code>\u00a0files for iOS<\/li>\n<li id=\"28ce\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\"><code class=\"cx pc pd pe pf b\">.env<\/code>\u00a0support (if needed, though we kept it inside\u00a0<code class=\"cx pc pd pe pf b\">app.config.ts<\/code>\u00a0via\u00a0<code class=\"cx pc pd pe pf b\">process.env<\/code>)<\/li>\n<\/ul>\n<h1 id=\"598e\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Dynamic\u00a0<code class=\"cx pc pd pe pf b\">app.config.ts<\/code><\/h1>\n<p id=\"087c\" class=\"pw-post-body-paragraph ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">We used a custom\u00a0<code class=\"cx pc pd pe pf b\">app.config.ts<\/code>\u00a0that reads an\u00a0<code class=\"cx pc pd pe pf b\">ENVIRONMENT<\/code>\u00a0variable and configures Expo accordingly.<\/p>\n<pre><span class=\"hljs-keyword\">import<\/span> { <span class=\"hljs-title.class\">ExpoConfig<\/span>, <span class=\"hljs-title.class\">ConfigContext<\/span> } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'expo\/config'<\/span>;\r\n\r\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> ({ config }: <span class=\"hljs-title.class\">ConfigContext<\/span>): <span class=\"hljs-function\"><span class=\"hljs-params\">ExpoConfig<\/span> =&gt;<\/span> {\r\n<span class=\"hljs-keyword\">const<\/span> env = process.<span class=\"hljs-property\">env<\/span>.<span class=\"hljs-property\">ENVIRONMENT<\/span> || <span class=\"hljs-string\">'development'<\/span>;\r\n\r\n<span class=\"hljs-keyword\">const<\/span> flavorSettings = {\r\n<span class=\"hljs-attr\">development<\/span>: {\r\n<span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">'App Dev'<\/span>,\r\n<span class=\"hljs-attr\">slug<\/span>: <span class=\"hljs-string\">'app-dev'<\/span>,\r\n<span class=\"hljs-attr\">androidPackage<\/span>: <span class=\"hljs-string\">'com.example.dev'<\/span>,\r\n<span class=\"hljs-attr\">iosBundleId<\/span>: <span class=\"hljs-string\">'com.example.dev'<\/span>,\r\n},\r\n<span class=\"hljs-attr\">staging<\/span>: {\r\n<span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">'App Staging'<\/span>,\r\n<span class=\"hljs-attr\">slug<\/span>: <span class=\"hljs-string\">'app-staging'<\/span>,\r\n<span class=\"hljs-attr\">androidPackage<\/span>: <span class=\"hljs-string\">'com.example.staging'<\/span>,\r\n<span class=\"hljs-attr\">iosBundleId<\/span>: <span class=\"hljs-string\">'com.example.staging'<\/span>,\r\n},\r\n<span class=\"hljs-attr\">production<\/span>: {\r\n<span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">'App'<\/span>,\r\n<span class=\"hljs-attr\">slug<\/span>: <span class=\"hljs-string\">'app'<\/span>,\r\n<span class=\"hljs-attr\">androidPackage<\/span>: <span class=\"hljs-string\">'com.example'<\/span>,\r\n<span class=\"hljs-attr\">iosBundleId<\/span>: <span class=\"hljs-string\">'com.example'<\/span>,\r\n},\r\n};\r\n\r\n<span class=\"hljs-keyword\">const<\/span> flavor = flavorSettings[env];\r\n\r\n<span class=\"hljs-keyword\">return<\/span> {\r\n...config,\r\n<span class=\"hljs-attr\">name<\/span>: flavor.<span class=\"hljs-property\">name<\/span>,\r\n<span class=\"hljs-attr\">slug<\/span>: flavor.<span class=\"hljs-property\">slug<\/span>,\r\n<span class=\"hljs-attr\">android<\/span>: {\r\n<span class=\"hljs-attr\">package<\/span>: flavor.<span class=\"hljs-property\">androidPackage<\/span>,\r\n},\r\n<span class=\"hljs-attr\">ios<\/span>: {\r\n<span class=\"hljs-attr\">bundleIdentifier<\/span>: flavor.<span class=\"hljs-property\">iosBundleId<\/span>,\r\n},\r\n<span class=\"hljs-attr\">extra<\/span>: {\r\n<span class=\"hljs-attr\">ENVIRONMENT<\/span>: env,\r\n},\r\n};\r\n};<\/pre>\n<h1 id=\"cfe7\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">EAS Build Profiles (<code class=\"cx pc pd pe pf b\">eas.json<\/code>)<\/h1>\n<p id=\"b35e\" class=\"pw-post-body-paragraph ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">We then set up three build profiles in\u00a0<code class=\"cx pc pd pe pf b\">eas.json<\/code>, each passing a custom\u00a0<code class=\"cx pc pd pe pf b\">ENVIRONMENT<\/code>\u00a0and custom gradle commands \/ Xcode schemes:<\/p>\n<pre><span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"build\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"development\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"extends\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"base\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"env\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"ENVIRONMENT\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"development\"<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"android\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"gradleCommand\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\":app:bundleDevelopmentRelease\"<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"ios\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"scheme\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"app-dev\"<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"staging\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"extends\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"base\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"env\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"ENVIRONMENT\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"staging\"<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"android\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"gradleCommand\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\":app:bundleStagingRelease\"<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"ios\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"scheme\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"app-staging\"<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"production\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"extends\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"base\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"env\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"ENVIRONMENT\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"production\"<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"android\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"gradleCommand\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\":app:bundleProductionRelease\"<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"ios\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"scheme\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"app\"<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span><\/pre>\n<div class=\"gp gq gr gs gt\" style=\"text-align: justify;\">\n<div class=\"ac cb\">\n<div class=\"ci bh gb gc gd ge\">\n<p id=\"439c\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" data-selectable-paragraph=\"\">You can also include environment-specific variables like base URLs, API keys, or toggles in the\u00a0<code class=\"cx pc pd pe pf b\">env<\/code>\u00a0block.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ac cb nj nk nl nm\" style=\"text-align: justify;\" role=\"separator\">\n<h1 id=\"f48c\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" data-selectable-paragraph=\"\">Android: Product Flavors<\/h1>\n<p id=\"ac28\" class=\"pw-post-body-paragraph ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni gp bk\" data-selectable-paragraph=\"\">We used\u00a0<strong class=\"mn gx\">product flavors<\/strong>\u00a0in\u00a0<code class=\"cx pc pd pe pf b\">android\/app\/build.gradle<\/code>:<\/p>\n<\/div>\n<pre>flavorDimensions \"default\"\r\n\r\nproductFlavors {\r\ndevelopment {\r\ndimension \"default\"\r\napplicationId \"com.example.dev\"\r\nversionNameSuffix \"-dev\"\r\nresValue \"string\", \"app_name\", \"App Dev\"\r\n}\r\nstaging {\r\ndimension \"default\"\r\napplicationId \"com.example.staging\"\r\nversionNameSuffix \"-staging\"\r\nresValue \"string\", \"app_name\", \"App Staging\"\r\n}\r\nproduction {\r\ndimension \"default\"\r\napplicationId \"com.example\"\r\nresValue \"string\", \"app_name\", \"App\"\r\n}\r\n}<\/pre>\n<p style=\"text-align: justify;\" data-selectable-paragraph=\"\">Each flavor has its own package name, app name, and can have separate resources like\u00a0<code class=\"cx pc pd pe pf b\">strings.xml<\/code>.<\/p>\n<h1 id=\"f2b3\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Android: Manifest-Specific Configurations<\/h1>\n<p id=\"1c51\" class=\"pw-post-body-paragraph ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">To support deep linking and intent filters specific to each flavor, we used\u00a0<strong class=\"mn gx\">different\u00a0<\/strong><code class=\"cx pc pd pe pf b\"><strong class=\"mn gx\">AndroidManifest.xml<\/strong><\/code><strong class=\"mn gx\">\u00a0files per flavor<\/strong>.<\/p>\n<p id=\"41bc\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Create these under:<\/p>\n<pre>android\/app\/src\/development\/AndroidManifest.xml\r\nandroid\/app\/src\/staging\/AndroidManifest.xml\r\nandroid\/app\/src\/production\/AndroidManifest.xml<\/pre>\n<p id=\"546e\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">In each manifest file, configure your deep links or intent filters like so:<\/p>\n<pre class=\"pg ph pi pj pk pl pf pm bp pn bb bk\">&lt;manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"&gt;\r\n\r\n&lt;application&gt;\r\n&lt;activity android:name=\".MainActivity\"&gt;\r\n&lt;!-- Deep link intent specific to this flavor --&gt;\r\n&lt;intent-filter android:autoVerify=\"true\"&gt;\r\n&lt;action android:name=\"android.intent.action.VIEW\" \/&gt;\r\n&lt;category android:name=\"android.intent.category.DEFAULT\" \/&gt;\r\n&lt;category android:name=\"android.intent.category.BROWSABLE\" \/&gt;\r\n\r\n&lt;!-- Replace with scheme relevant to the flavor --&gt;\r\n&lt;data android:scheme=\"yourapp.staging\" \/&gt;\r\n&lt;\/intent-filter&gt;\r\n\r\n&lt;!-- Optional: If your app reacts to download completion --&gt;\r\n&lt;intent-filter&gt;\r\n&lt;action android:name=\"android.intent.action.DOWNLOAD_COMPLETE\" \/&gt;\r\n&lt;\/intent-filter&gt;\r\n&lt;\/activity&gt;\r\n&lt;\/application&gt;\r\n\r\n&lt;\/manifest&gt;<\/pre>\n<div class=\"gp gq gr gs gt\" style=\"text-align: justify;\">\n<div class=\"ac cb\">\n<div class=\"ci bh gb gc gd ge\">\n<p id=\"f57c\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" data-selectable-paragraph=\"\">This allows each flavor to respond to different schemes or hostnames.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ac cb nj nk nl nm\" style=\"text-align: justify;\" role=\"separator\">\n<h1 id=\"aafd\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" data-selectable-paragraph=\"\">iOS: Multiple Targets +\u00a0<code class=\"cx pc pd pe pf b\">.xcconfig<\/code><\/h1>\n<p class=\"pw-post-body-paragraph ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni gp bk\" data-selectable-paragraph=\"\">To replicate Android-style flavoring on iOS, we created\u00a0<strong class=\"mn gx\">multiple targets in Xcode<\/strong>\u00a0\u2014 one per environment (Development, Staging, Production). Each target allows unique bundle identifiers, app schemes, icons, and configs.<\/p>\n<h2 id=\"ae75\" class=\"pt ns gw bf nt pu pv dy nx pw px ea ob mw py pz qa na qb qc qd ne qe qf qg qh bk\" data-selectable-paragraph=\"\">How to Create Targets in Xcode<\/h2>\n<ol class=\"\">\n<li id=\"0dcb\" class=\"ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni qi ov ow bk\" data-selectable-paragraph=\"\"><strong class=\"mn gx\">Open your project in Xcode<\/strong>\u00a0(<code class=\"cx pc pd pe pf b\">.xcworkspace<\/code>).<\/li>\n<li id=\"378c\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni qi ov ow bk\" data-selectable-paragraph=\"\">In the project navigator, right-click your main app target \u2192\u00a0<strong class=\"mn gx\">Duplicate<\/strong>.<\/li>\n<li id=\"e6d8\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni qi ov ow bk\" data-selectable-paragraph=\"\">Rename the duplicate to match the environment, like\u00a0<code class=\"cx pc pd pe pf b\">MyAppDev<\/code>,\u00a0<code class=\"cx pc pd pe pf b\">MyAppStaging<\/code>.<\/li>\n<li id=\"ead8\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni qi ov ow bk\" data-selectable-paragraph=\"\">Select the new target and:<\/li>\n<\/ol>\n<ul class=\"\">\n<li id=\"0693\" class=\"ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">Update its\u00a0<strong class=\"mn gx\">Bundle Identifier<\/strong>\u00a0in\u00a0<code class=\"cx pc pd pe pf b\">Build Settings \u2192 Packaging<\/code>.<\/li>\n<li id=\"e42a\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">Assign a custom\u00a0<strong class=\"mn gx\">Display Name<\/strong>\u00a0in its\u00a0<code class=\"cx pc pd pe pf b\">Info.plist<\/code>\u00a0if needed.<\/li>\n<\/ul>\n<p id=\"7634\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" data-selectable-paragraph=\"\">5. For each new target:<\/p>\n<ul class=\"\">\n<li id=\"e01a\" class=\"ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">Create\u00a0<code class=\"cx pc pd pe pf b\">.xcconfig<\/code>\u00a0files like\u00a0<code class=\"cx pc pd pe pf b\">Dev.debug.xcconfig<\/code>,\u00a0<code class=\"cx pc pd pe pf b\">Dev.release.xcconfig<\/code>, etc.<\/li>\n<li id=\"b4d0\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">Link them via\u00a0<code class=\"cx pc pd pe pf b\">Build Settings \u2192 Configuration<\/code>.<\/li>\n<\/ul>\n<div class=\"gp gq gr gs gt\">\n<div class=\"ac cb\">\n<div class=\"ci bh gb gc gd ge\">\n<p id=\"25e5\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" data-selectable-paragraph=\"\">For each target:<\/p>\n<ol class=\"\">\n<li id=\"0333\" class=\"ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni qi ov ow bk\" data-selectable-paragraph=\"\">Defined unique Bundle ID<\/li>\n<li id=\"1749\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni qi ov ow bk\" data-selectable-paragraph=\"\">Assigned unique\u00a0<code class=\"cx pc pd pe pf b\">APP_SCHEME<\/code><\/li>\n<li id=\"3cf3\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni qi ov ow bk\" data-selectable-paragraph=\"\">Linked separate\u00a0<code class=\"cx pc pd pe pf b\">.xcconfig<\/code>\u00a0files (for Debug and Release)<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"ac cb nj nk nl nm\" role=\"separator\">Then, within\u00a0<code class=\"cx pc pd pe pf b\">Info.plist<\/code>, we referenced a build-time variable:<\/div>\n<\/div>\n<div style=\"text-align: justify;\" role=\"separator\"><\/div>\n<div style=\"text-align: justify;\" role=\"separator\"><\/div>\n<pre role=\"separator\">&lt;key&gt;CFBundleURLTypes&lt;\/key&gt;\r\n&lt;array&gt;\r\n&lt;dict&gt;\r\n&lt;key&gt;CFBundleURLSchemes&lt;\/key&gt;\r\n&lt;array&gt;\r\n&lt;string&gt;$(APP_SCHEME)&lt;\/string&gt;\r\n&lt;\/array&gt;\r\n&lt;\/dict&gt;\r\n&lt;\/array&gt;<\/pre>\n<p id=\"6dce\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">In Xcode \u2192 Build Settings (per target), we added:<\/p>\n<pre>APP_SCHEME = app.dev\r\nAPP_SCHEME = app.staging\r\nAPP_SCHEME = app<\/pre>\n<p class=\"pg ph pi pj pk pl pf pm bp pn bb bk\" style=\"text-align: justify;\">This way, you don\u2019t need different\u00a0<code class=\"cx pc pd pe pf b\">Info.plist<\/code>\u00a0files \u2014 just plug in the correct runtime values.<\/p>\n<h1 id=\"f3b3\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Scripts in\u00a0<code class=\"cx pc pd pe pf b\">package.json<\/code><\/h1>\n<p id=\"1b0a\" class=\"pw-post-body-paragraph ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">We added custom scripts to streamline build and run tasks:<\/p>\n<pre><span class=\"hljs-attr\">\"android:dev\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"ENVIRONMENT=development expo run:android --variant developmentDebug\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"android:staging\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"ENVIRONMENT=staging expo run:android --variant stagingDebug\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"android:prod\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"ENVIRONMENT=production expo run:android --variant productionDebug\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"ios:dev\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"ENVIRONMENT=development expo run:ios --scheme app-dev\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"ios:staging\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"ENVIRONMENT=staging expo run:ios --scheme app-staging\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"ios:prod\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"ENVIRONMENT=production expo run:ios --scheme app\"<\/span><span class=\"hljs-punctuation\">,<\/span><\/pre>\n<p style=\"text-align: justify;\" data-selectable-paragraph=\"\">You can run:<\/p>\n<pre>npm run android:staging\r\nnpm run ios:prod<\/pre>\n<h1 id=\"1a73\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Triggering Builds and Submissions via Scripts<\/h1>\n<p id=\"a943\" class=\"pw-post-body-paragraph ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Once your\u00a0<code class=\"cx pc pd pe pf b\">eas.json<\/code>,\u00a0<code class=\"cx pc pd pe pf b\">app.config.ts<\/code>, native Android\/iOS configurations, and environment variables are set up, you can leverage powerful build and submit scripts directly from your\u00a0<code class=\"cx pc pd pe pf b\">package.json<\/code>.<\/p>\n<p id=\"6a58\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">These scripts make it super easy to automate builds and uploads for each environment without manual intervention.<\/p>\n<p id=\"4159\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">\ufe0f Build Commands<\/p>\n<pre><span class=\"hljs-attr\">\"build:dev:android\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas build --platform android --profile development\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"build:staging:android\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas build --platform android --profile staging\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"build:prod:android\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas build --platform android --profile production\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n\r\n<span class=\"hljs-attr\">\"build:dev:ios\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas build --platform ios --profile development\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"build:staging:ios\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas build --platform ios --profile staging\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"build:prod:ios\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas build --platform ios --profile production\"<\/span><\/pre>\n<p id=\"e8c7\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Submit Commands<\/p>\n<pre class=\"pg ph pi pj pk pl pf pm bp pn bb bk\"><span class=\"hljs-attr\">\"submit:dev:android\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas submit --platform android --profile development\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"submit:staging:android\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas submit --platform android --profile staging\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"submit:prod:android\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas submit --platform android --profile production\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n\r\n<span class=\"hljs-attr\">\"submit:dev:ios\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas submit --platform ios --profile development\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"submit:staging:ios\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas submit --platform ios --profile staging\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"submit:prod:ios\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"eas submit --platform ios --profile production\"<\/span><\/pre>\n<p id=\"db3d\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">You can run these commands like so:<\/p>\n<pre>npm run build:staging:android\r\nnpm run submit:prod:ios<\/pre>\n<p style=\"text-align: justify;\" data-selectable-paragraph=\"\">This setup streamlines your deployment workflow and ensures consistency across environments.<\/p>\n<h1 id=\"85f0\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Final Thoughts<\/h1>\n<p id=\"a75a\" class=\"pw-post-body-paragraph ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">With this setup:<\/p>\n<ul class=\"\" style=\"text-align: justify;\">\n<li id=\"8643\" class=\"ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">You isolate environments without code duplication.<\/li>\n<li id=\"f435\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">Each flavor gets its own deep links, configurations, and runtime settings.<\/li>\n<li id=\"d072\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" data-selectable-paragraph=\"\">You gain full control over the build and release lifecycle for each variant.<\/li>\n<\/ul>\n<p id=\"4c49\" class=\"pw-post-body-paragraph ml mm gw mn b mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni gp bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">This setup has significantly streamlined our CI\/CD, testing, and release pipelines \u2014 making the app more maintainable and scalable.<\/p>\n<h1 id=\"4916\" class=\"nr ns gw bf nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">\u2705 Quick Tips<\/h1>\n<ul class=\"\">\n<li id=\"5222\" class=\"ml mm gw mn b mo op mq mr ms oq mu mv mw or my mz na os nc nd ne ot ng nh ni ou ov ow bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">\u2757 Always keep a single\u00a0<code class=\"cx pc pd pe pf b\">Info.plist<\/code>\u00a0and use build variables.<\/li>\n<li id=\"8b94\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Place variant-specific AndroidManifests inside respective\u00a0<code class=\"cx pc pd pe pf b\">src\/{flavor}<\/code>\u00a0folders.<\/li>\n<li id=\"1776\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">\ufe0f Use\u00a0<code class=\"cx pc pd pe pf b\">.xcconfig<\/code>\u00a0files to manage per-target variables on iOS.<\/li>\n<li id=\"b2b6\" class=\"ml mm gw mn b mo ox mq mr ms oy mu mv mw oz my mz na pa nc nd ne pb ng nh ni ou ov ow bk\" style=\"text-align: justify;\" data-selectable-paragraph=\"\">Use EAS Build\u2019s <code class=\"cx pc pd pe pf b\">gradleCommand<\/code>\u00a0and\u00a0<code class=\"cx pc pd pe pf b\">scheme<\/code> per profile for complete separation.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Maintaining different environments for development, staging, and production is essential in any large-scale mobile app. In this post, I\u2019ll walk you through how I implemented multi environment (flavor) support\u00a0in a React Native app built with\u00a0Expo + EAS \u2014 covering both Android and iOS \u2014 using separate configurations, build schemes, and runtime environment handling. \ufe0f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":8620,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1654,1655,1652,1656,1657,1653,257,412],"tags":[1669,1660,1666,1670,1151,1661,1672,1667,1665,1671,1664,14,586,169,1494,1659,1663,1668,1658,1662],"class_list":["post-8619","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-app-variants","category-development-environment","category-expo","category-mobile-development","category-mobile-devops","category-multi-flavors","category-react","category-react-native","tag-app-deployment","tag-app-variants","tag-app-json-configuration","tag-build-variants","tag-cross-platform-development","tag-development-environments","tag-development-workflow","tag-eas-build","tag-environment-variables","tag-expo-cli","tag-expo-configuration","tag-innovationm","tag-mobile-app-development","tag-mobile-app-testing","tag-mobile-devops","tag-multi-flavors","tag-production-environment","tag-react-native-development","tag-react-native-expo","tag-staging-environment"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project - InnovationM - Blog<\/title>\n<meta name=\"description\" content=\"Learn how to implement multi-flavors (dev, staging, prod) in React Native Expo projects. Run multiple app environments simultaneously on one device with our step-by-step guide from InnovationM&#039;s expert developers.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project - InnovationM - Blog\" \/>\n<meta property=\"og:description\" content=\"Learn how to implement multi-flavors (dev, staging, prod) in React Native Expo projects. Run multiple app environments simultaneously on one device with our step-by-step guide from InnovationM&#039;s expert developers.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-26T13:11:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2025\/06\/How-to-Implement-Multi-Flavors-DevStaging-Prod-in-a-React-Native-Expo-Project-1024x576.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project\",\"datePublished\":\"2025-06-26T13:11:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/\"},\"wordCount\":585,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/How-to-Implement-Multi-Flavors-DevStaging-Prod-in-a-React-Native-Expo-Project.png\",\"keywords\":[\"app deployment\",\"app variants\",\"app.json configuration\",\"build variants\",\"cross-platform development\",\"development environments\",\"development workflow\",\"EAS build\",\"environment variables\",\"Expo CLI\",\"Expo configuration\",\"InnovationM\",\"Mobile App Development\",\"mobile app testing\",\"Mobile DevOps\",\"multi flavors\",\"production environment\",\"React Native development\",\"React Native Expo\",\"staging environment\"],\"articleSection\":[\"App Variants\",\"Development Environment\",\"Expo\",\"Mobile Development\",\"Mobile DevOps\",\"Multi Flavors\",\"React\",\"React Native\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/\",\"name\":\"How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project - InnovationM - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/How-to-Implement-Multi-Flavors-DevStaging-Prod-in-a-React-Native-Expo-Project.png\",\"datePublished\":\"2025-06-26T13:11:47+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"description\":\"Learn how to implement multi-flavors (dev, staging, prod) in React Native Expo projects. Run multiple app environments simultaneously on one device with our step-by-step guide from InnovationM's expert developers.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/How-to-Implement-Multi-Flavors-DevStaging-Prod-in-a-React-Native-Expo-Project.png\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/How-to-Implement-Multi-Flavors-DevStaging-Prod-in-a-React-Native-Expo-Project.png\",\"width\":2240,\"height\":1260,\"caption\":\"React Native\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/react-native-expo-multi-flavors-dev-staging-prod-implementation\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project - InnovationM - Blog","description":"Learn how to implement multi-flavors (dev, staging, prod) in React Native Expo projects. Run multiple app environments simultaneously on one device with our step-by-step guide from InnovationM's expert developers.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/","og_locale":"en_US","og_type":"article","og_title":"How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project - InnovationM - Blog","og_description":"Learn how to implement multi-flavors (dev, staging, prod) in React Native Expo projects. Run multiple app environments simultaneously on one device with our step-by-step guide from InnovationM's expert developers.","og_url":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/","og_site_name":"InnovationM - Blog","article_published_time":"2025-06-26T13:11:47+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2025\/06\/How-to-Implement-Multi-Flavors-DevStaging-Prod-in-a-React-Native-Expo-Project-1024x576.png","type":"image\/png"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project","datePublished":"2025-06-26T13:11:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/"},"wordCount":585,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2025\/06\/How-to-Implement-Multi-Flavors-DevStaging-Prod-in-a-React-Native-Expo-Project.png","keywords":["app deployment","app variants","app.json configuration","build variants","cross-platform development","development environments","development workflow","EAS build","environment variables","Expo CLI","Expo configuration","InnovationM","Mobile App Development","mobile app testing","Mobile DevOps","multi flavors","production environment","React Native development","React Native Expo","staging environment"],"articleSection":["App Variants","Development Environment","Expo","Mobile Development","Mobile DevOps","Multi Flavors","React","React Native"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/","url":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/","name":"How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project - InnovationM - Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2025\/06\/How-to-Implement-Multi-Flavors-DevStaging-Prod-in-a-React-Native-Expo-Project.png","datePublished":"2025-06-26T13:11:47+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"description":"Learn how to implement multi-flavors (dev, staging, prod) in React Native Expo projects. Run multiple app environments simultaneously on one device with our step-by-step guide from InnovationM's expert developers.","breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2025\/06\/How-to-Implement-Multi-Flavors-DevStaging-Prod-in-a-React-Native-Expo-Project.png","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2025\/06\/How-to-Implement-Multi-Flavors-DevStaging-Prod-in-a-React-Native-Expo-Project.png","width":2240,"height":1260,"caption":"React Native"},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/react-native-expo-multi-flavors-dev-staging-prod-implementation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Implement Multi-Flavors (Dev, Staging, Prod) in a React Native + Expo Project"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/8619","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=8619"}],"version-history":[{"count":2,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/8619\/revisions"}],"predecessor-version":[{"id":8622,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/8619\/revisions\/8622"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/8620"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=8619"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=8619"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=8619"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}