Co robi menedżer pobierania, czego nie zrobi przeglądarka internetowa
Czterogigabajtowy plik, ukończony w dziewięćdziesięciu procentach, a potem telefon — albo po prostu zablokowany ekran — i po nim. To najczęstsza skarga na pobieranie na iOS, i to nie jest błąd. To system operacyjny robiący dokładnie to, do czego został zaprojektowany, i powód, dla którego istnieje osobna klasa aplikacji.
- 30s Mniej więcej tyle działa zawieszona aplikacja, zanim iOS ją zatrzyma
- 206 Status HTTP, który w ogóle umożliwia wznawianie
- 1 bajt Tyle jest ponownie pobierane przy poprawnie wznowionym transferze
Dlaczego transfer zatrzymuje się przy przełączeniu aplikacji
iOS nie pozwala aplikacji dalej działać tylko dlatego, że by chciała. Gdy opuszczasz aplikację, jest zawieszana w ciągu kilku sekund, a zawieszona aplikacja nie ma czasu procesora, gniazd sieciowych ani sposobu, by zauważyć, że ją zatrzymano. Wszystko, co trzymała w pamięci, wciąż tam jest, ale zamrożone — a jeśli system potrzebuje pamięci, aplikacja jest zamykana od razu, bez informowania jej o tym.
Pobieranie działające na zwykłym połączeniu wewnątrz aplikacji kończy się więc przy geście powrotu do ekranu głównego. Niektóre aplikacje ukrywają to, prosząc o kilka dodatkowych sekund czasu w tle, dlatego pobieranie czasem przetrwa zejście do tła dokładnie tyle, ile zajmuje ci zauważenie, że jednak nie przetrwało.
Właściwa odpowiedź jest z innej kategorii. iOS udostępnia systemową usługę transferu w tle: przekazujesz systemowi listę adresów URL i miejsc docelowych, a system sam wykonuje pobieranie, we własnym procesie, według własnego harmonogramu. Twoja aplikacja może być zawieszona, zamknięta albo w ogóle nieuruchomiona — transfer trwa dalej, a aplikacja jest ponownie uruchamiana w tle, gdy jest coś do zgłoszenia. To mechanizm stojący za każdym pobraniem, które przetrwa zablokowany ekran, a skorzystanie z niego to decyzja projektowa podejmowana przez aplikację z góry, a nie ustawienie, które można włączyć.
Cztery mechanizmy decydujące, czy pobieranie przetrwa
- Żądanie zakresu
- Żądanie HTTP proszące o bajty od 5 000 000 wzwyż zamiast całego pliku. Jeśli serwer odpowie
206 Partial Content, wznowienie od środka jest możliwe; jeśli odpowie200 OKi zacznie od początku, nie jest — plik trzeba pobrać ponownie od zera. - Połączenia równoległe
- Podzielenie jednego pliku na kilka zakresów i pobieranie ich naraz. Pomaga to dlatego, że pojedyncze połączenie jest często ograniczane przez serwer albo limitowane przez opóźnienie w obie strony, a nie dlatego, że twój internet jest szybszy przy większej liczbie otwartych gniazd.
- Zatwierdzone przesunięcie
- Ile pliku jest bezpiecznie zapisane na dysku, w przeciwieństwie do tego, co jest wciąż w drodze. Pobieranie, które wznawia się od ostatniego zatwierdzonego bajtu, jest poprawne; takie, które wznawia się od tego, co *sądzi*, że otrzymało, produkuje uszkodzony plik, który ujawnia się dopiero godzinami później.
- Sesja w tle
- Systemowy transfer opisany powyżej. Wolniej startuje, nie da mu się nadać dowolnej niestandardowej logiki, i jest jedyną rzeczą, która działa dalej, gdy aplikacji nie ma.
Dlaczego pobieranie zawodzi i jak wygląda każda awaria
Większość zgłoszeń „zawieszonego pobierania” to jedna z tych pięciu sytuacji, i łatwo je odróżnić, gdy już znasz ich kształt.
| Co widzisz | Co się naprawdę dzieje | Co pomaga |
|---|---|---|
| Zatrzymuje się w chwili opuszczenia aplikacji | Transfer działał wewnątrz procesu aplikacji, nie w sesji w tle. | Nic, co możesz zrobić z zewnątrz — to kwestia projektu aplikacji. |
| Zawsze zaczyna od 0% | Serwer ignoruje żądania zakresu, więc nie ma sposobu na kontynuację od środka. | Stabilne połączenie albo mniejszy plik. Niektóre serwery pozwalają na zakresy tylko dla podpisanych linków. |
| Zawodzi po kilku minutach, wielokrotnie | Link wygasł. Wiele serwerów wydaje adresy URL ważne przez pięć lub dziesięć minut. | Pobierz link ponownie z jego strony i zacznij od nowa; stary nigdy nie zadziała. |
| Pobiera się szybko, ale plik się nie otwiera | To, co dotarło, to strona błędu HTML albo strona logowania z nazwą pliku wideo. | Sprawdź rozmiar — 14-kilobajtowy „film” to strona internetowa. Przejrzyj link, zanim się na niego zdecydujesz. |
| Bardzo wolno mimo szybkiego połączenia | Ograniczanie przepustowości na połączenie po stronie serwera. | Więcej równoległych połączeń, jeśli serwer na to pozwala. Jeśli limituje po adresie IP, a nie po gnieździe, nic nie pomoże. |
Gdy w ogóle nie ma pliku do pobrania
Spora część wideo w internecie nie jest dostarczana jako plik. Jest dostarczana jako HLS — lista odtwarzania .m3u8 wymieniająca setki małych segmentów po kilka sekund każdy, często w kilku poziomach jakości, żeby odtwarzacz mógł się przełączać w miarę zmiany twojego połączenia. Nie ma jednego adresu URL zawierającego film, bo film istnieje tylko jako sekwencja.
Zapisanie go oznacza pobranie każdego segmentu, a potem remultipleksowanie ich: zapisanie strumieni wideo i audio do zwykłego kontenera MP4. Nic nie jest kodowane na nowo, więc nic się nie traci, i zajmuje to sekundy zamiast długości filmu. Wynikiem jest zwykły plik, który odtworzysz wszędzie.
To też tłumaczy, dlaczego „pobierz ten strumień” zaczyna się zauważalnie dłużej niż pobieranie pliku: lista odtwarzania musi zostać pobrana i przetworzona, wybrany poziom jakości, i dopiero wtedy segmenty mogą zacząć napływać. I dlatego niektórych strumieni w ogóle nie da się zapisać — jeśli segmenty są szyfrowane w ramach schematu DRM, klucze są celowo niedostępne, i żadne narzędzie szanujące prawo tego nie ominie.
Co odróżnia prawdziwy menedżer pobierania od przycisku „pobierz”
Przetrwa zamknięcie aplikacji
Transfery w tle przekazane systemowi, z przekazaniem kontynuującym od tego samego zatwierdzonego bajtu, zamiast zaczynać plik od nowa.
Mówi, czym jest link, zanim się zdecydujesz
Rozmiar, typ i to, czy serwer obsługuje wznawianie — wszystko możliwe do poznania z jednego żądania HEAD, i wszystko przydatne, zanim wydasz cztery gigabajty transferu danych.
Kolejkuje, zamiast zalewać
Dziesięć plików naraz jest wolniejsze niż trzy naraz, bo każde połączenie dostaje mniejszy udział, a awarie się mnożą. Kolejka z rozsądnym limitem współbieżności kończy szybciej.
To, co ląduje, to zwykły plik
W folderze, który widzisz, sensownie nazwany, odtwarzalny przez cokolwiek — a nie zaszyfrowany obiekt bazy danych, który otworzy tylko ta jedna aplikacja.
Nawyki zapobiegające większości problemów z pobieraniem
- Zaczynaj duże pliki na Wi-Fi i zostaw ekran włączony na pierwsze kilka sekund
Przekazanie do sesji w tle następuje wcześnie; potem ekran przestaje mieć znaczenie.
- Nie kolejkuj dwudziestu pozycji naraz
Od trzech do pięciu równoczesnych transferów to optymalny zakres na niemal każdym połączeniu.
- Sprawdź wolne miejsce wcześniej, nie potem
Transfer wypełniający dysk zawodzi przy 98%, a iOS mógł już wyczyścić twoje pamięci podręczne, próbując zrobić miejsce.
- Traktuj natychmiastowe „ukończono” z podejrzliwością
Film, który skończył się w dwie sekundy, to strona błędu. Spójrz na rozmiar pliku.
- Pobieraj wygasłe linki ponownie z ich strony
Ponawianie martwego podpisanego adresu URL zawiedzie zawsze, niezależnie od tego, ile razy aplikacja spróbuje.
Jak to się różni między urządzeniami
Najsurowsze środowisko: zawieszanie jest agresywne, a miejsca mało. Sesje w tle nie są tu optymalizacją, są jedyną rzeczą, która działa.
Te same zasady, z większym zapasem — i jedyne urządzenie z iOS, na którym duża biblioteka może rozsądnie wylądować na dysku zewnętrznym zamiast w pamięci wewnętrznej.
W ogóle bez zawieszania, więc długie transfery zachowują się tak jak na każdym komputerze biurkowym. Praktycznym ograniczeniem jest serwer, nie system operacyjny.
Pytania, jakie to rodzi
Czy więcej połączeń zawsze oznacza szybsze pobieranie?
Nie. Pomagają, gdy serwer ogranicza prędkość każdego pojedynczego połączenia, co jest powszechne. Nic nie dają, gdy limitem jest twoje własne połączenie, i mogą pogorszyć sprawę, gdy host liczy gniazda na adres IP i zaczyna je odrzucać. Gdzieś między cztery a osiem to użyteczny zakres; trzydzieści jest przeciwskuteczne.
Czy pobieranie może trwać dalej, gdy ekran jest zablokowany?
Tak, jeśli zostało przekazane systemowej usłudze transferu w tle. Ekran blokady nie ma dla tej usługi znaczenia — liczy się to, że aplikacja jest zawieszona, a cały sens tego mechanizmu polega na tym, że działa mimo to dalej.
Dlaczego moje pobieranie zaczyna od nowa zamiast się wznowić?
Serwer nie uszanował żądania zakresu. Poznasz to po tym, że postęp wraca do zera, zamiast kontynuować. Niektóre serwery obsługują zakresy tylko na swoich podpisanych adresach URL do pobierania, niektóre wyłączają je całkowicie, a kilka respektuje je dla małych plików, ale nie dużych.
Czy konwersja strumienia do MP4 to to samo co przekodowanie?
Nie. Remultipleksowanie przenosi istniejące wideo i audio do kontenera MP4 bez zmian — bezstratnie i na tyle szybko, by skończyć w sekundy. Przekodowanie odbudowuje obraz innym kodekiem i zawsze traci jakość. Jeśli zapisanie dwugodzinnego strumienia zajmuje dwie godziny, coś przekodowuje, choć wcale nie musiało.
Jak FoxDL pobiera
Silnik ma dwa tory: jeden wewnątrz procesu, szybki, gdy aplikacja jest na ekranie, i systemową sesję w tle, która przejmuje kontrolę od tego samego bajtu, gdy jej nie ma.
- Równoległe fragmenty dla jednego pliku, zapisywane wprost w docelowym miejscu na dysku, zamiast w tymczasowych częściach, które trzeba potem połączyć.
- Transfery w tle, które trwają dalej po zejściu aplikacji z ekranu i podejmują pracę od ostatniego zatwierdzonego przesunięcia — nie od ostatniego bajtu, który aplikacja sądziła, że otrzymała.
- Wznowienie po zerwaniu, restarcie lub wymuszonym zamknięciu, o ile serwer respektuje żądania zakresu. Gdy nie, FoxDL mówi to wprost, zamiast zapętlać próby.
- Strumienie HLS przekonwertowane do MP4, więc w bibliotece ląduje zwykły plik, a nie folder segmentów.
- Inspektor pobierania, który zgłasza prawdziwy rozmiar, typ i wsparcie wznowienia dla linku, zanim zaczniesz.
- Wszystko ląduje w zwykłym folderze, który widzi aplikacja Pliki.
Darmowe limity różnią się w zależności od platformy: na iPhonie i iPadzie niewielka liczba prób doładowywana krótkim filmem z nagrodą, który sam uruchamiasz; na Macu, gdzie w ogóle nie ma reklam, stała dzienna liczba. Pro znosi limit na każdym urządzeniu.
Częste pytania
- Czy pobierania działają dalej, gdy opuszczę aplikację?
- Czy przerwane pobieranie może wznowić się od miejsca, w którym stanęło?
- Czy FoxDL potrafi pobrać strumień HLS (m3u8)?
- Dlaczego moje pobieranie jest wolne i czy da się je przyspieszyć?
- Ile pobierań mogę wykonać w wersji darmowej?
Czytaj dalej
Co musi się wydarzyć, zanim strona internetowa odda ci swój plik
Cztery sposoby, w jakie strona dostarcza wideo, i dlaczego tylko jeden z nich to plik, który da się zachować.
Gdzie naprawdę żyją pliki na iPhonie i kto może je zobaczyć
Sandbox, dokąd naprawdę trafiają pobrania, i dlaczego zmiana nazwy pliku psuje tak wiele aplikacji.
Dlaczego iPhone otwiera jeden plik wideo, a następny odrzuca
Kontenery, kodeki i trzy sposoby na obejrzenie pliku, którego nie chce otworzyć iOS.
Twoja biblioteka, wreszcie w jednym miejscu.
Darmowe pobieranie. Bez konta i rejestracji — pełny zestaw w darmowej wersji.