<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Experiência do usuário - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Experiência do usuário - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 06 Oct 2026 06:06:43 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/experiencia-do-usuario/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como detectar o dispositivo em uso para melhorar a experiência do usuário ]]>
                </title>
                <description>
                    <![CDATA[ Há algum tempo, assisti a uma fala incrível no Chrome Dev Summit sobre desempenho em dispositivos lentos. Achei sensacional todo o trabalho feito pela empresa do Facebook na identificação de dispositivos para criar uma experiência de usuário melhor. Avancemos até recentemente, quando me decidi a estudar um pouco mais sobre ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-detectar-o-dispositivo-em-uso-para-melhorar-a-experiencia-do-usuario/</link>
                <guid isPermaLink="false">663801230e369603f905e937</guid>
                
                    <category>
                        <![CDATA[ Experiência do usuário ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Sun, 05 May 2024 22:32:57 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/5f9c9dde740569d1a4ca3a1c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/exploring-device-detection-for-better-user-experiences-in-2020/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Detect Your User's Device So You can Improve Their User Experience</a>
      </p><p>Há algum tempo, assisti a uma fala incrível no Chrome Dev Summit sobre desempenho em dispositivos lentos.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/puUPpVrIRkc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Adaptive Loading - Improving web performance on slow devices (Chrome Dev Summit 2019)" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p>Achei sensacional todo o trabalho feito pela empresa do Facebook na identificação de dispositivos para criar uma experiência de usuário melhor. Avancemos até recentemente, quando me decidi a estudar um pouco mais sobre o assunto e ver o que eu podia fazer na <a href="https://www.thinkific.com/">Thinkific</a> (a empresa para a qual eu trabalho).</p><h2 id="agentes-do-usu-rio"><strong>Agentes do usuário</strong></h2><p>Agentes de usuário são bem conhecidos pelos desenvolvedores. Nós os utilizamos para detectar <em>bots</em>, redirecionar usuários para uma versão específica do nosso site ou para anexar classes de CSS à nossa página para criarmos experiências diversas.</p><p>Na Thinkific, já utilizamos o <a href="https://github.com/fnando/browser">browser Ruby gem</a> para analisar o agente de usuário (o navegador) e para obter informações relevantes (detecção de bots, por exemplo). Assim, decidi persistir as informações principais em uma tabela visitante_dispositivo, cujo esquema você vê abaixo:</p><!--kg-card-begin: html--><table border="0" cellpadding="0" cellspacing="0" style="border: 0px; box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll;"><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; background-position: 100% 0px;"><div class="container" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><div class="line number1 index0 alt2" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><code class="plain plain" style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">tenant_id: a escola criadora do curso que o visitanto está conferindo</code></div><div class="line number2 index1 alt1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><code class="plain plain" style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">raw: o agente de usuário puro</code></div><div class="line number3 index2 alt2" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><code class="plain plain" style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">tipo: desktop / celular / tablet / bot / outros</code></div><div class="line number4 index3 alt1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><code class="plain plain" style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">nome_do_navegador</code></div><div class="line number5 index4 alt2" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><code class="plain plain" style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">versão_do_navegador</code></div><div class="line number6 index5 alt1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><code class="plain plain" style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">nome_da_plataforma</code></div><div class="line number7 index6 alt2" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><code class="plain plain" style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">versão_da_plataforma</code></div><div class="line number8 index7 alt1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><code class="plain plain" style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">hardware: hstore contendo memória, processador, modelo_do_dispositivo, nome_do_dispositivo</code></div><div class="line number9 index8 alt2" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><code class="plain plain" style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">conexão: hstore contendo downlink_max, tipo_de_conexão</code></div></div></td></tr></tbody></table><!--kg-card-end: html--><p>Você provavelmente percebeu que algumas coisas não estão disponíveis na string do UA (agente do usuário). É hora de usar novas APIs do JavaScript:</p><h2 id="obtendo-informa-es-do-hardware-com-o-javascript"><strong>Obtendo informações do hardware com o JavaScript</strong></h2><p>Como pudemos ver no vídeo da Chrome Dev Summit, podemos usar o JS para obter essas informações.</p><h3 id="mem-ria"><strong>Memória</strong></h3><p><code>navigator.deviceMemory</code> retornará um número de ponto flutuante (decimal). Há algumas coisas que precisam ser consideradas aqui:</p><ul><li>Isso funciona apenas com o HTTPS</li><li>O suporte é bastante limitado (somente ao Chrome, basicamente)</li></ul><p>Mais informações (em inglês):</p><ul><li><a href="https://github.com/w3c/device-memory">Especificação da W3C</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigator/deviceMemory">Documentação da MDN</a></li><li><a href="https://caniuse.com/#feat=mdn-api_navigator_devicememory">Can I use deviceMemory</a></li></ul><h3 id="processadores"><strong>Processadores</strong></h3><p><code>navigator.hardwareConcurrency</code> retornará o número de <em>cores </em>lógicos da CPU do usuário. Há um <a href="https://caniuse.com/hardwareconcurrency">bom suporte</a> a esse recurso.</p><h2 id="detectando-informa-es-de-conex-o-usando-o-javascript"><strong>Detectando informações de conexão usando o JavaScript</strong></h2><p><code>navigator.connection</code> é uma API nova contendo informações sobre a conexão do sistema, como a largura de banda atual do dispositivo do usuário ou se a conexão é ou não mensurada. O suporte é bastante limitado (somente ao Chrome, basicamente), mas parece bastante promissor.</p><p>Mais informações (em inglês):</p><ul><li><a href="https://googlechrome.github.io/samples/network-information/">Exemplo no Chrome</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigator/connection">Documentação da MDN</a></li><li><a href="https://caniuse.com/#feat=netinfo">API de informações de rede (Net info) no Can I use</a></li></ul><h2 id="detectando-o-modelo-do-dispositivo"><strong>Detectando o modelo do dispositivo</strong></h2><p>O agente do usuário <em>pode</em> retornar algumas informações sobre o nome do modelo. O <a href="https://userstack.com/">userstack</a> é um serviço que oferece informações com base no agente do usuário. Ele funciona bem e é fácil de integrar. Porém, dependendo da sua necessidade, ele não pode ajudar.</p><p>Vamos pegar, por exemplo, os dispositivos da Apple. Seu agente de usuário é basicamente o mesmo. Assim, você não consegue diferenciar um iPad Pro de um iPad que rode o iOS mais recente. Para esses casos, você pode ter de precisar de uma detecção melhor, baseada na resolução, densidade dos pixels e outras informações do <em>hardware</em> expostas no navegador. Fiz uma pesquisa rápida a respeito e encontrei 3 produtos até o momento: <a href="https://web.wurfl.io/#wurfl-js">WURFL.io</a>, <a href="https://deviceatlas.com/products/web">DeviceAtlas</a> e <a href="https://51degrees.com/">51Degrees</a>. Ainda não tive tempo de experimentar com eles, mas quero muito fazer isso (e certamente publicarei a respeito).</p><h2 id="perguntas-frequentes"><strong>Perguntas frequentes</strong></h2><p><em>Pergunta<em>: </em>por que não usar o<em> Google Analytics/Mixpanel/Kibana/New Relic/</em>outra ferramenta qualquer<em>?</em></em></p><p>Podemos obter informações do navegador em outras ferramentas. No entanto, como sendo um produto SaaS, não usamos nossa própria propriedade do Google Analytics (os clientes adicionam sua propriedade). Além disso, bloqueadores de anúncio podem bloquear essas ferramentas de terceiros. Por fim, tendo essas informações do nosso lado, podemos nos adaptar melhor.</p><p><em>Pergunta<em>: </em>você tem uma lista de dispositivos fracos<em>/</em>robustos<em>?</em></em></p><p>Não. Talvez essa lista possa ser criada combinando o número de processadores e memória, mas eu não dediquei muito tempo a isso. Nesse projeto, um colega de trabalho criou um ajudante em Rails que poderia determinar se o usuário usava a versão <em>lite</em> ou a versão padrão de um site com base no <em>hardware</em>. Sobre esse tópico, é importante mencionar que a Facebook (atual Meta) tem uma biblioteca para o Android chamada <a href="https://github.com/facebook/device-year-class/">Device Year Class</a> (classe do ano do dispositivo).</p><p><em>O autor também publicou este artigo em seu <a href="https://leonardofaria.net/2020/01/15/exploring-device-detection-for-better-user-experiences-in-2020">blog pessoal</a><em>. </em>Se gostou deste conteúdo<em>, </em>siga-o no<em> <a href="https://twitter.com/leozera">Twitter</a> </em>e no<em> <a href="https://github.com/leonardofaria">GitHub</a>.</em></em></p><p>A empresa onde o autor trabalha, a Thinkific, frequentemente <a href="https://www.thinkific.com/careers/">contrata para diversos cargos</a> – caso seja de seu interesse.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
