<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anderson Begossi</title>
    <description>The latest articles on DEV Community by Anderson Begossi (@ambegossi).</description>
    <link>https://dev.to/ambegossi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F588781%2F299a3ccd-4b8d-4128-a214-ea3f6158831f.jpeg</url>
      <title>DEV Community: Anderson Begossi</title>
      <link>https://dev.to/ambegossi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ambegossi"/>
    <language>en</language>
    <item>
      <title>Como configurar diferentes ambientes em apps React Native</title>
      <dc:creator>Anderson Begossi</dc:creator>
      <pubDate>Mon, 21 Apr 2025 13:59:51 +0000</pubDate>
      <link>https://dev.to/ambegossi/como-configurar-diferentes-ambientes-para-apps-react-native-2o5k</link>
      <guid>https://dev.to/ambegossi/como-configurar-diferentes-ambientes-para-apps-react-native-2o5k</guid>
      <description>&lt;p&gt;Em projetos React Native, é comum trabalhar com diferentes ambientes — como desenvolvimento, staging e produção. Cada um desses ambientes pode ter necessidades distintas — como um nome de app diferente, ícone específico, ou variáveis de ambiente próprias (como URLs de API ou chaves de serviços externos).&lt;/p&gt;

&lt;p&gt;Configurar variantes de build permite isolar esses contextos, facilitando testes, distribuição e organização do projeto. Neste artigo, explico como configurar variantes de build no Android e no iOS, determinar um ícone, nome do app e outras configurações específicas por variante, além de como integrar com a biblioteca &lt;a href="https://github.com/lugg/react-native-config" rel="noopener noreferrer"&gt;react-native-config&lt;/a&gt;. Para demonstrar as configurações na prática, criei um app React Native de exemplo que pode ser encontrado no &lt;a href="https://github.com/andersonbegossi/build-variants" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, e compartilhei alguns trechos de código dele ao longo do texto. O resultado final do app e suas diferentes variantes pode ser visto abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fon9wjvaue6f9f0z6jmnp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fon9wjvaue6f9f0z6jmnp.png" alt="BuildVariants" width="800" height="1509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Android
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Build variants
&lt;/h3&gt;

&lt;p&gt;No Android o que precisamos fazer é configurar diferentes &lt;em&gt;build variants&lt;/em&gt;. Cada &lt;em&gt;build variant&lt;/em&gt; tem um conjunto específico de configurações, código e recursos configurados nos &lt;em&gt;build types&lt;/em&gt; e &lt;em&gt;product flavors.&lt;/em&gt; Embora você não configure uma &lt;em&gt;build variant&lt;/em&gt; diretamente, você o faz indiretamente configurando &lt;em&gt;build types&lt;/em&gt; e &lt;em&gt;product flavors.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Por exemplo, um &lt;em&gt;product flavor&lt;/em&gt; chamado &lt;code&gt;staging&lt;/code&gt; pode utilizar determinada URL de API, enquanto o &lt;em&gt;build type&lt;/em&gt; &lt;code&gt;release&lt;/code&gt; aplica diferentes configurações de assinatura. A &lt;em&gt;build variant&lt;/em&gt; que combina esses dois se chamará &lt;code&gt;stagingRelease&lt;/code&gt;, e irá incluir a combinação de configurações definidas no &lt;em&gt;product flavor&lt;/em&gt; &lt;code&gt;staging&lt;/code&gt; e no &lt;em&gt;build type&lt;/em&gt; &lt;code&gt;release&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Referência: &lt;a href="https://developer.android.com/build/build-variants" rel="noopener noreferrer"&gt;https://developer.android.com/build/build-variants&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Build types
&lt;/h3&gt;

&lt;p&gt;Você pode configurar diferentes &lt;em&gt;build types&lt;/em&gt; dentro do bloco &lt;code&gt;android&lt;/code&gt; no arquivo &lt;code&gt;android/app/build.gradle&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Quando você cria um projeto React Native, os &lt;em&gt;build types&lt;/em&gt; &lt;code&gt;debug&lt;/code&gt; e &lt;code&gt;release&lt;/code&gt; já vem configurados por padrão, como mostra o trecho de código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;android&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="nx"&gt;buildTypes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;debug&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;signingConfig&lt;/span&gt; &lt;span class="nx"&gt;signingConfigs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;debug&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;release&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Caution! In production, you need to generate your own keystore file.&lt;/span&gt;
            &lt;span class="c1"&gt;// see https://reactnative.dev/docs/signed-apk-android.&lt;/span&gt;
            &lt;span class="nx"&gt;signingConfig&lt;/span&gt; &lt;span class="nx"&gt;signingConfigs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;release&lt;/span&gt;
            &lt;span class="nx"&gt;minifyEnabled&lt;/span&gt; &lt;span class="nx"&gt;enableProguardInReleaseBuilds&lt;/span&gt;
            &lt;span class="nx"&gt;proguardFiles&lt;/span&gt; &lt;span class="nf"&gt;getDefaultProguardFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;proguard-android.txt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;proguard-rules.pro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Referência: &lt;a href="https://developer.android.com/build/build-variants#build-types" rel="noopener noreferrer"&gt;https://developer.android.com/build/build-variants#build-types&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Product flavors
