On-Demand Resources „ to technologia Apple do opóźnionego pobierania treści aplikacji. Zamiast dołączać wszystkie zasoby do pakietu instalacyjnego, programista umieszcza je na serwerach App Store i pobiera w razie potrzeby. Według Apple ODR Guide pozwala to zmniejszyć rozmiar początkowej instalacji i dodawać nową treść bez aktualizacji wersji aplikacji.
Najważniejsze
On-Demand Resources (ODR) „ to system zarządzania treścią wbudowany w iOS, tvOS i macOS. Pozwala programiście podzielić zasoby aplikacji na obowiązkowe (wchodzące w skład pakietu instalacyjnego) i pobierane na żądanie (przechowywane w App Store i pobierane w razie potrzeby).
System ODR operuje trzema kluczowymi jednostkami: tagami, pakietami zasobów i żądaniami. Tag „ to ciąg znaków identyfikujący grupę plików. Pakiet zasobów „ to zestaw danych powiązanych z tagiem. Żądanie „ to programowe wywołanie NSBundleResourceRequest inicjujące pobranie pakietu.
Pobieranie zasobu przechodzi kilka etapów: inicjalizacja żądania z określeniem tagów, sprawdzenie dostępności w lokalnym magazynie, pobranie z serwerów Apple w razie braku, powiadomienie aplikacji o gotowości i zwolnienie zasobu po użyciu. System automatycznie zarządza buforowaniem i usuwaniem nieużywanych zasobów.
| Etap | Działanie systemu | Czas wykonania |
|---|---|---|
| Inicjalizacja | Utworzenie NSBundleResourceRequest z tagiem | Natychmiast |
| Sprawdzenie pamięci podręcznej | Wyszukanie zasobu w lokalnym magazynie | 0,1–0,5 s |
| Pobieranie | Ściągnięcie z CDN Apple | Zależy od rozmiaru |
| Powiadomienie | Wywołanie completion handler lub delegata | Natychmiast |
| Zwolnienie | Oznaczenie zasobu jako możliwego do usunięcia przez system | Na żądanie iOS |
Mechanizm ODR opiera się na usłudze działającej w tle, która zarządza żądaniami zasobów z chmury App Store. Gdy aplikacja żąda tagu, system sprawdza, czy zasób znajduje się w lokalnej pamięci podręcznej. Jeśli nie „ rozpoczyna pobieranie przez sesję URL w tle z obsługą wznawiania po przerwaniu połączenia.
import Foundation
class ResourceManager {
let odrRequest = NSBundleResourceRequest(tags: ["level-3"])
func loadLevel3() {
odrRequest.conditionallyBeginAccessingResources { available in
if available {
self.startLevel3()
} else {
self.odrRequest.beginAccessingResources { error in
guard error == nil else { return }
self.startLevel3()
}
}
}
}
func releaseResources() {
odrRequest.endAccessingResources()
}
}
Metoda conditionallyBeginAccessingResources sprawdza dostępność zasobu w pamięci podręcznej bez natychmiastowego pobierania. Jeśli flaga dostępności jest pozytywna „ aplikacja kontynuuje działanie bez opóźnienia. Jeśli zasób jest nieobecny, beginAccessingResources uruchamia pobieranie z postępem śledzonym przez właściwość progress.
System iOS sam zarządza priorytetami pobierania zasobów ODR w zależności od bieżącej aktywności aplikacji. Jeśli aplikacja jest na pierwszym planie, pobieranie odbywa się z wysokim priorytetem. W tle iOS może opóźnić pobieranie lub wstrzymać je przy niskim poziomie baterii.
Zasoby ODR mogą obejmować obrazy, wideo, pliki audio, sprite'y, dane poziomów i wszelkie inne pliki niekrytyczne dla uruchomienia aplikacji. Każdy zasób jest przypisany do jednego lub kilku tagów, które określają jego przynależność do bloku funkcjonalnego.
W Xcode tagi konfiguruje się przez inspektor Resource Tags na karcie Target Membership. Programista określa dla każdego pliku w projekcie, czy wchodzi on w skład głównego pakietu, czy jest pobierany przez tag. Jeden plik może należeć do wielu tagów, co pozwala na współdzielenie zasobów między różnymi sekcjami aplikacji.
<!-- Przykładowa konfiguracja Resource Tags w Info.plist -->
<key>NSBundleResourceRequestTags</key>
<dict>
<key>level-3</key>
<array>
<string>levels/level3.scnassets</string>
<string>textures/level3_tex.png</string>
</array>
</dict>
Apple wyróżnia trzy kategorie tagów ODR w zależności od tego, jak długo zasób powinien być przechowywany na urządzeniu. Initial Install Tags są pobierane wraz z aplikacją i nigdy nie są usuwane przez system. Prefetch Tag Order określa kolejność wczytywania w tle zaraz po instalacji. Główne tagi są pobierane na żądanie i mogą być usunięte przez iOS przy braku miejsca.
Oprócz kategorii, każdy tag może mieć priorytet pobierania. Tagi z wysokim priorytetem są pobierane przed niskopriorytetowymi, nawet jeśli zostały zażądane później. Pozwala to programiście zarządzać kolejnością pojawiania się treści: najpierw krytyczne zasoby dla głównego ekranu, potem dodatkowe materiały dla głębokich sekcji aplikacji.
Konfiguracja ODR w Xcode obejmuje trzy etapy: kategoryzacja zasobów według tagów, konfiguracja parametrów pobierania w Info.plist i programowa implementacja żądań przez NSBundleResourceRequest. Większość pracy wykonuje się po stronie kompilacji projektu.
// Sprawdzenie statusu i monitorowanie postępu ODR
func monitorODRProgress(tag: String) {
let request = NSBundleResourceRequest(tags: [tag])
let observer = request.progress.observe(\.fractionCompleted) { progress, _ in
DispatchQueue.main.async {
let percent = Int(progress.fractionCompleted * 100)
print("ODR: \(percent)% załadowano")
}
}
}
Postęp pobierania jest śledzony przez właściwość progress klasy NSProgress z obsługą obserwacji KVO. Aplikacja może wyświetlić użytkownikowi wskaźnik postępu podczas pobierania zasobów. Po zakończeniu pobierania zasoby są dostępne w głównym pakiecie aplikacji przez standardowe mechanizmy FileManager i NSDataAsset.
Limity ODR zależą od wersji iOS. Od iOS 13 urządzenie może przechowywać do 20 GB pobranych na żądanie zasobów na jedno konto. Ten wolumen jest rozdzielany między wszystkie aplikacje zainstalowane na urządzeniu „ jeśli jedna aplikacja zajęła dużo miejsca, innym pozostaje mniej.
Monitorowanie zajętego miejsca odbywa się przez NSBundleResourceRequest. Aplikacja może sprawdzać dostępną pamięć ODR i w zależności od tego decydować, które zasoby pobrać w pierwszej kolejności. Zaleca się zaimplementowanie mechanizmu fallback: jeśli pamięć ODR jest pełna, używać zasobów z głównego pakietu o obniżonej jakości.
Po przekroczeniu limitu system usuwa zasoby z tagami On-Demand w kolejności najmniej ostatnio używanych, zaczynając od najstarszych. Resource Manager w kodzie aplikacji może śledzić bieżący wolumen zajętej pamięci ODR przez właściwość NSBundleResourceRequest.Programista musi uwzględnić, że iOS może w każdej chwili podjąć decyzję o usunięciu zasobów On-Demand „ aplikacja powinna poprawnie obsługiwać sytuację, gdy wcześniej pobrany zasób nagle staje się niedostępny. Zaleca się przechwytywanie błędów dostępu do zasobów i ponowne ich żądanie przez beginAccessingResources. Dla krytycznie ważnych zasobów, bez których aplikacja nie może działać, należy używać Initial Install Tags, które nie są usuwane przez system.
On-Demand Resources dają programiście elastyczne narzędzie do zarządzania rozmiarem aplikacji, ale nakładają szereg ograniczeń związanych z dostępnością sieci i politykami pamięci iOS.
Główna zaleta ODR „ radykalne zmniejszenie rozmiaru początkowej instalacji. Gry z wieloma poziomami, aplikacje z treścią wideo lub dużymi zestawami obrazów mogą pobierać treść porcjami. Użytkownik otrzymuje dostęp do podstawowej funkcjonalności od razu, a dodatkowe zasoby są pobierane w tle.
ODR wymaga stałego połączenia z internetem do pobierania zasobów przy pierwszym dostępie. Użytkownik w obszarze o słabym zasięgu może napotkać opóźnienia i błędy pobierania. Ponadto Apple nie gwarantuje, że pobrane zasoby pozostaną na urządzeniu „ przy braku miejsca iOS może usunąć tagi On-Demand bez ostrzeżenia.
Często zadawane pytania
ODR pozwala dodawać i zmieniać zasoby bez publikowania nowej wersji w App Store. Wystarczy zaktualizować pliki na serwerze Apple przez Xcode i przypisać je do tych samych tagów. Przy następnym żądaniu aplikacja otrzyma aktualną wersję zasobu. Jest to wygodne dla treści sezonowych, tymczasowych promocji i testów A/B nowych obrazów i układów.
System usuwa zasoby oznaczone jako On-Demand, gdy trzeba zwolnić miejsce dla innych aplikacji. Zasoby Initial Install Tags nie są usuwane. Kolejność usuwania określa algorytm LRU (Least Recently Used) „ najpierw usuwane są zasoby, do których najdłużej nie było dostępu.
Od iOS 13 całkowity limit pamięci ODR wynosi 20 GB na jeden Apple ID użytkownika. Rozmiar jednego tagu nie powinien przekraczać 512 MB dla optymalnej wydajności pobierania. Po przekroczeniu limitu żądania kończą się błędem NSBundleResourceRequestLowDiskSpaceError.
Tak, po pobraniu zasób jest zapisywany w lokalnej pamięci podręcznej i dostępny w trybie offline bez połączenia z internetem. Problemy występują tylko jeśli iOS usunął zasób z powodu braku miejsca, a użytkownik próbuje uzyskać do niego dostęp bez sieci.
ODR jest zintegrowany z infrastrukturą App Store: zasoby są hostowane na CDN Apple, zarządzane przez system buforowania i nie wymagają od programisty organizacji własnego serwera. URLSession wymaga infrastruktury serwerowej, kontroli wersji i ręcznego zarządzania buforem. ODR dodatkowo automatycznie obsługuje wznawianie pobierania po przerwaniu połączenia.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również