<?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>Forem: Lacerda</title>
    <description>The latest articles on Forem by Lacerda (@henriquepablo).</description>
    <link>https://forem.com/henriquepablo</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%2F2905287%2Ffff6d766-66ca-490f-8753-d4f252121144.jpeg</url>
      <title>Forem: Lacerda</title>
      <link>https://forem.com/henriquepablo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/henriquepablo"/>
    <language>en</language>
    <item>
      <title>Como Interceptar Notificações no Android com OneSignal</title>
      <dc:creator>Lacerda</dc:creator>
      <pubDate>Tue, 06 Jan 2026 19:23:00 +0000</pubDate>
      <link>https://forem.com/henriquepablo/como-interceptar-notificacoes-no-android-com-onesignal-35nk</link>
      <guid>https://forem.com/henriquepablo/como-interceptar-notificacoes-no-android-com-onesignal-35nk</guid>
      <description>&lt;p&gt;Neste tutorial, vou mostrar passo a passo como interceptar as notificações do seu aplicativo que está integrado ao OneSignal.&lt;/p&gt;

&lt;p&gt;Isso permitirá que você tenha total controle sobre o fluxo da notificação antes que ela seja exibida ao usuário.&lt;/p&gt;

&lt;p&gt;Todo o passo a passo será realizado no &lt;strong&gt;Android&lt;/strong&gt;, utilizando Expo Bare Workflow e OneSignal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Este tutorial assume que o OneSignal já esteja configurado e aborda exclusivamente a interceptação de notificações.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos iniciar o tutorial.&lt;/p&gt;

&lt;p&gt;No seu projeto, procure pela pasta Android, pois é nela que vamos trabalhar, ou seja, iremos mexer com código nativo e não com JS/TS.&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%2Ft24jrud1jq1dupyjdyvc.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%2Ft24jrud1jq1dupyjdyvc.png" alt=" " width="500" height="1404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro da pasta Android, procure por app -&amp;gt; src -&amp;gt; main -&amp;gt; java e vamos criar um novo arquivo. Olhe o exemplo abaixo na imagem.&lt;/p&gt;

&lt;p&gt;Eu dei o nome de &lt;strong&gt;NotificationServiceExtension&lt;/strong&gt; com a extensão java&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%2Fktidwgppvmap92afmiz7.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%2Fktidwgppvmap92afmiz7.png" alt=" " width="754" height="788"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro desse arquivo, é onde nós iremos trabalhar para poder interceptar as notificações.&lt;/p&gt;

&lt;p&gt;Vamos criar uma classe, implementar uma interface e sobrescrever um método.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.lacerda.mobile.notification; // mude para o seu pacote

import androidx.annotation.Keep;
import com.onesignal.notifications.IActionButton;
import com.onesignal.notifications.IDisplayableMutableNotification;
import com.onesignal.notifications.INotificationReceivedEvent;
import com.onesignal.notifications.INotificationServiceExtension;

@Keep
public class NotificationServiceExtension implements INotificationServiceExtension {