&lt;/h3&gt;

&lt;p&gt;Configurar os &lt;em&gt;product flavors&lt;/em&gt; é similar a configurar os &lt;em&gt;build types,&lt;/em&gt; e também é feito no arquivo &lt;code&gt;android/app/build.gradle&lt;/code&gt;. Adicione seus &lt;em&gt;product flavors&lt;/em&gt; ao bloco &lt;code&gt;productFlavors&lt;/code&gt; e inclua as configurações desejadas. Os &lt;em&gt;product flavors&lt;/em&gt; aceitam as mesmas propriedades do &lt;code&gt;defaultConfig&lt;/code&gt;. Você pode adicionar as configurações base de todos os product flavors no bloco &lt;code&gt;defaultConfig&lt;/code&gt;, e, cada &lt;em&gt;flavor&lt;/em&gt; pode alterar cada uma dessas configurações default, como, por exemplo, o &lt;code&gt;applicationId&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No app de exemplo, configurei os &lt;em&gt;product flavors&lt;/em&gt; &lt;code&gt;development&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt;, e &lt;code&gt;production&lt;/code&gt;. Para os &lt;em&gt;product flavors&lt;/em&gt; &lt;code&gt;development&lt;/code&gt; e &lt;code&gt;staging&lt;/code&gt;, adicionei as configurações &lt;code&gt;applicationIdSuffix&lt;/code&gt;, para adicionar um sufixo específico no &lt;code&gt;applicationId&lt;/code&gt; do app, e, &lt;code&gt;versionNameSuffix&lt;/code&gt;, para adicionar um sufixo específico no &lt;code&gt;versionName&lt;/code&gt; do app. O trecho de código onde isso foi feito é mostrado abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="nx"&gt;android&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="nx"&gt;defaultConfig&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;applicationId&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;com.buildvariants&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;minSdkVersion&lt;/span&gt; &lt;span class="nx"&gt;rootProject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;minSdkVersion&lt;/span&gt;
        &lt;span class="nx"&gt;targetSdkVersion&lt;/span&gt; &lt;span class="nx"&gt;rootProject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;targetSdkVersion&lt;/span&gt;
        &lt;span class="nx"&gt;versionCode&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="nx"&gt;versionName&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;resValue&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;build_config_package&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;com.buildvariants&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="nx"&gt;flavorDimensions&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;version&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;productFlavors&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;development&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;applicationIdSuffix&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
            &lt;span class="nx"&gt;versionNameSuffix&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;staging&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;applicationIdSuffix&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.staging&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
            &lt;span class="nx"&gt;versionNameSuffix&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-staging&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;production&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Referência: &lt;a href="https://developer.android.com/build/build-variants#product-flavors" rel="noopener noreferrer"&gt;https://developer.android.com/build/build-variants#product-flavors&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurações de assinatura
&lt;/h3&gt;

&lt;p&gt;Para que você consiga fazer o build da build type &lt;code&gt;release&lt;/code&gt; do app, você precisa definir as configurações de assinatura. Para isso, o primeiro passo é &lt;a href="https://developer.android.com/studio/publish/app-signing#generate-key" rel="noopener noreferrer"&gt;gerar uma upload key e uma keystore&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Após ter sua &lt;em&gt;upload key&lt;/em&gt; e &lt;em&gt;keystore&lt;/em&gt;, crie um arquivo chamado &lt;code&gt;keystore.properties&lt;/code&gt;, dentro da pasta android, com as informações de assinatura geradas, como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;storeFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;keystore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jks&lt;/span&gt;
&lt;span class="nx"&gt;keyAlias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;keystore&lt;/span&gt;
&lt;span class="nx"&gt;storePassword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12345678&lt;/span&gt;
&lt;span class="nx"&gt;keyPassword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12345678&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após isso, no arquivo &lt;code&gt;android/app/build.gradle&lt;/code&gt;, carregue as informações desse arquivo antes do bloco &lt;code&gt;android&lt;/code&gt; e as referencie no bloco &lt;code&gt;signinConfigs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nx"&gt;keystorePropertiesFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rootProject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;keystore.properties&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nx"&gt;keystoreProperties&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Properties&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nx"&gt;keystoreProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FileInputStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keystorePropertiesFile&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nx"&gt;android&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="nx"&gt;signingConfigs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;debug&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;storeFile&lt;/span&gt; &lt;span class="nf"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;debug.keystore&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nx"&gt;storePassword&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;android&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
            &lt;span class="nx"&gt;keyAlias&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;androiddebugkey&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
            &lt;span class="nx"&gt;keyPassword&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;android&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;release&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;storeFile&lt;/span&gt; &lt;span class="nf"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keystoreProperties&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;storeFile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="nx"&gt;keyAlias&lt;/span&gt; &lt;span class="nx"&gt;keystoreProperties&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyAlias&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="nx"&gt;storePassword&lt;/span&gt; &lt;span class="nx"&gt;keystoreProperties&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;storePassword&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="nx"&gt;keyPassword&lt;/span&gt; &lt;span class="nx"&gt;keystoreProperties&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyPassword&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Importante:&lt;/strong&gt; não adicione o arquivo &lt;code&gt;keystore.properties&lt;/code&gt; ou a sua &lt;em&gt;keystore&lt;/em&gt; ao Git. Certifique-se de adicioná-los ao &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Referência: &lt;a href="https://developer.android.com/build/build-variants#signing" rel="noopener noreferrer"&gt;https://developer.android.com/build/build-variants#signing&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nome do app
