Apps · 7 min de leitura

Como uma lanterna acende no iPhone, e por que o app pede câmera

Quantas linhas de código uma lanterna de iPhone realmente precisa? Três acendem o LED. As outras duzentas fazem tudo o que separa exercício de Swift de produto editorial. O bastidor da Lanterna BLA.

A resposta simples é três. A resposta verdadeira é por volta de duzentas, espalhadas em vários arquivos. A demonstração popular em tutoriais Swift mostra um trecho assim. Você pega o AVCaptureDevice padrão da câmera traseira, chama lockForConfiguration, depois setTorchModeOn com a intensidade. Em três linhas, o LED traseiro do iPhone acende. Em três linhas, qualquer dev iOS júnior consegue ligar a lanterna. Mas três linhas não fazem app de lanterna. Fazem hello world de lanterna. App de lanterna que vale alguma coisa tem o resto.

A primeira coisa que três linhas não fazem é tratar a permissão. AVCaptureDevice é parte do framework AVFoundation da Apple, que é o mesmo framework usado pra capturar foto, vídeo e áudio. Pra acessar o LED da câmera, o iOS exige a permissão de câmera, mesmo se o app não pretende capturar nenhuma imagem. Isso é restrição da Apple, não decisão de produto. O sistema é todo ou nada. Ou o app pede permissão de câmera e acende a lanterna, ou não pede e não acende. Não tem caminho do meio. Por isso a Lanterna BLA tem a string NSCameraUsageDescription no Info.plist que diz literalmente: a câmera é usada apenas pra controlar a lanterna do telefone, nenhuma imagem é capturada. É o app sendo honesto sobre o que faz por dentro.

A segunda coisa que três linhas não fazem é manter a tela acesa enquanto a luz está acesa. O iPhone tem um idle timer que apaga a tela depois de trinta segundos sem toque, por padrão. Se o usuário acende a lanterna pra ler um remédio na mesa de cabeceira, e a tela apaga em trinta segundos, a luz da tela some junto (no caso do modo Luz de tela). Pra evitar isso, o app precisa marcar o idle timer como desligado enquanto a luz está acesa, e voltar a marcar como ligado quando a luz apaga. Sem isso, o app fica inutilizável em sessão de mais de meio minuto.

A terceira coisa que três linhas não fazem é o SOS em Morse. Acender o LED é uma chamada. Piscar o LED em ritmo de SOS, com temporização correta, é um loop com cinco estados diferentes (dot, intra letra gap, dash, inter letra gap, repeat gap), cada um com duração específica em milissegundos, rodando em Task assíncrona com weak self pra não vazar memória, e cancelável quando o usuário toca em outro preset ou quando o timer expira. São aproximadamente quarenta linhas só pra essa lógica, mais o método de cancelamento, mais o tratamento de quando o app vai pra background no meio do SOS.

A quarta coisa que três linhas não fazem é falar com o widget. A Lanterna BLA tem widgets pra tela de bloqueio e home. Quando o usuário toca no widget, o app abre direto no último preset usado. Pra isso, app e widget precisam compartilhar uma área de UserDefaults via App Group, com identificador group.bla.vc.Lanterna BLA. A cada troca de preset, o app salva o preset atual nessa área. A cada launch via deep link do widget (URL scheme lanternabla, com path last), o app lê esse valor e abre direto no preset salvo. É infraestrutura simples mas que tem que ser feita.

A quinta coisa que três linhas não fazem é Privacy Manifest. Desde 2024, a Apple exige que todo app declare quais APIs do iOS ele usa pra acessar dado do usuário, mesmo dado mais inócuo, num arquivo chamado PrivacyInfo.xcprivacy. A Lanterna BLA declara só uma. Acesso a UserDefaults pra propósitos próprios do app, não pra rastreamento. Esse manifest, junto com o NSCameraUsageDescription, é o que permite o app passar pela revisão da Apple sem ser questionado. Atenção a esses detalhes evita rejeição da Apple e gasto de duas semanas de submissão em vão.

A sexta coisa que três linhas não fazem é traduzir. A Lanterna BLA tem strings traduzidas pra dez idiomas (português brasileiro, inglês, espanhol, francês, alemão, italiano, japonês, chinês simplificado, chinês tradicional, coreano). Cada string passou por revisão editorial pra preservar a voz do estúdio em cada idioma. O arquivo de localização tem por volta de seiscentas e cinquenta entradas, sessenta e cinco strings vezes dez idiomas. Não é tradução de Google. É tradução com critério, em parceria entre humano e modelo, com revisão de quem entende a marca.

Tudo isso pra um app de lanterna. Três linhas acendem o LED. As outras duzentas fazem o resto. Permissão, idle timer, SOS Morse com timing internacional, propagação pro widget, Privacy Manifest, tradução pra dez idiomas, configurações com tema noturno fixo, widget pra tela de bloqueio, deep link, App Group. Cada uma dessas peças é o que separa um exercício de Swift de um produto. E a Lanterna BLA é o produto mais simples que a BLA já fez. Os próximos vão ter ainda mais detalhe, em ainda menos linhas óbvias. Cada linha em silêncio. Cada decisão em editorial.

baixe o app

Ícone do Lanterna BLA

Lanterna BLA

Lanterna que não acorda ninguém. Acende rápido, brilha tela ou flash. Seis presets. SOS em Morse. Timer pra desligar. Sem propaganda, sem login.

próximo ensaio

App de lanterna, lanterna nativa do iOS, lanterna física: quando cada uma faz sentido