Artigo Original no LinkedIn: https://www.linkedin.com/pulse/clear-hiit-path-building-my-first-app-two-problems-stood-gaskin-mbsoe
Este artigo conta a história do meu primeiro aplicativo publicado, desde a primeira linha de código até a submissão para a App Store: Clear HIIT.
Para aqueles que ainda não o conheceram, Clear HIIT é um temporizador para treino intervalar (HIIT) no iOS. Quatro tipos de sessão — Padrão, Corrida, Circuito e Spin — construídos em torno de duas ideias simples: você deve ser capaz de colocar o telefone a uma distância e ainda ler o que ele está mostrando à primeira vista, e você deve ser capaz de bloqueá-lo, guardá-lo no bolso e confiar que ele continuará marcando o tempo para você independentemente. Sem assinatura. Sem complicação. Apenas um temporizador que faz seu trabalho corretamente.
Aquela última frase — "marcar o tempo para você" — acabou sendo uma das duas maiores dificuldades técnicas que resolvi neste projeto. O outro não era técnico de forma alguma. Vamos lá, eu explico.
O Impulso para Construir
Eu construí porque não consegui encontrar um temporizador de intervalo que realmente gostasse. Cada um que tentei na App Store ou era confuso, cheio de anúncios ou parava de funcionar corretamente assim que o ecrã bloqueado — o que, como acabou se revelando, foi exatamente o problema com o qual eu passaria a maior parte do tempo resolvendo por mim mesmo.
Por Que Expo Go
Passei cerca de trinta anos no setor de telecomunicações, principalmente em C# e .NET. (mas também em C, Python e PHP - se você esteve aqui tanto quanto eu, provavelmente pegou o mesmo ou um conjunto semelhante de linguagens). Nos últimos tempos, trabalho com clientes foi escrito em Angular e, recentemente, React. Nenhuma dessas é desenvolvimento para iOS. Então quando decidi construir meu próprio aplicativo ao invés de trabalhar freelance no de alguém mais, fui procurar o caminho mais curto e honesto entre "desenvolvedor que conhece React" e "desenvolvedor que lançou algo na App Store".
Esse caminho foi Expo. Eu já sabia React razoavelmente bem de trabalho adjacente e freelancing front-end, e React Native é, por associação, muito menor salto do que começar com Swift sem exposição prévia ao ecossistema da Apple. Expo Go me permitiu obter um protótipo funcional no meu próprio telefone dentro de uma tarde, o que para um desenvolvedor indie solo com tempo limitado não é algo pequeno.
O benefício secundário - e digo isso cautelosamente, porque não quero exagerar onde o projeto realmente está hoje - é que a premissa do React Native é "escreva uma vez, execute em mais de um plataforma". Clear HIIT é um aplicativo iOS no momento, ponto final. Mas a arquitetura por baixo não me prende ao iOS da forma como uma construção puramente SwiftUI faria. Se e quando eu decidir que uma versão Android vale o esforço, a base já está lá em vez de ser uma reescrita. Essa opção foi valiosa para mim desde o início, mesmo que ainda não tenha sacado nela.
A Confissão: Marcar Tempo Quando Ninguém Está Olhando
Este é o pedaço que realmente me preocupou que eu escolhi uma característica inbuildável - devido ao quadro não nativo que escolhi.
Um temporizador HIIT que só funciona enquanto a tela está ligada e o aplicativo está no primeiro plano é, francamente, um brinquedo. Ninguém fazendo uma sessão de spin ou corrida intervalar em esteira vai olhar para a tela do telefone por trinta minutos. Eles bloqueiam, podem colocá-lo em um bracelete de braço ou bolso, e esperam que o sinal sonoro para "trabalho" e "descanso" chegue exatamente quando deve - sobre qualquer coisa já sendo escutada, sem interromper a faixa.
Meu primeiro instinto, como a maioria dos desenvolvedores chegando nisso do zero, foi pegar um temporizador JavaScript simples - setInterval contando o tempo, descendo as fases, disparando uma sinal sonoro em zero. Funcionou lindamente no simulador. Funcionou lindamente com a tela ligada. Então eu bloqueei o telefone e testei-o em segundo plano, e o temporizador simplesmente parou completamente assim que iOS decidiu suspender a thread JS. Sim, eu mesmo caí mais uma vez na velha suposição do desenvolvedor de que "funciona no meu dispositivo" significa "funciona".
A lição, depois que parei de jurar contra minha própria otimismo, é que o iOS trata um aplicativo em segundo plano como um convidado que está tentando expulsar a menos que você lhe dê uma boa e específica razão para deixá-lo acordado. Um temporizador genérico não é essa razão.
Depois de muito escavar nas sombras dos fóruns de desenvolvedores (a base do código deste aplicativo tem mais de dois anos, então muitas coisas já haviam avançado no meio-tempo), cheguei à ideia de que manter uma sessão de áudio ativa no aplicativo era o que impedia o iOS de matar seu thread. Convenientemente, Clear HIIT já precisava de um canal de áudio de qualquer maneira, pois o ponto todo é sobre adicionar dicas sobre a música do usuário em vez de substituí-la. Ao se apoiar em uma sessão de áudio de fundo real ao invés de um relógio JavaScript nu e agendar os pontos de dica contra tempo real decorrido ao invés de um contador de ticks que o iOS poderia pausar a qualquer momento, a sincronização ficou confiável independentemente do estado da tela. O aplicativo ganhou seu lugar no segundo plano em vez de pedir uma favor ao sistema operacional que ele não estava disposto a conceder.
Lembre-se de que o teste real aqui foi consideravelmente mais tedioso do que esse parágrafo sugere — travar o telefone, esperar, desbloquear, verificar o deslocamento, repetir, em diferentes sessões de duração, não é trabalho glamuroso. Mas é exatamente o tipo de verificação sem glamour que separa
O que os Testadores Beta Me Ensinaram
Antes de tudo isso ir ao ar, o aplicativo passou por uma fase beta, e recebi feedbacks genuinamente úteis — do tipo que reformula a lista de recursos em vez de apenas polir o que já existe. A voz de prompt e o feedback tático ambos vieram diretamente dessa rodada: os testadores queriam saber quando uma fase mudou sem ter que olhar para a tela, o que, em retrospecto, é exatamente o mesmo princípio "confie nele sem precisar vê-lo" que impulsionava o trabalho do temporizador de fundo desde o início. Eu só não havia estendido isso o suficiente por conta própria.
A outra mudança foi a adição de níveis de dificuldade e potência para os tipos de sessão Spin (ciclismo indoor). Isso não me ocorreu até que testadores que realmente praticam spin apontaram que um contagem regressiva simples significa nada sem saber o quão forte você deve se esforçar durante cada intervalo — então agora cada fase informa exatamente isso, em vez de deixá-lo adivinhar.
Uma atualização futura construirá sobre o mesmo tema: pastas opcionais, para que os usuários possam agrupar suas sessões em vez de rolar por uma única lista plana. Acredito que isso será mais importante para treinadores pessoais, que podem usá-lo para manter as sessões de cada cliente organizadas separadamente em vez de empacotá-las juntas.
Em algum momento do caminho também tive que aprender como realmente colocar o aplicativo à frente das pessoas uma vez que estava ao vivo — lançar seu primeiro aplicativo na App Store é uma experiência completamente diferente, e trazer consciência dele em todo o ecossistema iPhone global acabou sendo um desafio que nada tinha a ver com código. Isso é uma história para outro dia, mas merece menção aqui como aquele que ainda está em andamento.
Pensamentos Finais
Entre um temporizador de fundo inconsistente e uma interface apenas amada por desenvolvedores, o Clear HIIT me deu dois tipos genuinamente diferentes de problema para resolver — um onde a solução era entender as regras do iOS para execução em segundo plano corretamente, e outro onde a solução foi admitir meus próprios limites e trazer ajuda. Ambos, à sua maneira, foram exercícios de refatoração: transformando algo que funcionava tecnicamente em algo que realmente funcionava para a pessoa usando.
Se você quiser tentar o aplicativo gratuitamente por 30 dias (e talvez me dar uma avaliação positiva), pode baixá-lo da Apple App Store: https://apps.apple.com/us/app/clearhiit/id6781863028
E se você tentar — seja porque ama, não é para você ou tem sugestões de melhoria — deixe-me saber. Eu realmente gostaria de ouvir.