&lt;/h3&gt;

&lt;p&gt;Para configurar um nome do app específico para cada &lt;em&gt;product flavor&lt;/em&gt;, você precisa criar um pasta com o nome do &lt;em&gt;product flavor&lt;/em&gt; dentro da pasta android/app/src. Dentro dela, crie uma pasta chamada "res”, e, dentro, uma chamada "values”. Dentro da pasta "values”, adicione um arquivo xml chamado "strings” com o nome do app desejado dentro de uma tag &lt;code&gt;string&lt;/code&gt; com a propriedade &lt;code&gt;name="app_name”&lt;/code&gt;. No app de exemplo, foi configurado o nome “DevBuildVariants" para o &lt;em&gt;product flavor&lt;/em&gt; &lt;code&gt;development&lt;/code&gt;, e, “StagingBuildVariants” para &lt;code&gt;staging&lt;/code&gt;. Para o &lt;em&gt;product flavor&lt;/em&gt; &lt;code&gt;production&lt;/code&gt;, manteve-se o nome “BuildVariants”, que pode ser encontrado dentro do arquivo "strings” da pasta "main”. Caso o &lt;em&gt;product flavor&lt;/em&gt; não sobrescreva o nome do app, o da pasta "main” é utilizado. Na &lt;em&gt;screenshot&lt;/em&gt; abaixo, o arquivo "strings” com o nome do app do &lt;em&gt;flavor&lt;/em&gt; &lt;code&gt;development&lt;/code&gt; do app de exemplo é mostrado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkh5kgqheqgrdktrt8l2m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkh5kgqheqgrdktrt8l2m.png" alt="strings.xml" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ícone do app
&lt;/h3&gt;

&lt;p&gt;Para configurar um ícone específico para cada &lt;em&gt;product flavor&lt;/em&gt;, basta adicionar um novo &lt;strong&gt;Image Asset&lt;/strong&gt; com o nome “ic_launcher” na pasta "res” de cada &lt;em&gt;product flavor&lt;/em&gt;. Para o ícone do &lt;em&gt;product flavor&lt;/em&gt; &lt;code&gt;production&lt;/code&gt;, adicione um novo &lt;strong&gt;Image Asset&lt;/strong&gt; com o nome “ic_launcher” na pasta “res” dentro da pasta “main”. O ícone do app da pasta "res" da pasta “main” será utilizado como padrão caso o &lt;em&gt;product flavor&lt;/em&gt; não possua um ícone específico. &lt;/p&gt;

&lt;h2&gt;
  
  
  iOS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Build configurations
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Build configurations&lt;/em&gt; definem como o Xcode deve compilar o projeto dependendo do ambiente ou propósito do build. Cada configuração representa um conjunto de regras e valores específicos usados durante a compilação, como flags de compilador, variáveis de ambiente, otimizações e arquivos de configuração. Por padrão, o Xcode cria duas configurações: &lt;code&gt;Debug&lt;/code&gt; e &lt;code&gt;Release&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Você pode criar configurações adicionais, como, &lt;code&gt;Staging&lt;/code&gt;, &lt;code&gt;Production&lt;/code&gt;, &lt;code&gt;DebugStaging&lt;/code&gt;, etc., para ter mais controle sobre ambientes diferentes.&lt;/p&gt;

&lt;p&gt;Essas configurações são frequentemente combinadas com &lt;em&gt;schemes&lt;/em&gt;, permitindo, por exemplo, que o mesmo código-fonte seja compilado com diferentes endpoints de API, credenciais ou chaves de build.&lt;/p&gt;

&lt;p&gt;Além disso, cada &lt;em&gt;build configuration&lt;/em&gt; pode ser associada a um arquivo &lt;code&gt;.xcconfig&lt;/code&gt;, facilitando a manutenção de valores separados por ambiente, como &lt;code&gt;BASE_URL&lt;/code&gt;, &lt;code&gt;BUNDLE_IDENTIFIER&lt;/code&gt;, &lt;code&gt;APP_NAME&lt;/code&gt;, entre outros.&lt;/p&gt;

