O que um gerenciador de downloads faz e um navegador da web não faz
Um arquivo de quatro gigabytes, noventa por cento pronto, e então uma ligação — ou só a tela travada — e ele se foi. Essa é a reclamação mais comum sobre baixar coisas no iOS, e não é um bug. É o sistema operacional fazendo exatamente o que ele foi projetado para fazer, e é a razão pela qual existe uma classe separada de app.
- 30s Mais ou menos quanto tempo um app suspenso continua rodando antes de o iOS parar ele
- 206 O status HTTP que torna a retomada possível, para começo de conversa
- 1 byte Quanto de uma transferência retomada como deve ser é baixado de novo
Por que a transferência para quando você troca de app
O iOS não deixa um app continuar trabalhando só porque ele gostaria. Quando você sai de um app, ele é suspenso em segundos, e um app suspenso não tem tempo de processador, não tem sockets de rede e não tem como perceber que foi parado. Tudo o que ele estava segurando na memória ainda está ali, mas congelado — e se o sistema precisar da memória, o app é encerrado na hora, sem ser avisado.
Um download rodando numa conexão comum dentro do app, portanto, termina no gesto de voltar para a tela inicial. Alguns apps escondem isso pedindo alguns segundos extras de tempo em segundo plano, e é por isso que um download às vezes sobrevive a ir para o fundo por exatamente o tempo que você leva para notar que ele não sobreviveu.
A resposta correta é de outra natureza. O iOS oferece um serviço de transferência em segundo plano: você entrega ao sistema uma lista de URLs e destinos, e o sistema faz o download ele mesmo, no processo dele, no ritmo dele. O seu app pode estar suspenso, encerrado ou simplesmente não estar rodando — a transferência continua, e o app é relançado em segundo plano quando há algo a reportar. Esse é o mecanismo por trás de todo download que sobrevive a uma tela travada, e usá-lo é uma decisão de projeto que um app toma desde o começo, não um ajuste que você pode ligar.
Os quatro mecanismos que decidem se um download sobrevive
- Range request
- Uma requisição HTTP que pede os bytes a partir de 5.000.000 em vez do arquivo inteiro. Se o servidor responder
206 Partial Content, retomar do meio é possível; se responder200 OKe começar do início, não é — o arquivo tem que ser buscado de novo do zero. - Conexões paralelas
- Dividir um arquivo em várias faixas e buscá-las ao mesmo tempo. Ajuda porque uma conexão sozinha muitas vezes é limitada pelo servidor ou pela latência de ida e volta, não porque a sua internet fica mais rápida com mais sockets abertos.
- Offset confirmado
- Quanto do arquivo está de fato escrito no disco, em contraste com o que ainda está em trânsito. Um download que retoma do último byte confirmado está correto; um que retoma do que ele *acha* que recebeu produz um arquivo corrompido que só se revela horas depois.
- Sessão em segundo plano
- A transferência gerida pelo sistema, descrita acima. Ela demora mais para começar, não aceita lógica personalizada arbitrária, e é a única coisa que continua rodando quando o app não está.
Por que um download falha, e como cada falha aparece
A maior parte dos relatos de “download travado” é um destes cinco, e é fácil distinguir uma vez que você conhece o formato.
| O que você vê | O que está acontecendo de verdade | O que ajuda |
|---|---|---|
| Para no instante em que você sai do app | A transferência estava rodando dentro do processo, não numa sessão em segundo plano. | Nada que você possa fazer de fora — isso é uma questão de projeto do app. |
| Recomeça de 0% toda vez | O servidor ignora range requests, então não existe jeito de continuar do meio. | Uma conexão estável, ou um arquivo menor. Alguns servidores permitem faixas só em links assinados. |
| Falha depois de alguns minutos, repetidamente | O link expirou. Muitos servidores emitem URLs válidas por cinco ou dez minutos. | Busque o link de novo na página dele e comece outra vez; o antigo nunca vai funcionar. |
| Baixa rápido, e depois o arquivo não abre | O que chegou foi uma página HTML de erro ou uma página de login com nome de arquivo de vídeo. | Confira o tamanho — um “filme” de 14 KB é uma página da web. Inspecione o link antes de se comprometer com ele. |
| Muito lento, apesar de uma conexão rápida | Limitação por conexão do lado do servidor. | Mais conexões paralelas, se o servidor permitir. Se ele limita por endereço IP em vez de por socket, nada vai ajudar. |
Quando não existe arquivo nenhum para baixar
Boa parte do vídeo na web não é entregue como arquivo. É entregue como HLS — uma playlist .m3u8 que lista centenas de segmentos pequenos, de poucos segundos cada, muitas vezes em vários níveis de qualidade, para que o player possa trocar conforme a sua conexão muda. Não existe uma URL única contendo o filme, porque o filme só existe como sequência.
Salvar um significa buscar cada segmento e depois remuxá-los: escrever os fluxos de vídeo e áudio dentro de um contêiner MP4 normal. Nada é recodificado, então nada se perde, e leva segundos em vez da duração do filme. O resultado é um arquivo comum que roda em qualquer lugar.
É também por isso que “baixar este stream” demora visivelmente mais para começar do que baixar um arquivo: a playlist tem que ser buscada e interpretada, um nível de qualidade tem que ser escolhido, e só então os segmentos começam a chegar. E é por isso que alguns streams não podem ser salvos de jeito nenhum — se os segmentos são criptografados sob um esquema de DRM, as chaves são deliberadamente inacessíveis, e nenhuma ferramenta que respeite a lei vai passar disso.
O que separa um gerenciador de downloads de verdade de um botão de baixar
Ele sobrevive ao app fechar
Transferências em segundo plano entregues ao sistema, com uma passagem de bastão que continua do mesmo byte confirmado em vez de começar o arquivo de novo.
Ele te diz o que um link é antes de você se comprometer
Tamanho, tipo e se o servidor suporta retomada — tudo isso é descobrível com uma única requisição HEAD, e tudo isso é útil antes de você gastar quatro gigabytes do seu plano de dados.
Ele enfileira em vez de inundar
Dez arquivos ao mesmo tempo é mais lento que três por vez, porque cada conexão recebe uma fatia menor e as falhas se multiplicam. Uma fila com um limite sensato de simultaneidade termina mais cedo.
O que chega é um arquivo normal
Numa pasta que você pode ver, com nome sensato, reproduzível por qualquer coisa — não um blob num banco de dados que só aquele app abre.
Hábitos que evitam a maioria dos problemas de download
- Comece arquivos grandes no Wi-Fi e deixe a tela ligada nos primeiros segundos
A passagem para a sessão em segundo plano acontece no começo; depois disso, a tela não importa mais.
- Não enfileire vinte itens de uma vez
De três a cinco transferências simultâneas é o ponto ideal em quase toda conexão.
- Confira o espaço livre antes, não depois
Uma transferência que enche o disco falha em 98%, e o iOS pode já ter limpado os seus caches tentando abrir espaço.
- Desconfie de um “concluído” instantâneo
Um filme que terminou em dois segundos é uma página de erro. Olhe o tamanho do arquivo.
- Busque links expirados de novo na página deles
Tentar de novo uma URL assinada morta vai falhar para sempre, não importa quantas vezes o app tente.
Como isso muda entre os aparelhos
O ambiente mais rígido: a suspensão é agressiva e o armazenamento é apertado. Aqui, sessões em segundo plano não são uma otimização, são a única coisa que funciona.
As mesmas regras, com mais espaço para respirar — e o único aparelho iOS em que uma biblioteca grande pode razoavelmente cair num disco externo em vez do armazenamento interno.
Nenhuma suspensão, então transferências longas se comportam como em qualquer computador. O limite prático é o servidor, não o sistema operacional.
Perguntas que isso levanta
Mais conexões sempre significam um download mais rápido?
Não. Elas ajudam quando um servidor limita a velocidade de cada conexão individual, o que é comum. Não fazem nada quando o limite é a sua própria conexão, e podem piorar as coisas quando um servidor conta sockets por endereço IP e começa a recusar. Algo entre quatro e oito é a faixa útil; trinta é contraproducente.
Um download pode continuar com a tela travada?
Sim, se ele foi entregue ao serviço de transferência em segundo plano do sistema. A tela de bloqueio é irrelevante para esse serviço — o que importa é o app ser suspenso, e o ponto inteiro do mecanismo é que ele continua de qualquer forma.
Por que meu download recomeça em vez de retomar?
O servidor não honrou o range request. Você percebe porque o progresso volta a zero em vez de continuar de onde estava. Alguns servidores suportam faixas só nas URLs de download assinadas deles, alguns desabilitam por completo, e uns poucos honram para arquivos pequenos mas não para grandes.
Converter um stream para MP4 é a mesma coisa que recodificar?
Não. O remux move o vídeo e o áudio que já existem para dentro de um contêiner MP4 sem tocar neles — sem perdas, e rápido o bastante para terminar em segundos. Recodificar reconstrói a imagem com um codec diferente e sempre perde qualidade. Se salvar um stream de duas horas leva duas horas, alguma coisa está recodificando sem precisar.
Como o FoxDL baixa
O motor tem duas pistas: uma dentro do processo, que é rápida enquanto o app está na tela, e a sessão em segundo plano do sistema, que assume do mesmo byte quando ele não está.
- Pedaços paralelos para um único arquivo, escritos direto na posição final deles no disco em vez de em partes temporárias que depois têm que ser juntadas.
- Transferências em segundo plano que continuam depois de o app sair da tela, e retomam no último offset confirmado — não no último byte que o app achou que tinha.
- Retomada depois de uma queda, um reinício ou um encerramento forçado, desde que o servidor honre range requests. Quando não honra, o FoxDL diz isso em vez de ficar em loop.
- Streams HLS remuxados para MP4, para que o que chega na biblioteca seja um arquivo comum, não uma pasta de segmentos.
- Um inspetor de download que informa o tamanho real, o tipo e o suporte a retomada de um link antes de você começar.
- Tudo cai numa pasta normal que o app Arquivos consegue ver.
As cotas gratuitas variam por plataforma: no iPhone e no iPad, um número pequeno de passes reabastecido por um vídeo recompensado curto que você mesmo inicia; no Mac, onde não há anúncio nenhum, uma contagem diária fixa. O Pro remove o limite em todo aparelho.
Perguntas frequentes
- Os downloads continuam quando eu saio do app?
- Um download interrompido consegue retomar de onde parou?
- O FoxDL consegue baixar um stream HLS (m3u8)?
- Por que meu download está lento e como deixá-lo mais rápido?
- Quantos downloads dá para fazer na versão gratuita?
Continue lendo
O que precisa acontecer antes de uma página da web te entregar o arquivo dela
Os quatro jeitos que uma página tem de entregar vídeo, e por que só um deles é um arquivo que você pode guardar.
Onde os seus arquivos realmente moram num iPhone, e quem consegue vê-los
A sandbox, para onde os downloads realmente vão, e por que renomear um arquivo quebra tantos apps.
Por que o seu iPhone abre um arquivo de vídeo e recusa o próximo
Contêineres, codecs, e os três jeitos de assistir a um arquivo que o iOS se recusa a abrir.
Sua biblioteca, enfim em um lugar só.
Download grátis. Sem conta nem cadastro; o conjunto completo está na versão gratuita.