     @Override
     public void onNotificationReceived(INotificationReceivedEvent event) {
        IDisplayableMutableNotification notification = event.getNotification();

        Log.d("NotificationService", "Recebendo notificação");
        Log.d("NotificationService", "Corpo: " + notification.getAdditionalData());
     }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com esse código, se você receber uma notificação, será possível ver o conteúdo dela no console. Mas ainda falta um passo importante para essa classe realmente funcionar, que é dizer para o SDK do OneSignal que ele precisar chamar a nossa classe, e isso é feito no AndroidManifest.xml&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%2Fhvgfney5iyjqfak606z1.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%2Fhvgfney5iyjqfak606z1.png" alt=" " width="702" height="746"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Será necessário colocar a seguinte linha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;meta-data 
    android:name="com.onesignal.NotificationServiceExtension"
    android:value="com.lacerda.mobile.notification.NotificationServiceExtension" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Preste atenção que o value deve apontar exatamente para a classe que acabamos de criar. O &lt;em&gt;com.lacerda.mobile.notification&lt;/em&gt; é o meu pacote, coloque exatamente o seu. &lt;/p&gt;

&lt;p&gt;Agora veja como fica no AndroidManifest:&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%2Fuhwg58q8046rw4whkpre.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%2Fuhwg58q8046rw4whkpre.png" alt=" " width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com tudo configurado, sempre que uma notificação for recebida, a classe responsável irá interceptá-la e exibir seu conteúdo no console. A partir desse ponto, é possível executar outras ações, como acordar o aplicativo ou exibir uma tela de chamada.&lt;/p&gt;

&lt;p&gt;É possível consultar a própria documentação do OneSignal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://documentation.onesignal.com/docs/en/service-extensions#prevent-notification-from-displaying" rel="noopener noreferrer"&gt;https://documentation.onesignal.com/docs/en/service-extensions#prevent-notification-from-displaying&lt;/a&gt;&lt;/p&gt;

</description>
      <category>expo</category>
      <category>reactnative</category>
      <category>onesignal</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Fonts personalizadas no Swift e UIkit</title>
      <dc:creator>Lacerda</dc:creator>
      <pubDate>Fri, 05 Dec 2025 23:12:04 +0000</pubDate>
      <link>https://forem.com/henriquepablo/fonts-personalizadas-no-swift-e-uikit-1j4k</link>
      <guid>https://forem.com/henriquepablo/fonts-personalizadas-no-swift-e-uikit-1j4k</guid>
      <description>&lt;p&gt;Nesse tutorial vou demonstrar como utilizar fonts personalizadas no Swift com UIKit. &lt;/p&gt;

&lt;p&gt;Vou demonstrar com a font Montserrat e a Hind. Elas podem ser baixadas direto do Google Fonts.&lt;/p&gt;

&lt;p&gt;Depois de ter baixado as fonts, extraia o zip e normalmente o que nos interessa está dentro da pasta &lt;strong&gt;static&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Eu não vou usar todas as fonts que vem no pacote, apenas algumas. São elas: &lt;br&gt;
&lt;strong&gt;Montserrat-Regular, Montserrat-SemiBold, Hind-Medium e Hind-Regular&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Na raiz do seu projeto crie as pastas com os nomes das fonts que irá utilizar. 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%2F2ib5r4x02kvi83vyfoid.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%2F2ib5r4x02kvi83vyfoid.png" alt=" " width="580" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E dentro de cada pasta coloque as variáveis de fonts que irá utilizar. 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%2Fgjrcmem7dc7b9jk8facu.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%2Fgjrcmem7dc7b9jk8facu.png" alt=" " width="574" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito, isso, devemos configurar elas no infoplist do projeto e adicionar elas.&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%2Fswqe510leh5u341gurl5.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%2Fswqe510leh5u341gurl5.png" alt=" " width="572" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Iremos adicionar uma nova propriedade, o nome é:** Fonts provided by application**. Essa prop vai ser um array e vai ser permitir configurar mais de uma font.&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%2Fzi1xy7jpzapfq9skfuay.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%2Fzi1xy7jpzapfq9skfuay.png" alt=" " width="800" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O valor de cada chave deve ser exatamente o nome da font junto com a extensão. Se digitar errado, ela não vai funcionar.&lt;/p&gt;

&lt;p&gt;Depois disso é só utilizar a font nas suas interfaces.&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%2F7qzcrjndq3b39hanzvy8.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%2F7qzcrjndq3b39hanzvy8.png" alt=" " width="536" height="26"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse foi um tutorial rápido de como usar fonts diferentes no seu projeto. Espero que tenha ajudado de alguma forma.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como configurar um projeto Swift sem StoryBoard</title>
      <dc:creator>Lacerda</dc:creator>
      <pubDate>Fri, 07 Nov 2025 12:27:30 +0000</pubDate>
      <link>https://forem.com/henriquepablo/como-configurar-um-projeto-swift-sem-storyboard-fe0</link>
      <guid>https://forem.com/henriquepablo/como-configurar-um-projeto-swift-sem-storyboard-fe0</guid>
      <description>&lt;p&gt;&lt;strong&gt;Atenção!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;para seguir com o post, é necessário possuir um computador da Apple e ter instalado o Xcode&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Quando criamos um novo projeto no Xcode, ele geralmente vem configurado para usar Storyboards na construção das telas. Porém, em muitos casos, trabalhar diretamente com UIKit em código pode ser mais simples, flexível e organizado.&lt;/p&gt;

&lt;p&gt;Neste post vou explicar, passo a passo, como remover o Storyboard e configurar a interface inicial do app usando apenas Swift + UIKit.&lt;/p&gt;

&lt;p&gt;Vamos começar abrindo o Xcode e criando um novo projeto.&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%2Fnrtp1r7ss6qunnyslru5.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%2Fnrtp1r7ss6qunnyslru5.png" alt=" " width="800" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecione a opção para criar um projeto. Depois de selecionado, ele vai mostrar uma tela onde iremos selecionar um template para o projeto.&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%2Fytmyogyrbxm4pefw6u5l.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%2Fytmyogyrbxm4pefw6u5l.png" alt=" " width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aperte em &lt;strong&gt;next&lt;/strong&gt;, na próxima tela irá pedir o nome do projeto. Deixe a parte de interface com a opção &lt;strong&gt;StoryBoard&lt;/strong&gt; selecionada e a linguagem com &lt;strong&gt;Swift&lt;/strong&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%2Fgy6qdbnydenbia1w1ovr.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%2Fgy6qdbnydenbia1w1ovr.png" alt=" " width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecione onde deseja Salvar esse projeto e aperte em &lt;strong&gt;create&lt;/strong&gt;. Agora temos um projeto criado com Swift e StoryBoard. Mas nós não queremos o StoryBoard e sim Swift e UIKit. Então, precisaremos fazer mais algumas configurações.&lt;/p&gt;

&lt;p&gt;Quando o projeto for criado, tu irá ver que no lado esquerdo existem alguns arquivos que vieram de forma padrão:&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%2F31tqelmmhvep7bta4tho.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%2F31tqelmmhvep7bta4tho.png" alt=" " width="534" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tem dois arquivos que iremos apagar, eles são: Main e o LaunchScreen, eles são arquivos para se trabalhar com StoryBoard. Então, pode apagar esses dois arquivos sem nenhum problema.&lt;/p&gt;

&lt;p&gt;Depois de apagado deve ficar assim:&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%2Fr18x93fgmaikdlxtnqb6.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%2Fr18x93fgmaikdlxtnqb6.png" alt=" " width="538" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos continuar a configuração. Selecione a opção de mais alto nível no seu projeto:&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%2Fzrbtcnucsy1a9074e44s.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%2Fzrbtcnucsy1a9074e44s.png" alt=" " width="548" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ele abre as opções do seu projeto. Veja que existe uma lista de opções. Selecione a &lt;strong&gt;Info&lt;/strong&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%2Fdoy00xdrv8odrn2vwd2o.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%2Fdoy00xdrv8odrn2vwd2o.png" alt=" " width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Procure por uma opção por Application Scene Manifest e depois por StoryBoard Name e apague essa opção.&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%2F868v7ytdgilvhony5kuo.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%2F868v7ytdgilvhony5kuo.png" alt=" " width="800" height="167"&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%2F1xosl6o9wwek57hx34ni.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%2F1xosl6o9wwek57hx34ni.png" alt=" " width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ainda no &lt;strong&gt;Info&lt;/strong&gt; procure por &lt;strong&gt;Launch screen interface file base name&lt;/strong&gt; e troque o valor para &lt;strong&gt;SplashViewController&lt;/strong&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%2F9e5z24a0tbk7wkyb10l2.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%2F9e5z24a0tbk7wkyb10l2.png" alt=" " width="800" height="22"&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%2Fp3g90gnwlp8t13mxzxva.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%2Fp3g90gnwlp8t13mxzxva.png" alt=" " width="800" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, selecione a opção Build Settings, onde iremos fazer mais uma coisa. No campo filter procure por main.&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%2F14bmp9e67ayfyd69smbi.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%2F14bmp9e67ayfyd69smbi.png" alt=" " width="800" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em baixo de build options há uma parte &lt;strong&gt;Info.plist Values&lt;/strong&gt;. Selecione o último item e apague ele.&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%2Fmnq3vb0gz49yq83qylp8.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%2Fmnq3vb0gz49yq83qylp8.png" alt=" " width="800" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estamos quase chegando no final. Iremos configurar o último arquivo. Volte na aba esquerda onde ficam os arquivos do projeto e selecione o arquivo &lt;strong&gt;SceneDelegate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vou colar um código aqui, onde tu vai poder copiar e colar no seu.&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%2Ffln9dsv5n2xog4902b36.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%2Ffln9dsv5n2xog4902b36.png" alt=" " width="800" height="250"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let windowScene = (scene as? UIWindowScene) else { return }