&lt;p&gt;Em nosso app de exemplo, criei as &lt;em&gt;build configurations&lt;/em&gt; &lt;code&gt;DebugProduction&lt;/code&gt;, &lt;code&gt;DebugStaging&lt;/code&gt;, &lt;code&gt;ReleaseProduction&lt;/code&gt; e &lt;code&gt;ReleaseStaging&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para fazer isso, abra o arquivo &lt;strong&gt;`.&lt;/strong&gt;xcworkspace`que está dentro da pasta iOS no seu Xcode, clique no seu projeto na aba lateral esquerda e depois no Project. Na aba Info, clique no ícone de + e adicione as novas &lt;em&gt;build configurations&lt;/em&gt;. Na &lt;em&gt;screenshot&lt;/em&gt; abaixo as &lt;em&gt;build configurations&lt;/em&gt; do app de exemplo são mostradas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qnk3gv6de2yt3oglm2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qnk3gv6de2yt3oglm2f.png" alt="Build configurations" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Referência: &lt;a href="https://developer.apple.com/documentation/xcode/adding-a-build-configuration-file-to-your-project" rel="noopener noreferrer"&gt;https://developer.apple.com/documentation/xcode/adding-a-build-configuration-file-to-your-project&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Build schemes
&lt;/h3&gt;

&lt;p&gt;Quando você compila, executa ou testa seu app, o Xcode usa o &lt;em&gt;build scheme&lt;/em&gt; selecionado para determinar o que fazer. Um &lt;em&gt;build scheme&lt;/em&gt; contém as configurações que afetarão a ação selecionada. Por exemplo, quando você compila e roda seu app, o &lt;em&gt;scheme&lt;/em&gt; fala para o Xcode quais argumentos de inicialização serão passados para o app. O Xcode cria &lt;em&gt;schemes&lt;/em&gt; padrões na maioria das vezes, e você pode customizar esses &lt;em&gt;schemes&lt;/em&gt; ou criar um novo caso necessário.&lt;/p&gt;

&lt;p&gt;No app de exemplo, renomeei o &lt;em&gt;scheme&lt;/em&gt; padrão para &lt;code&gt;BuildVariantsDevelopment&lt;/code&gt;, e criei os &lt;em&gt;schemes&lt;/em&gt; &lt;code&gt;BuildVariantsStaging&lt;/code&gt; e &lt;code&gt;BuildVariantsProduction&lt;/code&gt;. Você pode ver os &lt;em&gt;schemes&lt;/em&gt; do seu app na barra superior do Xcode, como mostra a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fankn05kh8ibqcl8afbbc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fankn05kh8ibqcl8afbbc.png" alt="Build schemes" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode criar ou editar um novo &lt;em&gt;scheme&lt;/em&gt; através da janela que abre clicando no &lt;em&gt;build scheme&lt;/em&gt; na barra superior, ou clicando em “Manage Schemes”.&lt;/p&gt;

&lt;p&gt;Para cada &lt;em&gt;build scheme&lt;/em&gt;, associe um &lt;em&gt;build configuration&lt;/em&gt; correspondente. Na seção “Run”, associe o &lt;em&gt;build configuration&lt;/em&gt; de debug do &lt;em&gt;scheme&lt;/em&gt;. Na seção “Archive”, associe o &lt;em&gt;build configuration&lt;/em&gt; de release do &lt;em&gt;scheme,&lt;/em&gt; como pode ser visto nas &lt;em&gt;screenshots&lt;/em&gt; do app de exemplo abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F365pslenurh7qs28oei5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F365pslenurh7qs28oei5.png" alt="Run" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkubreturmdexuveepix0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkubreturmdexuveepix0.png" alt="Archive" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Referência: &lt;a href="https://developer.apple.com/documentation/xcode/customizing-the-build-schemes-for-a-project" rel="noopener noreferrer"&gt;https://developer.apple.com/documentation/xcode/customizing-the-build-schemes-for-a-project&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bundle identifier
&lt;/h3&gt;

&lt;p&gt;Para escolher um &lt;em&gt;bundle identifier&lt;/em&gt; específico para cada variante do seu app, clique no seu app em “Targets”, e na aba “General” encontre a seção "Identity”. Nesta seção defina o &lt;em&gt;bundle identifier&lt;/em&gt; desejado para cada &lt;em&gt;build configuration&lt;/em&gt;. No app de exemplo foi definido o &lt;em&gt;bundle identifier&lt;/em&gt; &lt;code&gt;com.buildvariants.dev&lt;/code&gt; para a variante de development, &lt;code&gt;com.buildvariants.staging&lt;/code&gt; para a variante de staging, e &lt;code&gt;com.buildvariants&lt;/code&gt; para a variante de production, como mostra a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52rooa7ux3p5obd682vs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52rooa7ux3p5obd682vs.png" alt="Bundle identifier" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nome do app
&lt;/h3&gt;

