Ce face un manager de descărcări și un browser web nu face
Un fișier de patru gigaocteți, ajuns la nouăzeci la sută, apoi un apel telefonic — sau doar un ecran blocat — și totul a dispărut. Aceasta e cea mai frecventă plângere despre descărcarea pe iOS și nu e un bug. Sistemul de operare face exact ce a fost proiectat să facă, și de aceea există o categorie separată de aplicații.
- 30s Cam cât timp mai rulează o aplicație suspendată înainte ca iOS să o oprească
- 206 Codul de stare HTTP care face posibilă reluarea
- 1 octet Cât se redescarcă dintr-un transfer reluat corect
De ce se oprește transferul când schimbi aplicația
iOS nu lasă o aplicație să continue să lucreze doar pentru că i-ar plăcea. Când ieși dintr-o aplicație, aceasta e suspendată în câteva secunde, iar o aplicație suspendată nu are timp de procesor, nu are socluri de rețea și nu are cum să observe că a fost oprită. Tot ce ținea în memorie e încă acolo, dar înghețat — iar dacă sistemul are nevoie de memorie, aplicația e terminată direct, fără să fie anunțată.
Un transfer care rulează pe o conexiune obișnuită în interiorul aplicației se termină deci la gestul de ieșire spre ecranul de start. Unele aplicații ascund asta cerând câteva secunde suplimentare de timp în fundal, motiv pentru care o descărcare uneori supraviețuiește trimiterii în fundal exact atât cât îți ia să observi că nu a supraviețuit.
Răspunsul corect este de altă natură. iOS oferă un serviciu de transfer în fundal: îi dai sistemului o listă de adrese URL și destinații, iar sistemul face descărcarea el însuși, în propriul proces, după propriul program. Aplicația ta poate fi suspendată, terminată sau deloc în execuție — transferul continuă, iar aplicația e relansată în fundal când există ceva de raportat. Acesta e mecanismul din spatele fiecărei descărcări care supraviețuiește unui ecran blocat, iar folosirea lui e o decizie de design pe care o ia aplicația de la bun început, nu o setare pe care o poți activa.
Cele patru mecanisme care decid dacă o descărcare supraviețuiește
- Cerere range
- O cerere HTTP care cere octeții începând de la 5.000.000 în loc de fișierul întreg. Dacă serverul răspunde cu
206 Partial Content, reluarea din mijloc e posibilă; dacă răspunde cu200 OKși începe de la zero, nu e — fișierul trebuie preluat din nou, de la capăt. - Conexiuni paralele
- Împărțirea unui fișier în mai multe intervale și preluarea lor simultană. Ajută pentru că o singură conexiune este adesea limitată de server sau restricționată de latența dus-întors, nu pentru că internetul tău e mai rapid cu mai multe socluri deschise.
- Poziție confirmată (committed offset)
- Cât din fișier e scris în siguranță pe disc, spre deosebire de ce e încă în tranzit. O descărcare care reia de la ultimul octet confirmat e corectă; una care reia de la ce *crede* că a primit produce un fișier corupt care se dezvăluie abia peste ore.
- Sesiune de fundal
- Transferul rulat de sistem, descris mai sus. Pornește mai încet, nu i se poate da o logică personalizată arbitrară, și este singurul lucru care continuă să funcționeze când aplicația nu o face.
De ce eșuează o descărcare și cum arată fiecare eșec
Majoritatea raportărilor de „descărcare blocată” se încadrează într-una din aceste cinci, iar odată ce le cunoști forma sunt ușor de deosebit.
| Ce vezi | Ce se întâmplă de fapt | Ce ajută |
|---|---|---|
| Se oprește chiar în momentul în care ieși din aplicație | Transferul rula în procesul aplicației, nu într-o sesiune de fundal. | Nimic ce poți face din exterior — e o problemă de design al aplicației. |
| Repornește de la 0% de fiecare dată | Serverul ignoră cererile de tip range, deci nu există cum să continue din mijloc. | O conexiune stabilă sau un fișier mai mic. Unele gazde permit range doar pentru linkuri semnate. |
| Eșuează după câteva minute, în mod repetat | Link-ul a expirat. Multe gazde emit adrese URL valabile cinci sau zece minute. | Preia din nou link-ul de pe pagina lui și ia-o de la capăt; cel vechi nu va mai funcționa niciodată. |
| Se descarcă rapid, apoi fișierul nu se deschide | Ce a ajuns era o pagină de eroare HTML sau o pagină de autentificare cu un nume de fișier video. | Verifică dimensiunea — un „film” de 14 KB e o pagină web. Inspectează link-ul înainte de a te angaja. |
| Foarte lentă în ciuda unei conexiuni rapide | Limitare per-conexiune la capătul serverului. | Mai multe conexiuni paralele, dacă serverul le permite. Dacă limitează după adresa IP, nu după soclu, nimic nu ajută. |
Când nu există deloc un fișier de descărcat
O mare parte din videoclipurile de pe web nu sunt livrate ca fișier. Sunt livrate ca HLS — un playlist .m3u8 care listează sute de segmente mici, de câteva secunde fiecare, adesea la mai multe niveluri de calitate, astfel încât player-ul să poată comuta pe măsură ce conexiunea ta se schimbă. Nu există un singur URL care să conțină filmul, pentru că filmul există doar ca o secvență.
Salvarea unuia înseamnă preluarea fiecărui segment și apoi remultiplexarea lor: scrierea fluxurilor video și audio într-un container MP4 obișnuit. Nimic nu e recodat, deci nimic nu se pierde, și durează câteva secunde, nu cât durata filmului. Rezultatul e un fișier obișnuit care se redă oriunde.
Acesta e și motivul pentru care „descarcă acest flux” pornește vizibil mai lent decât descărcarea unui fișier: playlist-ul trebuie preluat și analizat, un nivel de calitate ales, și abia apoi pot începe să sosească segmentele. Și e motivul pentru care unele fluxuri nu pot fi salvate deloc — dacă segmentele sunt criptate sub o schemă DRM, cheile sunt în mod deliberat imposibil de obținut, și niciun instrument care respectă legea nu va trece de asta.
Ce separă un manager de descărcări real de un buton de descărcare
Supraviețuiește închiderii aplicației
Transferuri în fundal predate sistemului, cu o predare care continuă de la același octet confirmat, în loc să pornească fișierul din nou.
Îți spune ce este un link înainte să te angajezi
Dimensiune, tip și dacă serverul suportă reluarea — toate aflabile dintr-o singură cerere HEAD, și toate utile înainte să cheltuiești patru gigaocteți din planul de date.
Pune la coadă, nu inundă
Zece fișiere deodată e mai lent decât câte trei pe rând, pentru că fiecare conexiune primește o cotă mai mică și eșecurile se înmulțesc. O coadă cu o limită sensibilă de concurență se termină mai devreme.
Ce rezultă e un fișier normal
Într-un folder pe care îl poți vedea, denumit sensibil, redabil de orice — nu un bloc de bază de date pe care doar acea aplicație îl poate deschide.
Obiceiuri care previn majoritatea problemelor de descărcare
- Pornește fișierele mari pe Wi-Fi și lasă ecranul pornit primele câteva secunde
Predarea către sesiunea de fundal se face devreme; după aceea ecranul nu mai contează.
- Nu pune la coadă douăzeci de elemente deodată
Trei până la cinci transferuri simultane e punctul optim pe aproape orice conexiune.
- Verifică spațiul liber înainte, nu după
Un transfer care umple discul eșuează la 98%, iar iOS ar putea fi golit deja cache-urile tale încercând să facă loc.
- Tratează cu suspiciune un „finalizat” instantaneu
Un film terminat în două secunde e o pagină de eroare. Uită-te la dimensiunea fișierului.
- Repreia link-urile expirate de pe pagina lor
Reîncercarea unui URL semnat, mort, va eșua veșnic, indiferent de câte ori reîncearcă aplicația.
Cum diferă asta între dispozitive
Cel mai strict mediu: suspendarea e agresivă și stocarea e limitată. Sesiunile de fundal nu sunt o optimizare aici, sunt singurul lucru care funcționează.
Aceleași reguli, cu mai mult loc de manevră — și singurul dispozitiv iOS unde o bibliotecă mare poate ajunge rezonabil pe o unitate externă în loc de stocarea internă.
Fără suspendare deloc, deci transferurile lungi se comportă ca pe orice desktop. Limita practică e serverul, nu sistemul de operare.
Întrebări pe care le ridică asta
Mai multe conexiuni înseamnă întotdeauna o descărcare mai rapidă?
Nu. Ajută atunci când un server limitează viteza fiecărei conexiuni individuale, ceea ce e frecvent. Nu fac nimic când limita e conexiunea ta proprie, și pot înrăutăți lucrurile când o gazdă numără soclurile per adresă IP și începe să le refuze. Undeva între patru și opt e intervalul util; treizeci e contraproductiv.
Poate continua o descărcare cât timp ecranul e blocat?
Da, dacă a fost predată serviciului de transfer în fundal al sistemului. Ecranul de blocare e irelevant pentru acel serviciu — contează faptul că aplicația e suspendată, iar întregul rost al mecanismului e că merge înainte indiferent.
De ce descărcarea mea repornește în loc să continue?
Serverul nu a onorat cererea de tip range. Îți dai seama pentru că progresul revine la zero în loc să continue de unde a rămas. Unele gazde suportă range doar pe adresele lor de descărcare semnate, altele îl dezactivează complet, iar câteva îl onorează pentru fișiere mici, dar nu și pentru cele mari.
Convertirea unui flux în MP4 e același lucru cu recodarea lui?
Nu. Remultiplexarea mută videoclipul și audioul existente într-un container MP4 neatinse — fără pierderi și suficient de rapid să se termine în câteva secunde. Recodarea reconstruiește imaginea cu un alt codec și pierde întotdeauna calitate. Dacă salvarea unui flux de două ore durează două ore, ceva se recodează degeaba.
Cum descarcă FoxDL
Motorul are două benzi: una internă, care e rapidă cât timp aplicația e pe ecran, și sesiunea de fundal a sistemului, care preia de la același octet când nu e.
- Bucăți paralele pentru un singur fișier, scrise direct în poziția lor finală pe disc, nu în părți temporare care trebuie unite ulterior.
- Transferuri în fundal care continuă după ce aplicația iese de pe ecran și reiau de la ultima poziție confirmată — nu de la ultimul octet pe care aplicația credea că l-a primit.
- Reluare după o întrerupere, o repornire sau o închidere forțată, cu condiția ca serverul să onoreze cererile de tip range. Când nu o face, FoxDL spune asta în loc să intre într-o buclă.
- Fluxurile HLS remultiplexate în MP4, deci ce ajunge în bibliotecă e un fișier obișnuit, nu un folder de segmente.
- Un inspector de descărcări care raportează dimensiunea reală, tipul și suportul de reluare al unui link înainte să începi.
- Totul ajunge într-un folder normal pe care aplicația Files îl poate vedea.
Alocațiile gratuite diferă în funcție de platformă: pe iPhone și iPad, un număr mic de utilizări reîncărcate printr-un scurt videoclip recompensat pe care îl pornești tu; pe Mac, unde nu există deloc publicitate, un număr zilnic fix. Pro elimină limita pe orice dispozitiv.
Întrebări frecvente
- Descărcările continuă când părăsesc aplicația?
- O descărcare întreruptă poate relua de unde s-a oprit?
- Poate FoxDL descărca un stream HLS (m3u8)?
- De ce e lentă descărcarea mea și o pot accelera?
- Câte descărcări pot face în versiunea gratuită?
Continuă lectura
Ce trebuie să se întâmple înainte ca o pagină web să-ți dea fișierul
Cele patru moduri prin care o pagină livrează video, și de ce doar unul dintre ele e un fișier pe care îl poți păstra.
Unde locuiesc de fapt fișierele tale pe un iPhone, și cine le poate vedea
Sandbox-ul, unde ajung de fapt descărcările, și de ce redenumirea unui fișier strică atâtea aplicații.
De ce iPhone-ul tău deschide un fișier video și îl refuză pe următorul
Containere, codecuri, și cele trei moduri de a urmări un fișier pe care iOS îl refuză.
Biblioteca ta, în sfârșit într-un singur loc.
Descărcare gratuită. Fără cont, fără înregistrare — tot setul e în versiunea free.