Cosa fa un gestore di download che un browser web non farà
Un file da quattro gigabyte, al novanta per cento, e poi una telefonata — o semplicemente uno schermo bloccato — e non c'è più. È la lamentela più comune sul download su iOS, e non è un difetto. È il sistema operativo che fa esattamente quello per cui è stato progettato, ed è la ragione per cui esiste una classe di app a parte.
- 30s Più o meno quanto continua a girare una app sospesa prima che iOS la fermi
- 206 Lo stato HTTP che rende possibile la ripresa
- 1 byte Quanto viene riscaricato di un trasferimento ripreso come si deve
Perché il trasferimento si ferma quando cambi app
iOS non lascia lavorare una app solo perché le farebbe piacere. Quando lasci una app, viene sospesa nel giro di pochi secondi, e una app sospesa non ha tempo di CPU, né socket di rete, né modo di accorgersi di essere stata fermata. Tutto ciò che teneva in memoria è ancora lì, ma congelato — e se al sistema serve la memoria, la app viene terminata di netto senza che le venga detto.
Un download che gira su una connessione normale dentro la app finisce quindi al gesto di uscita. Alcune app lo nascondono chiedendo qualche secondo in più di tempo in background, ed è per questo che un download a volte sopravvive allo sfondo esattamente per il tempo che ti serve ad accorgerti che non è sopravvissuto.
La risposta giusta è di un altro tipo. iOS mette a disposizione un servizio di trasferimento in background: consegni al sistema una lista di URL e destinazioni, e il sistema fa lui il download, nel suo processo, secondo i suoi tempi. La tua app può essere sospesa, terminata o non in esecuzione affatto — il trasferimento continua, e la app viene riavviata in background quando c'è qualcosa da riferire. È questo il meccanismo dietro ogni download che sopravvive a uno schermo bloccato, e usarlo è una scelta di progetto che una app fa fin dall'inizio, non un'impostazione che puoi accendere.
I quattro meccanismi che decidono se un download sopravvive
- Range request
- Una richiesta HTTP che chiede i byte dal 5.000.000 in poi invece dell'intero file. Se il server risponde
206 Partial Content, riprendere da metà è possibile; se risponde200 OKe riparte dall'inizio, non lo è — il file va scaricato di nuovo da zero. - Connessioni parallele
- Dividere un file in più intervalli e scaricarli nello stesso momento. Aiuta perché una singola connessione è spesso rallentata dal server o limitata dalla latenza di andata e ritorno, non perché la tua internet vada più veloce con più socket aperti.
- Offset confermato
- Quanta parte del file è scritta al sicuro su disco, contro quella ancora in volo. Un download che riprende dall'ultimo byte confermato è corretto; uno che riprende da quello che *crede* di aver ricevuto produce un file corrotto che si rivela solo ore dopo.
- Sessione in background
- Il trasferimento gestito dal sistema descritto sopra. È più lento a partire, non gli si può dare logica personalizzata a piacere, ed è l'unica cosa che continua a girare quando la app non gira.
Perché un download fallisce, e che aspetto ha ogni fallimento
Quasi tutte le segnalazioni di «download bloccato» sono una di queste cinque, e si distinguono facilmente una volta che ne conosci la forma.
| Cosa vedi | Cosa sta succedendo davvero | Cosa aiuta |
|---|---|---|
| Si ferma nell'istante in cui lasci la app | Il trasferimento girava nel processo, non in una sessione in background. | Niente che tu possa fare da fuori — è una questione di progetto della app. |
| Riparte da 0% ogni volta | Il server ignora le range request, quindi non c'è modo di continuare da metà. | Una connessione stabile, o un file più piccolo. Alcuni host permettono gli intervalli solo per link firmati. |
| Fallisce dopo qualche minuto, ripetutamente | Il link è scaduto. Molti host emettono URL validi cinque o dieci minuti. | Riprendi il link dalla sua pagina e ricomincia; quello vecchio non funzionerà mai più. |
| Scarica veloce, poi il file non si apre | Quello che è arrivato era una pagina di errore HTML o una pagina di accesso con il nome di un file video. | Controlla la dimensione — un «film» da 14 KB è una pagina web. Ispeziona il link prima di impegnarti. |
| Lentissimo nonostante una connessione veloce | Rallentamento per connessione dalla parte del server. | Più connessioni parallele, se il server le permette. Se mette il tetto per indirizzo IP invece che per socket, non aiuterà niente. |
Quando non c'è proprio nessun file da scaricare
Gran parte del video sul web non viene consegnato come file. Viene consegnato come HLS — una playlist .m3u8 che elenca centinaia di piccoli segmenti, da qualche secondo l'uno, spesso a più livelli di qualità così che il player possa cambiare mentre la tua connessione cambia. Non c'è nessun URL unico che contenga il film, perché il film esiste solo come sequenza.
Salvarne uno vuol dire scaricare ogni segmento e poi fare il remux: scrivere i flussi video e audio in un normale contenitore MP4. Non si ricodifica niente, quindi non si perde niente e ci vogliono secondi invece della durata del film. Il risultato è un file normale che si riproduce ovunque.
È anche per questo che «scarica questo flusso» impiega visibilmente di più a partire rispetto a scaricare un file: la playlist va presa e analizzata, va scelto un livello di qualità, e solo allora i segmenti possono cominciare ad arrivare. Ed è per questo che alcuni flussi non si possono salvare affatto — se i segmenti sono cifrati sotto uno schema DRM, le chiavi non sono ottenibili di proposito, e nessuno strumento che rispetti la legge riuscirà a passare.
Cosa separa un vero gestore di download da un pulsante di download
Sopravvive alla chiusura della app
Trasferimenti in background consegnati al sistema, con un passaggio di consegne che continua dallo stesso byte confermato invece di ricominciare il file.
Ti dice cos'è un link prima che ti impegni
Dimensione, tipo e se il server supporta la ripresa — tutto conoscibile da una singola richiesta HEAD, e tutto utile prima di spendere quattro gigabyte di un piano dati.
Accoda invece di inondare
Dieci file insieme sono più lenti di tre alla volta, perché ogni connessione riceve una fetta più piccola e i fallimenti si moltiplicano. Una coda con un limite di concorrenza sensato finisce prima.
Quello che atterra è un file normale
In una cartella che puoi vedere, con un nome sensato, riproducibile da qualsiasi cosa — non un blob in un database che solo quella app può aprire.
Abitudini che prevengono quasi tutti i problemi di download
- Avvia i file grossi in Wi-Fi e lascia lo schermo acceso per i primi secondi
Il passaggio alla sessione in background avviene presto; dopo, lo schermo non conta più.
- Non accodare venti elementi insieme
Da tre a cinque trasferimenti simultanei è il punto giusto su quasi ogni connessione.
- Controlla lo spazio libero prima, non dopo
Un trasferimento che riempie il disco fallisce al 98%, e iOS potrebbe aver già svuotato le tue cache cercando di fare posto.
- Guarda con sospetto un «completato» istantaneo
Un film finito in due secondi è una pagina di errore. Guarda la dimensione del file.
- Riprendi i link scaduti dalla loro pagina
Riprovare un URL firmato ormai morto fallirà per sempre, per quante volte la app ci riprovi.
Come cambia tra un dispositivo e l'altro
L'ambiente più severo: la sospensione è aggressiva e lo spazio è stretto. Qui le sessioni in background non sono un'ottimizzazione, sono l'unica cosa che funziona.
Le stesse regole, con più spazio di manovra — e l'unico dispositivo iOS dove una libreria grossa può ragionevolmente atterrare su un disco esterno invece che nello spazio interno.
Nessuna sospensione, quindi i trasferimenti lunghi si comportano come su qualsiasi computer. Il limite pratico è il server, non il sistema operativo.
Domande che vengono da qui
Più connessioni vogliono sempre dire download più veloce?
No. Aiutano quando un server limita la velocità di ogni singola connessione, cosa comune. Non fanno niente quando il limite è la tua connessione, e possono peggiorare le cose quando un host conta i socket per indirizzo IP e comincia a rifiutarli. Tra quattro e otto è l'intervallo utile; trenta è controproducente.
Un download può continuare a schermo bloccato?
Sì, se è stato consegnato al servizio di trasferimento in background del sistema. La schermata di blocco è irrilevante per quel servizio — quello che conta è che la app venga sospesa, e tutto il senso del meccanismo è che continui lo stesso.
Perché il mio download riparte invece di riprendere?
Il server non ha rispettato la range request. Lo capisci perché il progresso torna a zero invece di riagganciarsi. Alcuni host supportano gli intervalli solo sui loro URL di download firmati, alcuni li disattivano del tutto, e qualcuno li rispetta per i file piccoli ma non per i grossi.
Convertire un flusso in MP4 è la stessa cosa che ricodificarlo?
No. Il remux sposta il video e l'audio esistenti in un contenitore MP4 senza toccarli — senza perdita, e abbastanza veloce da finire in pochi secondi. La ricodifica ricostruisce l'immagine con un codec diverso e perde sempre qualità. Se salvare un flusso da due ore ci mette due ore, qualcosa sta ricodificando quando non ce n'era bisogno.
Come scarica FoxDL
Il motore ha due corsie: una nel processo, veloce mentre la app è a schermo, e la sessione in background del sistema che subentra dallo stesso byte quando non lo è.
- Blocchi paralleli per un singolo file, scritti direttamente nella loro posizione finale su disco invece che in pezzi temporanei da unire dopo.
- Trasferimenti in background che continuano dopo che la app lascia lo schermo, e riprendono dall'ultimo offset confermato — non dall'ultimo byte che la app credeva di avere.
- Ripresa dopo una caduta, un riavvio o una chiusura forzata, a patto che il server rispetti le range request. Quando non lo fa, FoxDL lo dice invece di andare in loop.
- Flussi HLS rimuxati in MP4, così quello che atterra nella libreria è un file normale, non una cartella di segmenti.
- Un ispettore dei download che riferisce dimensione reale, tipo e supporto alla ripresa di un link prima che tu cominci.
- Tutto atterra in una cartella normale che l'app File riesce a vedere.
Le concessioni gratuite variano per piattaforma: su iPhone e iPad un piccolo numero di passaggi ricaricabili con un breve video premiante che avvii tu; su Mac, dove non c'è nessuna pubblicità, un conteggio giornaliero fisso. Pro toglie il limite su ogni dispositivo.
Domande frequenti
- I download continuano quando esco dall'app?
- Un download interrotto può riprendere da dove si era interrotto?
- FoxDL può scaricare uno streaming HLS (m3u8)?
- Perché il download è lento e posso renderlo più veloce?
- Quanti download posso effettuare nella versione gratuita?
Continua a leggere
Cosa deve succedere prima che una pagina web ti dia il suo file
I quattro modi in cui una pagina consegna il video, e perché solo uno di loro è un file che puoi tenere.
Dove stanno davvero i tuoi file su un iPhone, e chi può vederli
La sandbox, dove finiscono davvero i download, e perché rinominare un file rompe così tante app.
Perché il tuo iPhone apre un file video e rifiuta quello dopo
Contenitori, codec, e i tre modi per guardare un file che iOS si rifiuta di aprire.
La tua libreria, finalmente in un posto solo.
Download gratuito. Niente account né registrazione; tutte le funzioni sono nella versione free.