&lt;p&gt;Para escolher um nome específico para cada variante do seu app, clique no seu app em “Targets”, e na aba “Build Settings” clique no ícone + na barra superior e adicione uma nova &lt;strong&gt;User-Defined Setting&lt;/strong&gt; chamada &lt;code&gt;APP_DISPLAY_NAME&lt;/code&gt;. Nessa &lt;strong&gt;User-Defined setting&lt;/strong&gt;, escolha um nome específico para cada &lt;em&gt;build configuration&lt;/em&gt;. No app de exemplo, escolhi os nomes “DevBuildVariants” para a variante de development, “StagingBuildVariants” para a variante de staging e "BuildVariants” para a variante de production. Na imagem abaixo isso pode ser visto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzv8yu49xx3gmkovoqbjz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzv8yu49xx3gmkovoqbjz.png" alt="Build settings" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso, clique na aba “Info” e na key “Bundle display name” adicione o value &lt;code&gt;$(APP_DISPLAY_NAME)&lt;/code&gt;, como mostra a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvf9dx1tzih18n1svfd9x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvf9dx1tzih18n1svfd9x.png" alt="Bundle display name" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ícone do app
&lt;/h3&gt;

&lt;p&gt;Para escolher um ícone específico para cada variante do app, você precisa primeiramente adicionar os ícones em "Images”, no seu projeto. Depois, você precisa vincular cada variante com seu respectivo ícone. No app de exemplo foi configurado um ícone específico para a variante de production, e, outro, para a variante de development e staging. Para fazer isso, primeiro, clique no seu projeto na aba lateral esquerda, abra a pasta com o nome do seu projeto e clique em “Images”. Clique em “AppIcon” e adicione seu ícone de produção, e, depois, adicione um novo &lt;strong&gt;iOS App Icon&lt;/strong&gt; chamado “AppIconStaging” clicando no ícone + na barra inferior, e adicione seu ícone de development/staging. Na imagem abaixo o ícone de development/staging do app de exemplo pode ser visto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdccrifcn07jqri6fd1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdccrifcn07jqri6fd1b.png" alt="Ícone" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso, clique no seu app em “Targets”, e na aba “General" encontre a seção "App Icons and Launch Screen”. Nesta seção escolha o ícone correspondente para cada &lt;em&gt;build configuration&lt;/em&gt;. A imagem abaixo mostra essa seção no app de exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpk5bqq33ol1n5u9lktxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpk5bqq33ol1n5u9lktxy.png" alt="App icons and launch creen" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  CocoaPods
&lt;/h3&gt;

&lt;p&gt;Por fim, precisamos mapear as &lt;em&gt;build configurations&lt;/em&gt; criadas para configurações de build conhecidas pelo CocoaPods. Isso é importante porque o CocoaPods precisa entender se uma determinada configuração do Xcode deve ser tratada como um build de debug ou de release.&lt;/p&gt;

&lt;p&gt;Para fazer isso no app de exemplo, adicionei o seguinte trecho no topo do arquivo &lt;code&gt;Podfile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;project&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BuildVariants&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Debug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Release&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;release&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DebugProduction&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ReleaseProduction&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;release&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DebugStaging&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ReleaseStaging&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Referência: &lt;a href="https://guides.cocoapods.org/syntax/podfile.html#project" rel="noopener noreferrer"&gt;https://guides.cocoapods.org/syntax/podfile.html#project&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  React Native Config
&lt;/h2&gt;

&lt;p&gt;Para configurarmos diferentes variáveis de ambiente para cada ambiente do nosso app, instale o instale a biblioteca &lt;a href="https://github.com/lugg/react-native-config" rel="noopener noreferrer"&gt;react-native-config&lt;/a&gt; seguindo a documentação, e crie os arquivos &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.env.staging&lt;/code&gt; e &lt;code&gt;.env.production&lt;/code&gt; na raiz do seu projeto. Em cada arquivo, defina as variáveis de ambiente de cada ambiente. Para que o Android e iOS carreguem as variáveis de ambiente corretamente, é preciso fazer alguns passos adicionais. Esses passos que foram seguidos no app de exemplo são descritos a seguir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adicionalmente, precisamos manualmente aplicar um plugin no app. No arquivo &lt;code&gt;android/app/build.gradle&lt;/code&gt;, foi adicionada a seguinte linha na segunda linha do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;apply&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:react-native-config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;projectDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPath&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dotenv.gradle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para ter suporte a diferentes &lt;em&gt;build variants&lt;/em&gt;, no mesmo arquivo foi adicionada a seguinte linha dentro de &lt;code&gt;defaultConfig&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;defaultConfig&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="nx"&gt;resValue&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;build_config_package&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;com.buildvariants&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para que o Android saiba quais variáveis de ambiente utilizar para cada &lt;em&gt;flavor&lt;/em&gt;, no arquivo &lt;code&gt;android/app/build.gradle&lt;/code&gt;, associe cada &lt;em&gt;product flavor&lt;/em&gt; com seu respectivo arquivo &lt;code&gt;.env&lt;/code&gt;. Faça isso antes do &lt;code&gt;apply from&lt;/code&gt; adicionado anteriormente, como mostra no trecho de código do app de exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;envConfigFiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;development&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.env&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.env.staging&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;production&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.env.production&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nx"&gt;apply&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:react-native-config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;projectDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPath&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dotenv.gradle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso você tenha &lt;em&gt;product flavors&lt;/em&gt; com nomes compostos, você deve defini-los nesta configuração usando &lt;em&gt;lowercase&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Referência: &lt;a href="https://github.com/lugg/react-native-config?tab=readme-ov-file#different-environments" rel="noopener noreferrer"&gt;https://github.com/lugg/react-native-config?tab=readme-ov-file#different-environments&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iOS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para que o iOS carregue as variáveis de ambiente corretamente, vincule cada &lt;em&gt;build configuration&lt;/em&gt; com seu respectivo arquivo &lt;code&gt;.env&lt;/code&gt;. Para fazer isso, foi adicionando o seguinte trecho no final do arquivo &lt;code&gt;Podfile&lt;/code&gt; do app de exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BuildVariants&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;

  &lt;span class="nx"&gt;ENVFILES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Debug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$(PODS_ROOT)/../../.env&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DebugStaging&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$(PODS_ROOT)/../../.env.staging&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DebugProduction&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$(PODS_ROOT)/../../.env.production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Release&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$(PODS_ROOT)/../../.env&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ReleaseStaging&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$(PODS_ROOT)/../../.env.staging&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ReleaseProduction&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$(PODS_ROOT)/../../.env.production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;post_install&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;installer&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="nx"&gt;installer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pods_project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build_configurations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build_settings&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ENVFILE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ENVFILES&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nx"&gt;end&lt;/span&gt;
      &lt;span class="nx"&gt;end&lt;/span&gt;
    &lt;span class="nx"&gt;end&lt;/span&gt;
  &lt;span class="nx"&gt;end&lt;/span&gt;