        let window = UIWindow(windowScene: windowScene)

        let viewController = UIViewController();

        viewController.view.backgroundColor = .red

        let navigation = UINavigationController(rootViewController: viewController)

        window.rootViewController = navigation

        self.window = window
        window.makeKeyAndVisible()

    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois disso rode o projeto em um Emulador ou dispositivo Real e veja se tudo irá ocorrer normalmente. Em caso afirmativo, tu deverá ver uma tela vermelha, ela é uma tela que nós acabamos de criar, mas em código. Essa criação esta na linha 23 e linha 25 nós falamos que o background vai ser vermelho.&lt;/p&gt;

&lt;p&gt;Esse foi o post de como configurar um projeto Swift com UIKit. Depois quero criar outros posts, onde ensino como utilizar elementos como UILabel, UIView, UIScrollView, UIImageView, etc.&lt;/p&gt;

</description>
      <category>swift</category>
      <category>uikit</category>
      <category>ios</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Criar Builds de App RN</title>
      <dc:creator>Lacerda</dc:creator>
      <pubDate>Sun, 02 Nov 2025 16:54:19 +0000</pubDate>
      <link>https://forem.com/henriquepablo/criar-builds-de-app-rn-27bg</link>
      <guid>https://forem.com/henriquepablo/criar-builds-de-app-rn-27bg</guid>
      <description>&lt;p&gt;Neste post vou estar explicando como criar builds do seu app expo para conseguir publicar nas lojas (Apple e Google Play).&lt;/p&gt;

&lt;p&gt;Vou considerar que tu já tem um app e quer apenas criar a build dele, seja de forma local (utilizando a sua própria máquina) ou de forma remota, utilizando o EAS (Expo Application Service).&lt;/p&gt;

&lt;p&gt;O primeiro passo que deve ser feito é, criar uma conta no site, procure por &lt;strong&gt;eas login expo&lt;/strong&gt;. Caso já tenha uma conta, pode pular essa parte. Mas de forma resumida esse serviço da Expo nos permite criar os builds do nosso app, automatizar a publicação do app nas lojas, etc.&lt;/p&gt;

&lt;p&gt;Depois de ter criado a conta no site, será necessário instalar o EAS CLI na nossa máquina. Na documentação oficial ela nos da o seguinte comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install -g eas-cli&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Então, com esse comando, nós estaremos instalando o EAS-CLI na nossa máquina de forma global.&lt;/p&gt;

&lt;p&gt;Depois, de instalado, nós precisamos fazer o login, mas dessa vez, será direto pelo terminal, para podemos configurar o app no serviço da EXPO e conseguir fazer os builds.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eas login&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nesse processo tu fazer login na conta que acabou de criar. Feito isso, nós vamos poder começar a configurar o aplicativo no serviço.&lt;/p&gt;

&lt;p&gt;No terminal, rode o seguinte comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eas build:configure&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ele irá pergunta ser tu quer configurar o aplicativo para todas as plataformas ou de forma individual. Pode selecionar qualquer uma das opções, se selecionar todas, não irá precisar configurar outra plataforma depois, se selecionar só uma, vai precisar configurar a outra, caso queira fazer build para a aquela plataforma.&lt;/p&gt;

&lt;p&gt;Depois desse processo, tu vai notar que na raiz do seu projeto irá surgir um novo arquivo, ele se chama &lt;strong&gt;eas.json&lt;/strong&gt;, dentro dele há algumas coisas, onde fazemos configurações, como enviar o app para a loja com o EAS Submit e fazer build do app. Nesse arquivo, nós organizamos por perfis, ou seja, temos o perfil de produção (build específico para loja), preview (APK, por exemplo).&lt;/p&gt;

&lt;p&gt;Abaixo, vou estar colocando um template que sempre utilizo no meu eas.json. Veja que nele não há nada demais. Temos o atributo Build e submit e dentro de cada um temos os perfis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "cli": {
    "version": "&amp;gt;= 16.6.1",
    "appVersionSource": "remote"
  },
  "build": {
        "development": {
            "developmentClient": true,
            "distribution": "internal"
        },
        "preview": {
            "android": {
                "distribution": "internal",
                "image": "ubuntu-22.04-jdk-17-ndk-r26b",
                "autoIncrement": "versionCode"
            },
            "ios": {
                "simulator": true,
                "autoIncrement": "buildNumber"
            }
        },
        "production": {
            "autoIncrement": true,
            "android": {
                "autoIncrement": "versionCode",
                "image": "ubuntu-22.04-jdk-17-ndk-r26b"
            }
        }
    },
    "submit": {
        "production": {}
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que dentro de build, temos três perfis, mas normalmente eu só uso o de preview e production. E dentro de cada perfil, eu coloquei algumas configurações, dentro de &lt;strong&gt;android&lt;/strong&gt; eu coloquei uma versão específica do java, pois na hora do build, o serviço estava usando uma versão que estava dando conflito na hora build, mas isso apenas no Android.&lt;/p&gt;

&lt;p&gt;Com esse arquivo configurado, nós temos, duas opções para realizar o build. Podemos fazer na nuvem (Serviço EAS) ou local, usando a nossa própria máquina. (Para builds do IOS de forma local, será necessário possuir um MacBook).&lt;/p&gt;

&lt;p&gt;Build na nuvem IOS: &lt;/p&gt;

&lt;p&gt;O comando é composto por algumas partes, primeiro chamamos o eas cli que instalamos, depois falamos para qual plataforma vai ser o build e qual é o perfil (preview ou production)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eas build -p iOS --profile production&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para fazer build do Android é a mesma coisa, só precisamos alterar a plataforma.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eas build -p android --profile production&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ou se quiser, fazer o build direto para as duas plataformas:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eas build -p all --profile production&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ele vai fazer o build para Android e IOS.&lt;/p&gt;

&lt;p&gt;Caso queira fazer o build de forma local é só passar o parâmetro '--local no final':&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eas build -p android --profile production --local&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se tu quiser gerar o APK do app e distribuir sem passar pela loja, troque o production por preview.&lt;/p&gt;

&lt;p&gt;Esse foi o passo a passo de como usar o EAS para executar os builds dos nossos apps.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Tipando rotas no React Native</title>
      <dc:creator>Lacerda</dc:creator>
      <pubDate>Mon, 21 Apr 2025 13:28:32 +0000</pubDate>
      <link>https://forem.com/henriquepablo/tipando-rotas-no-react-native-jk</link>
      <guid>https://forem.com/henriquepablo/tipando-rotas-no-react-native-jk</guid>
      <description>&lt;p&gt;Neste post, vou mostrar como tipar as rotas no React Native usando TypeScript, garantindo segurança e autocompletar durante a navegação.&lt;/p&gt;

&lt;p&gt;Vou considerar que você já saiba o que é o React Navigation e que já tenha utilizado pelo menos uma vez.&lt;/p&gt;

&lt;p&gt;Então vamos aprender como tipar as rotas.&lt;/p&gt;

&lt;p&gt;Com o React Navigation já instalado e configurado no seu projeto, vamos ver o que acontece quando não tipamos as rotas.&lt;/p&gt;

&lt;p&gt;Veja o exemplo na 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%2F1u9caq2xjyw3mqx0sst5.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%2F1u9caq2xjyw3mqx0sst5.png" alt="Image description" width="450" height="42"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;essa abordagem funciona, mas o typescript fica reclamando. Então como  fazer para ele parar de reclamar?&lt;/p&gt;

&lt;p&gt;Dentro da pasta &lt;strong&gt;src&lt;/strong&gt; do seu projeto, crie um pasta chamada de &lt;strong&gt;@types&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A estrutura deve ficar assim:&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%2F17ok9srwzw7e8gfogj0l.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%2F17ok9srwzw7e8gfogj0l.png" alt="Image description" width="418" height="88"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em questões de organização, essa pasta nos diz que ali fica as tipagens do nosso projeto.&lt;/p&gt;

&lt;p&gt;Agora crie um arquivo chamado de &lt;strong&gt;&lt;em&gt;navigation.d.ts&lt;/em&gt;&lt;/strong&gt; dentro da pasta &lt;strong&gt;@types&lt;/strong&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%2F95kmqm2k6d6w7kubq6mo.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%2F95kmqm2k6d6w7kubq6mo.png" alt="Image description" width="422" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nós iremos trabalhar dentro desse arquivo.&lt;/p&gt;

&lt;p&gt;Primeiro vamos fazer uma declaração global:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export declare global { // declaração global


}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos acessar o namespace que é o mesmo usado internamente pela lib &lt;strong&gt;@react-navigation/native.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export declare global { // declaração global
  namespace ReactNavigation { // lib do React Navigation

  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois disso vamos criar uma interface com o RootParamList do React Navigation, pois ele é o responsável por dizer quais rotas existem e quais parâmetros cada uma espera.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export declare global { // declaração global
  namespace ReactNavigation { // lib do React Navigation
    interface RootParamList { // informa quais rotas existem

    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E dentro dessa interface nós falamos as nossas rotas e se elas esperam algum parâmetro.&lt;/p&gt;

&lt;p&gt;No início do post eu mostrei com a rota chamada &lt;strong&gt;new&lt;/strong&gt; e o typescript estava reclamando, agora vamos passar essa rota nessa interface que acabamos de fazer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export declare global { // declaração global
  namespace ReactNavigation { // lib do React Navigation
    interface RootParamList { // informa quais rotas existem
       new: undefined;
       // o primeiro atributo diz qual é o nome da rota
       // o segundo atributo diz quais parâmetros aquela rota tem
       // como a minha rota não tem parâmetro, então coloquei
       // undefined
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora já temos a rota configurada e o typescript não vai mais ficar reclamando. E se você tiver mais rotas o auto-completar vai mostrar quais rotas tem disponíveis.&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%2Fmme4jwlqsu5sem3ls993.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%2Fmme4jwlqsu5sem3ls993.png" alt="Image description" width="422" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Parâmetros
&lt;/h2&gt;

&lt;p&gt;Se a sua rota tiver parâmetros, então você precisa dizer o nome dele e o seu tipo, por exemplo, vamos imaginar que a rota &lt;strong&gt;new&lt;/strong&gt; recebe o parâmetro &lt;strong&gt;nome&lt;/strong&gt;, então na declaração daquele arquivo de tipagem iremos fazer o seguinte.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export declare global { // declaração global
  namespace ReactNavigation { // lib do React Navigation
    interface RootParamList { // informa quais rotas existem
       new: {
        nome: string 
        // primeiro atributo, nome do parâmetro
        // segundo atributo, tipo do parâmetro
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E quando você navegar para essa rota, o typescript vai informar se aquela rota espera ou não um parâmetro.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
      <category>reactnavigation</category>
    </item>
    <item>
      <title>Path Mapping no React Native</title>
      <dc:creator>Lacerda</dc:creator>
      <pubDate>Sun, 20 Apr 2025 20:31:58 +0000</pubDate>
      <link>https://forem.com/henriquepablo/path-mapping-no-react-native-2oem</link>
      <guid>https://forem.com/henriquepablo/path-mapping-no-react-native-2oem</guid>
      <description>&lt;p&gt;Vou estar mostrando como deixar as importações no React Native de forma mais elegante, deixando-as mais dinâmicas.&lt;/p&gt;

&lt;p&gt;Em vez de usarmos aquela importação de &lt;strong&gt;../../components&lt;/strong&gt; podemos usar &lt;strong&gt;@components&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;veja exemplos nas imagens 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%2Fp1em754yka4qf032kh0f.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%2Fp1em754yka4qf032kh0f.png" alt="Image description" width="800" height="41"&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%2Fj3lcni6fxv99vutnoaft.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%2Fj3lcni6fxv99vutnoaft.png" alt="Image description" width="462" height="44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Primeiro, comece instalando a seguinte dependência:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add babel-plugin-module-resolver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install babel-plugin-module-resolver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, procure na raiz do seu projeto o seguinte arquivo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;babel.config.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nele iremos fazer algumas configurações que será o path personalizado que iremos utilizar.&lt;/p&gt;

&lt;p&gt;Dentro desse arquivo deve existir alguma configuração com presets.&lt;/p&gt;

&lt;p&gt;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%2Fvp2jkn2fk2xonm96cd5j.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%2Fvp2jkn2fk2xonm96cd5j.png" alt="Image description" width="450" height="42"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coloque uma vírgula depois dessa configuração, pois iremos fazer a nossa.&lt;/p&gt;

&lt;p&gt;primeiro comece colocando da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins: [

],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro dos colchetes abre outro e coloque entre aspas o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;'module-resolver'&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins: [
  [
    'module-resolver'
  ]
],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora coloque uma vírgula depois de module-resolver e abra chaves, pois vamos fazer o mapeamento dos caminhos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins: [
  [
    'module-resolver',
    {

    }
  ]
],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro de chaves colocamos o seguinte atributo para apontar para a pasta principal dos nosso arquivos, normalmente criamos uma pasta chamada de src e vamos estruturando nosso projeto ali.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins: [
  [
    'module-resolver',
    {
      root: ['./src'], // pasta raiz dos nossos arquivos
    }
  ]
],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos dizer como deve ser o alias dessas pastas que estão dentro de src.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins: [
  [
    'module-resolver',
    {
      root: ['./src'], // pasta raiz dos nossos arquivos
      alias: {
        '@components': './src/components'
        // o primeiro atributo diz como vai ser o alias (apeliado)
        // o segundo atributo é o caminho daquela pasta.
        // você pode fazer com outras pastas, exemplo:
        // assets, screens, styles.
      }
    }
  ]
],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Typescript&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;se você estiver usando typescript, mais um passo deve ser realizado para ele entender a nossa configuração.&lt;/p&gt;

&lt;p&gt;no arquivo tsconfig.json, vamos fazer umas configurações também.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "extends": "expo/tsconfig.base",
    "compilerOptions": {
        "strict": true,
        "baseUrl": "./",
        "paths": {
            "@components/*": ["./src/components/*"],


        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora você já pode iniciar a sua aplicação e testar a nova forma de importação.&lt;/p&gt;

&lt;p&gt;Lembre, sempre que fazer um mapeamento de uma nova importação, é preciso primeiro, fazer no babel.config.js e se estiver usando typescript, também é necessário colocar no arquivo tsconfig.json. Depois é só iniciar a aplicação, se algo der errado, limpe o cache da aplicação e teste novamente. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fonts Personalizadas no React Native CLI</title>
      <dc:creator>Lacerda</dc:creator>
      <pubDate>Sat, 01 Mar 2025 13:36:38 +0000</pubDate>
      <link>https://forem.com/henriquepablo/fonts-personalizadas-no-react-native-cli-3g8f</link>
      <guid>https://forem.com/henriquepablo/fonts-personalizadas-no-react-native-cli-3g8f</guid>
      <description>&lt;p&gt;&lt;strong&gt;Como Personalizar Fonts no React Native CLI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Primeiro, vamos montar uma estrutura de pastas no nosso projeto (Estou utilizando o vscode).&lt;/p&gt;

&lt;p&gt;Vamos criar a seguinte estrutura &lt;em&gt;&lt;strong&gt;src &amp;gt; assets &amp;gt; fonts&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A imagem abaixo demonstra como deve ficar depois de criado essa estrutura.&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%2F3ewm2kkn2y0j5gx4lqlg.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%2F3ewm2kkn2y0j5gx4lqlg.png" alt="Image description" width="688" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de termos feito isso, devemos acessar o Google Fonts e escolher a font que queremos utilizar.&lt;/p&gt;

&lt;p&gt;link do Google Fonts:&lt;br&gt;
&lt;em&gt;&lt;strong&gt;&lt;a href="https://fonts.google.com" rel="noopener noreferrer"&gt;https://fonts.google.com&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eu escolhi a Roboto, você pode estar escolhendo outra.&lt;/p&gt;

&lt;p&gt;Depois de ter escolhido a font, baixe ela e extraia o zip.&lt;/p&gt;

&lt;p&gt;Quando você extrair,  uma pasta vai ser gerada, igual 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%2Flpcpwm6pzi05672b4k34.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%2Flpcpwm6pzi05672b4k34.png" alt="Image description" width="688" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acesse essa pasta que foi gerada e dentro dela hávera pasta outra chamada de &lt;strong&gt;&lt;em&gt;static&lt;/em&gt;&lt;/strong&gt;, ela possui o conteúdo que nos interessa.&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%2Fcrfnpu89fhek9yvp2r9y.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%2Fcrfnpu89fhek9yvp2r9y.png" alt="Image description" width="688" height="926"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copie tudo que está dentro dela e cole dentro da pasta fonts que criamos na estrutura de pastas do projeto.&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%2Fjk82p4w5spouwalvowze.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%2Fjk82p4w5spouwalvowze.png" alt="Image description" width="688" height="1428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito isso, vamos criar um arquivo de configuração na raiz do projeto.&lt;/p&gt;

&lt;p&gt;O nome do arquivo é: &lt;strong&gt;react-native.confg.js&lt;/strong&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%2Fa49tngpoejyv7lb83a9n.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%2Fa49tngpoejyv7lb83a9n.png" alt="Image description" width="688" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;cole o seguinte conteúdo dentro dele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = {
    project: {
      ios: {},
      android: {},
    },
    assets: ['./src/assets/fonts'],
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa configuração garante que as fonts personalizadas sejam disponibilizadas pelo nosso aplicativo.&lt;/p&gt;

&lt;p&gt;Agora temos que executar o seguinte comando no terminal para fazer esse vínculo das fonts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;npx react-native-asset&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Caso você esteja fazendo essa configuração para o Iphone, faça essas passos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ios
pod install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de ter feito isso, a font deve ter sido configurada corretamente e agora podemos utilizar nossa font customizada.&lt;/p&gt;

&lt;h2&gt;
  
  
  A imagem abaixo mostra como utilizar a font:
&lt;/h2&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%2Ft3zv9expiubd0ac0difu.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%2Ft3zv9expiubd0ac0difu.png" alt="Image description" width="800" height="745"&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%2Fm8nf0q9erzz8fsynp5ic.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%2Fm8nf0q9erzz8fsynp5ic.png" alt="Image description" width="702" height="1440"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
