Gravar GPS em segundo plano no iOS sem perder o trajeto
O iOS pode suspender ou encerrar o seu gravador a qualquer momento, sem dever nenhum aviso. O que isso significa para um app cuja função é anotar por onde você passou, e o que de fato protege um trajeto.
Você inicia uma gravação, guarda o celular no bolso, pedala três horas, tira o aparelho de lá e o app mostra vinte minutos. Essa é, de longe, a reclamação séria mais comum sobre rastreadores feitos em celular, e a causa quase nunca é o GPS.
O que o iOS está de fato fazendo com o seu app
Um app do iOS em segundo plano não está simplesmente rodando mais devagar. Ele passa por estados: ainda em execução, suspenso (congelado na memória, sem executar nada) e encerrado (foi embora). O sistema move você entre esses estados conforme a pressão de memória, a temperatura, a bateria e o critério dele próprio, e não é obrigado a avisar com antecedência.
Um app com o modo de segundo plano de localização continua rodando enquanto atualizações de posição chegam, e é assim que qualquer um desses apps funciona. Isso é uma garantia forte perto de um app comum. Não é uma garantia absoluta: sob pressão real de memória — um jogo pesado, um app de câmera, um aparelho com menos RAM —, o seu gravador ainda pode ser encerrado no meio do trajeto.
É daí que vem a falha que importa. Se o app estava segurando o trajeto na memória, esperando você apertar parar antes de gravar qualquer coisa, então tudo desde o último salvamento se foi. Não corrompido. Se foi, sem erro nenhum, porque o processo que sabia daquilo não existe mais.
A única proteção real: anotar conforme chega
Não existe jeito esperto de contornar isso. A proteção é nunca ter dado não salvo para começo de conversa.
No Roam, um retorno de localização é um lote, e um lote é uma transação no banco de dados: os pontos e os totais acumulados do trajeto são confirmados juntos. Não há buffer esperando o fim do trajeto, e não há caminho nenhum dentro do gravador que descarte um ponto em silêncio — um lote que não consegue ser confirmado levanta um erro e fica estacionado em um alarme, em vez de ser engolido. Se o app for encerrado no quilômetro quarenta, o quilômetro quarenta já está no celular.
Confirmar os totais na mesma transação que os pontos importa mais do que parece. Significa que a linha de resumo nunca consegue descrever um conjunto de pontos que não está em disco, então, depois de um encerramento, não existe janela em que as duas coisas discordem — e a recuperação não precisa reprocessar vinte e oito mil pontos para descobrir onde você estava. Ela lê a linha de resumo.
A outra metade da mesma ideia: nada é apagado, nunca. Filtragem, suavização e pausa automática jamais removem uma linha do banco de dados. Elas ficam registradas como marcadores no ponto, e o fluxo bruto permanece exatamente como chegou, para que, quando uma heurística errar num trajeto real, as amostras originais ainda estejam ali para derivar algo melhor. Um app que descarta discretamente as amostras de que discordou destruiu a prova de que estava errado.
Voltar ao ar depois de um encerramento
Se você concedeu a localização como Sempre, o iOS pode reabrir em segundo plano um app encerrado quando ocorre uma mudança significativa de localização. Isso é um salva-vidas de verdade, e vem com uma armadilha que já pegou um bom número de gravadores.
Nessa reabertura, o app tem uma janela curtíssima e imprevisível antes que o sistema possa suspendê-lo de novo — e, o que é decisivo, ele pode ser suspenso em qualquer ponto de suspensão, o que no Swift moderno significa em qualquer `await`. Um app que reabre e então carrega algum estado de forma assíncrona antes de reconstruir o seu gerenciador de localização pode ser congelado no meio do caminho, e um processo suspenso antes de se rearmar nunca mais vai ouvir o GPS. Ele parece estar rodando. E não está recebendo nada.
O rearme do Roam é deliberadamente síncrono exatamente por isso: reconstruir o gerenciador de localização e reiniciar as atualizações acontece antes do primeiro await, o que torna o erro impossível de introduzir em vez de apenas desaconselhado. Ele também é escrito para ser seguro se chamado duas vezes, porque uma reabertura em segundo plano correndo contra uma abertura em primeiro plano vai fazer precisamente isso.
Vale deixar claro: Sempre é um seguro, não uma exigência. A gravação funciona bem com Durante o Uso, e o app diz isso no próprio pedido de permissão, em vez de dar a entender que você tem que entregar a permissão mais forte.
E é um seguro, não uma garantia, distinção na qual vale insistir. A própria configuração do Roam enuncia a premissa com todas as letras: pode ser que ele nunca seja reaberto, e a durabilidade é a única promessa que ele faz. Nada no iOS obriga o sistema a trazer de volta um app encerrado. O que aconteceu entre o encerramento e a reabertura não foi gravado por ninguém, e nenhuma API consegue entregar isso depois, então o que você recebe de volta é o trajeto até o encerramento mais o trajeto depois da reabertura, com um buraco honesto entre os dois. Qualquer app que descreva isso como continuação sem emenda está descrevendo algo que a plataforma não oferece.
O que quem está pedalando pode fazer
- Conceda a localização como Sempre se você grava coisas longas. É a diferença entre um encerramento não custar nada e custar o restante do trajeto.
- Deixe o Modo de Baixo Consumo desligado sempre que der. Ele aumenta a chance de o trabalho em segundo plano ser cortado.
- Não arraste o app para fora do seletor de apps no meio do trajeto. Fechar à força avisa ao iOS que você quis aquilo, e nenhuma reabertura em segundo plano vai acontecer.
- Não rode dois gravadores ao mesmo tempo. Dois apps mantendo o GPS acordado dobram o consumo e a pressão de memória que faz um deles ser encerrado.
- Confira a permissão depois de uma atualização do iOS. As atualizações de vez em quando rebaixam Sempre para Durante o Uso sem muita cerimônia.
Como saber se o seu gravador é seguro
Dá para testar isso em dez minutos, sem ferramenta nenhuma. Inicie uma gravação, caminhe cinco minutos, feche o app à força pelo seletor de apps e abra de novo. Se os cinco minutos estiverem lá, o app estava gravando conforme andava. Se o trajeto estiver vazio ou truncado, ele estava segurando os seus dados na memória, e agora você sabe exatamente quanto de um trajeto longo corre o risco de perder.
Um gravador também deveria declarar o mínimo possível. Cada modo de segundo plano a mais é algo por cujo mau uso o app pode ser encerrado e algo que um revisor da App Store vai questionar; o Roam declara um — localização — e o repositório tem uma trava de compilação que derruba o build se essa lista ganhar uma única entrada a mais.
Perguntas frequentes
Por que meu iPhone parou de gravar o trajeto em segundo plano?
Quase sempre porque o iOS suspendeu ou encerrou o app sob pressão de memória, ou porque ele foi fechado à força pelo seletor de apps. O modo de segundo plano de localização mantém um gravador vivo muito mais tempo que um app comum, mas não é uma garantia absoluta, e é por isso que o que o app faz com cada ponto importa mais do que continuar vivo.
Um app precisa da localização Sempre para gravar um trajeto?
Não. Durante o Uso já basta para gravar com a tela apagada, porque o modo de segundo plano de localização mantém o app rodando enquanto as atualizações chegam. Sempre acrescenta a possibilidade de o iOS reabrir o app em segundo plano caso ele tenha sido encerrado, ou seja, é um seguro para trajetos longos, não uma exigência.
O GPS em segundo plano gasta bateria?
Gasta energia de verdade — o receptor fica ligado continuamente e o app acorda a cada ponto. Um celular moderno aguenta um trajeto de várias horas com folga; um evento de dia inteiro é onde isso vira questão, e é onde um app que grava conforme anda faz a diferença entre perder os últimos minutos e perder o dia.
Como eu testo se o meu gravador perde dados?
Inicie uma gravação, caminhe cinco minutos, feche o app à força pelo seletor de apps e abra de novo. Se aqueles cinco minutos sobreviveram, o app grava conforme anda. Se não sobreviveram, ele estava guardando o seu trajeto na memória.
Um gravador que não perde o trajeto
O Roam grava cada ponto do GPS no celular no instante em que ele chega, marca as falhas de sinal em vez de traçar uma linha reta por cima delas e lê a subida do barômetro, não da altitude do GPS. Sem conta, sem login, sem sincronização. Gravar um trajeto, vê-lo e reproduzi-lo são coisas gratuitas.