&lt;span class="nx"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Referência: &lt;a href="https://github.com/lugg/react-native-config?tab=readme-ov-file#different-environments" rel="noopener noreferrer"&gt;https://github.com/lugg/react-native-config?tab=readme-ov-file#different-environments&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scripts de build
&lt;/h2&gt;

&lt;p&gt;Para facilitar o build de cada variante, adicione um script para cada no arquivo &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Utilize a flag &lt;code&gt;mode&lt;/code&gt; para especificar a &lt;em&gt;build variant&lt;/em&gt;, e a flag &lt;code&gt;appId&lt;/code&gt; para especificar o &lt;code&gt;applicationId&lt;/code&gt; que é para abrir no dispositivo depois do build. Se não especificado, o &lt;code&gt;applicationId&lt;/code&gt; do &lt;code&gt;defaultConfig&lt;/code&gt; será usado. Os scripts para o Android criados no app de exemplo podem ser vistos abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;buildvariants&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;version&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.0.1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;private&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scripts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;android&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-native run-android --mode=developmentDebug --appId=com.buildvariants.dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;android-stg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-native run-android --mode=stagingDebug --appId=com.buildvariants.staging&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;android-prod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-native run-android --mode=productionDebug&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Referência: &lt;a href="https://github.com/react-native-community/cli/blob/main/packages/cli-platform-android/README.md#run-android" rel="noopener noreferrer"&gt;https://github.com/react-native-community/cli/blob/main/packages/cli-platform-android/README.md#run-android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iOS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Utilize a flag &lt;code&gt;scheme&lt;/code&gt; para especificar o &lt;em&gt;build scheme&lt;/em&gt;, e a flag &lt;code&gt;mode&lt;/code&gt; para especificar a &lt;em&gt;build configuration&lt;/em&gt;. Os scripts para o iOS criados no app de exemplo podem ser vistos abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;buildvariants&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;version&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.0.1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;private&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scripts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ios&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-native run-ios --scheme=BuildVariantsDevelopment --mode=Debug&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ios-stg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-native run-ios --scheme=BuildVariantsStaging --mode=DebugStaging&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ios-prod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-native run-ios --scheme=BuildVariantsProduction --mode=DebugProduction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Referência: &lt;a href="https://github.com/react-native-community/cli/blob/main/packages/cli-platform-ios/README.md#run-ios" rel="noopener noreferrer"&gt;https://github.com/react-native-community/cli/blob/main/packages/cli-platform-ios/README.md#run-ios&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Configurar variantes de build em projetos React Native é uma etapa essencial para organizar e isolar os diferentes ambientes em que o app será executado. Com a abordagem apresentada neste artigo, é possível definir nomes, ícones, variáveis de ambiente e configurações específicas para cada contexto, tanto no Android quanto no iOS. O projeto de exemplo disponível no GitHub pode servir como base para aplicar essas configurações em seu próprio app. Comente o que você achou ou deixe alguma pergunta!&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
      <category>ios</category>
      <category>android</category>
    </item>
    <item>
      <title>How to set up MacOS for React Native development and maximum productivity</title>
      <dc:creator>Anderson Begossi</dc:creator>
      <pubDate>Tue, 02 May 2023 23:24:58 +0000</pubDate>
      <link>https://dev.to/ambegossi/how-to-configure-macos-for-react-native-development-and-maximum-productivity-524i</link>
      <guid>https://dev.to/ambegossi/how-to-configure-macos-for-react-native-development-and-maximum-productivity-524i</guid>
      <description>&lt;p&gt;After formatting my Mac, I set it up for my personal use and development workflow. I enjoy using various apps to enhance my productivity, so this time I decided to create a tutorial and share it with everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Terminal&lt;/li&gt;
&lt;li&gt;
React Native environment

&lt;ul&gt;
&lt;li&gt;iOS&lt;/li&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;li&gt;Flipper&lt;/li&gt;
&lt;li&gt;Expo&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Other apps&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Before starting I install three essential apps that help me with everything else:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brave (browser) - Tks to my coworker Fig for the recommendation!&lt;/li&gt;
&lt;li&gt;Notion (notes)&lt;/li&gt;
&lt;li&gt;Raycast (launcher)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Raycast&lt;/strong&gt; is my favorite one, as it has features that help me a lot with productivity and organization. I particularly enjoy the Window Manager, Quicklinks and Clipboard History built-in functionalities, and there are many extensions you can install on it. Here are some of the ones I use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.raycast.com/gstvds/cpf-cnpj-generator" rel="noopener noreferrer"&gt;CPF/CNPJ Generator&lt;/a&gt; (Brazilian documents)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raycast.com/mblode/google-search" rel="noopener noreferrer"&gt;Google Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raycast.com/HelloImSteven/sips" rel="noopener noreferrer"&gt;Image Modification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raycast.com/thomas/color-picker" rel="noopener noreferrer"&gt;Color Picker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raycast.com/MarkusLanger/vscode-project-manager" rel="noopener noreferrer"&gt;Visual Studio Code - Project Manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dependencies
&lt;/h2&gt;

&lt;p&gt;After that, I start setting up the development environment installing some dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For install Node.js, I like to use the &lt;strong&gt;n&lt;/strong&gt; node version manager.&lt;br&gt;
To install &lt;strong&gt;n&lt;/strong&gt; run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://raw.githubusercontent.com/tj/n/master/bin/n &lt;span class="nt"&gt;-o&lt;/span&gt; n
bash n lts
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To verify if the installation succeeds run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;-v&lt;/span&gt;
npm &lt;span class="nt"&gt;-v&lt;/span&gt;
n &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Homebrew&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To install Homebrew run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/bin/bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Git and GitHub CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To install Git run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To install the GitHub CLI run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;gh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Watchman&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To install Watchman run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;watchman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Yarn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To install Yarn run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--global&lt;/span&gt; yarn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Terminal
&lt;/h2&gt;

&lt;p&gt;After this, I like to configure my terminal. &lt;/p&gt;

&lt;p&gt;For a long time, I used the &lt;a href="https://hyper.is/" rel="noopener noreferrer"&gt;Hyper&lt;/a&gt; terminal, but this time, I decided to give a chance for &lt;a href="https://www.warp.dev/" rel="noopener noreferrer"&gt;Warp&lt;/a&gt;. So far, I've really liked it. If you want to try it too, download it from their website, and install it like any other app. &lt;/p&gt;

&lt;p&gt;One "disadvantage” of Warp is that you still can't use the &lt;a href="http://fig.io/" rel="noopener noreferrer"&gt;Fig.io&lt;/a&gt; command line helper with it. However, Warp already has many of Fig.io features built-in.&lt;/p&gt;

&lt;p&gt;In my terminal, I like to use the &lt;strong&gt;Hack Nerd Font&lt;/strong&gt; and &lt;strong&gt;Starship&lt;/strong&gt; custom prompt. If you want to use them too, download the font on this website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.nerdfonts.com/font-downloads" rel="noopener noreferrer"&gt;Nerd Fonts Downloads&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Extract the files, select all .ttf files and open.&lt;/p&gt;

&lt;p&gt;In Warp, go to Settings → Appearance → Text and select the Hack Nerd Font on the Terminal font input.&lt;/p&gt;

&lt;p&gt;To install Starship, follow this simple guide in their documentation:&lt;br&gt;
&lt;a href="https://starship.rs/guide/#%F0%9F%9A%80-installation" rel="noopener noreferrer"&gt;Starship Installation Guide&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;NOTE:&lt;/em&gt;&lt;/strong&gt;  The default Warp shell is the Zsh. So, in Step 2 to configure Starship, choose the Zsh option.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Warp comes with some default themes, which you can choose by opening the command palette with &lt;strong&gt;Command + P&lt;/strong&gt; and searching for &lt;strong&gt;'Open Theme Picker'&lt;/strong&gt;. However, I prefer to use the same theme that I use in my VSCode, which is the &lt;a href="https://github.com/catppuccin/warp" rel="noopener noreferrer"&gt;Catppuccin Mocha&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The final result is as follows:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjdduwx1pwvaya97c0ur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjdduwx1pwvaya97c0ur.png" alt="Warp terminal" width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  React Native environment
&lt;/h2&gt;

&lt;p&gt;Now it's time to configure the React Native environment. While I'll describe the main steps here, it's important to refer to the &lt;a href="https://reactnative.dev/docs/environment-setup" rel="noopener noreferrer"&gt;React Native documentation&lt;/a&gt; to ensure that no additional configurations or different steps are required.&lt;/p&gt;
&lt;h3&gt;
  
  
  iOS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Update Ruby&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MacOS 13.2 is shipped with Ruby 2.6.10, which is &lt;strong&gt;not&lt;/strong&gt; what is required by this version of React Native (2.7.6). &lt;/p&gt;

&lt;p&gt;The easiest approach I found is to update Ruby using the &lt;strong&gt;RVM Ruby version manager&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer | bash &lt;span class="nt"&gt;-s&lt;/span&gt; stable
rvm &lt;span class="nb"&gt;install &lt;/span&gt;ruby@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the ruby default, replacing the X.X.X with the installed version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rvm use ruby-X.X.X &lt;span class="nt"&gt;--default&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Install CocoaPods
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;cocoapods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Install Xcode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download on the App Store.&lt;/p&gt;

&lt;h3&gt;
  
  
  Android
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Install the JDK 11 (LTS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download the .dmg file, and follow the installer steps.&lt;br&gt;
&lt;a href="https://www.azul.com/downloads/?version=java-11-lts&amp;amp;os=macos&amp;amp;architecture=arm-64-bit&amp;amp;package=jdk#zulu" rel="noopener noreferrer"&gt;Mac Apple Silicon JDK 11 Download&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.azul.com/downloads/?version=java-11-lts&amp;amp;os=macos&amp;amp;architecture=x86-64-bit&amp;amp;package=jdk#zulu" rel="noopener noreferrer"&gt;Mac Intel JDK 11 Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify if the installation succeeds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a folder to install the Android SDK. I like to create on ~/Android and named it as Sdk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; ~/Android/Sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following lines to your ~/.zshrc file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
export ANDROID_HOME=~/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;NOTE:&lt;/em&gt;&lt;/strong&gt;  Make sure of the variables JAVA_HOME (path where you installed the JDK) and ANDROID_HOME (path of the folder you created to install the Android SDK).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Download Android Studio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download and execute the .dmg file:&lt;br&gt;
&lt;a href="https://developer.android.com/studio" rel="noopener noreferrer"&gt;Android Studio Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After installing Android Studio, the first time you open it you will need to make some configurations.&lt;/p&gt;

&lt;p&gt;If the first screen asks if you want to import settings, choose &lt;strong&gt;"Do not import"&lt;/strong&gt; and click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After that, it should ask for the type of installation. Choose the &lt;strong&gt;Custom&lt;/strong&gt; option.&lt;/p&gt;

&lt;p&gt;Then, it should ask you to select the &lt;strong&gt;JDK path&lt;/strong&gt;, make sure to choose the path you used in the &lt;strong&gt;JAVA_HOME&lt;/strong&gt; variable previously.&lt;/p&gt;

&lt;p&gt;After selecting the JDK path, Android Studio should ask for the theme.&lt;/p&gt;

&lt;p&gt;After that, it should ask what you want to install and the path to install the Android SDK. Check all options and in the path, &lt;strong&gt;select the folder you created earlier&lt;/strong&gt; (in my case it was /Users/ambegossi/Android/Sdk).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfryg5tjw01kqt33uoxx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfryg5tjw01kqt33uoxx.png" alt="Android Studio" width="800" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything is correct, just click on &lt;strong&gt;Next&lt;/strong&gt; and then on &lt;strong&gt;Finish&lt;/strong&gt; on the next screen.&lt;/p&gt;
&lt;h3&gt;
  
  
  Flipper
&lt;/h3&gt;

&lt;p&gt;Flipper is a platform for debugging React Native apps. It's nice to visualize, inspect, and control your apps from a desktop interface. &lt;/p&gt;

&lt;p&gt;Download the .dmg file on the &lt;a href="https://fbflipper.com" rel="noopener noreferrer"&gt;official website&lt;/a&gt; and install it like any other app.&lt;/p&gt;
&lt;h3&gt;
  
  
  Expo
&lt;/h3&gt;

&lt;p&gt;At the time of this publication, the Expo Go app from Expo is not yet supported by the new Apple chips. So I had to install Rosetta 2 so my apps wouldn't crash as soon as I opened them in the simulator.&lt;/p&gt;

&lt;p&gt;To install Rosetta 2 run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;softwareupdate --install-rosetta --agree-to-license
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Other apps
&lt;/h2&gt;

&lt;p&gt;There are some other apps that I use and always install after formatting my computer. They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VSCode&lt;/li&gt;
&lt;li&gt;AltTab (Windows alt-tab on macOS)&lt;/li&gt;
&lt;li&gt;Spark Mail&lt;/li&gt;
&lt;li&gt;Cron Calendar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These last two, I thank my coworker Vini for the recommendation.&lt;/p&gt;

&lt;p&gt;If this post helped you, please show your support by liking and comment below if you have any suggestions 😉&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>reactnative</category>
      <category>productivity</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
