On-Demand Resources " είναι η τεχνολογία της Apple για καθυστερημένη φόρτωση περιεχομένου εφαρμογής. Αντί να συμπεριλάβει όλους τους πόρους στο πακέτο εγκατάστασης, ο προγραμματιστής τους τοποθετεί στους διακομιστές του App Store και τους ζητά όταν χρειάζεται. Σύμφωνα με τον Apple ODR Guide, αυτό επιτρέπει τη μείωση του μεγέθους αρχικής εγκατάστασης και την προσθήκη νέου περιεχομένου χωρίς ενημέρωση της έκδοσης της εφαρμογής.
Κύρια σημεία
On-Demand Resources (ODR) " είναι ένα σύστημα διαχείρισης περιεχομένου ενσωματωμένο στο iOS, tvOS και macOS. Επιτρέπει στον προγραμματιστή να διαχωρίσει τους πόρους της εφαρμογής σε υποχρεωτικούς (μέρος του πακέτου εγκατάστασης) και φορτώσιμους κατόπιν ζήτησης (αποθηκευμένους στο App Store και λήψη όταν χρειάζεται).
Το σύστημα ODR λειτουργεί με τρεις βασικές οντότητες: ετικέτες, πακέτα πόρων και αιτήματα. Η ετικέτα είναι μια συμβολοσειρά αναγνωριστικού που ενώνει μια ομάδα αρχείων. Το πακέτο πόρων είναι ένα σύνολο δεδομένων που σχετίζεται με μια ετικέτα. Το αίτημα είναι μια προγραμματιστική κλήση NSBundleResourceRequest που ξεκινά τη φόρτωση του πακέτου.
Η φόρτωση πόρου περνά από διάφορα στάδια: αρχικοποίηση αιτήματος με καθορισμό ετικετών, έλεγχος διαθεσιμότητας στην τοπική αποθήκευση, λήψη από τους διακομιστές της Apple σε περίπτωση απουσίας, ειδοποίηση της εφαρμογής για ετοιμότητα και απελευθέρωση του πόρου μετά τη χρήση. Το σύστημα διαχειρίζεται αυτόματα την προσωρινή αποθήκευση και τη διαγραφή αχρησιμοποίητων πόρων.
| Στάδιο | Ενέργεια συστήματος | Χρόνος εκτέλεσης |
|---|---|---|
| Αρχικοποίηση | Δημιουργία NSBundleResourceRequest με ετικέτα | Άμεσα |
| Έλεγχος προσωρινής μνήμης | Αναζήτηση πόρου στην τοπική αποθήκευση | 0,1–0,5 δευτ. |
| Λήψη | Λήψη από το CDN της Apple | Εξαρτάται από το μέγεθος |
| Ειδοποίηση | Κλήση completion handler ή εκπροσώπου | Άμεσα |
| Απελευθέρωση | Σήμανση πόρου ως διαγράψιμου από το σύστημα | Κατόπιν αιτήματος iOS |
Ο μηχανισμός ODR βασίζεται σε μια υπηρεσία παρασκηνίου που διαχειρίζεται αιτήματα πόρων από τον αποθηκευτικό χώρο cloud του App Store. Όταν η εφαρμογή ζητά μια ετικέτα, το σύστημα ελέγχει αν ο πόρος υπάρχει στην τοπική προσωρινή μνήμη. Αν όχι " ξεκινά τη λήψη μέσω μιας περιόδου σύνδεσης URL παρασκηνίου με υποστήριξη συνέχισης σε περίπτωση διακοπής σύνδεσης.
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()
}
}
Η μέθοδος conditionallyBeginAccessingResources ελέγχει τη διαθεσιμότητα του πόρου στην προσωρινή μνήμη χωρίς άμεση φόρτωση. Εάν η σημαία διαθεσιμότητας είναι θετική " η εφαρμογή συνεχίζει χωρίς καθυστέρηση. Εάν ο πόρος απουσιάζει, η beginAccessingResources ξεκινά τη λήψη με ένδειξη προόδου μέσω της ιδιότητας progress.
Το σύστημα iOS διαχειρίζεται το ίδιο τις προτεραιότητες φόρτωσης πόρων ODR ανάλογα με την τρέχουσα δραστηριότητα της εφαρμογής. Εάν η εφαρμογή βρίσκεται στο προσκήνιο, η φόρτωση γίνεται με υψηλή προτεραιότητα. Στο παρασκήνιο, το iOS μπορεί να καθυστερήσει τη φόρτωση ή να τη διακόψει όταν η μπαταρία είναι χαμηλή.
Οι πόροι ODR μπορούν να περιλαμβάνουν εικόνες, βίντεο, αρχεία ήχου, sprites, δεδομένα επιπέδων και οποιαδήποτε άλλα αρχεία που δεν είναι κρίσιμα για την εκκίνηση της εφαρμογής. Κάθε πόρος συνδέεται με μία ή περισσότερες ετικέτες που καθορίζουν την υπαγωγή του σε ένα λειτουργικό μπλοκ.
Στο Xcode, οι ετικέτες ρυθμίζονται μέσω του επιθεωρητή Resource Tags στην καρτέλα Target Membership. Ο προγραμματιστής καθορίζει για κάθε αρχείο στο έργο εάν αποτελεί μέρος του κεντρικού πακέτου ή φορτώνεται μέσω ετικέτας. Ένα αρχείο μπορεί να ανήκει σε πολλές ετικέτες, επιτρέποντας την επαναχρησιμοποίηση πόρων μεταξύ διαφορετικών τμημάτων της εφαρμογής.
<!-- Παράδειγμα διαμόρφωσης Resource Tags στο 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 διακρίνει τρεις κατηγορίες ετικετών ODR ανάλογα με το πόσο χρόνο πρέπει να παραμείνει ο πόρος στη συσκευή. Οι Initial Install Tags φορτώνονται μαζί με την εφαρμογή και δεν διαγράφονται ποτέ από το σύστημα. Η Prefetch Tag Order καθορίζει τη σειρά φόρτωσης παρασκηνίου αμέσως μετά την εγκατάσταση. Οι κύριες ετικέτες φορτώνονται κατόπιν ζήτησης και μπορούν να διαγραφούν από το iOS σε περίπτωση έλλειψης χώρου.
Εκτός από τις κατηγορίες, κάθε ετικέτα μπορεί να έχει προτεραιότητα φόρτωσης. Οι ετικέτες με υψηλή προτεραιότητα φορτώνονται πριν από εκείνες με χαμηλή προτεραιότητα, ακόμα κι αν ζητήθηκαν αργότερα. Αυτό επιτρέπει στον προγραμματιστή να διαχειριστεί τη σειρά εμφάνισης περιεχομένου: πρώτα οι κρίσιμοι πόροι για την κύρια οθόνη, έπειτα τα πρόσθετα υλικά για τα βαθιά τμήματα της εφαρμογής.
Η ρύθμιση ODR στο Xcode περιλαμβάνει τρία στάδια: κατηγοριοποίηση πόρων ανά ετικέτα, διαμόρφωση παραμέτρων φόρτωσης στο Info.plist και προγραμματιστική υλοποίηση αιτημάτων μέσω NSBundleResourceRequest. Το μεγαλύτερο μέρος της εργασίας γίνεται στην πλευρά δημιουργίας του έργου.
// Έλεγχος κατάστασης και παρακολούθηση προόδου 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)% φορτώθηκε")
}
}
}
Η πρόοδος φόρτωσης παρακολουθείται μέσω της ιδιότητας progress της κλάσης NSProgress με υποστήριξη παρατήρησης KVO. Η εφαρμογή μπορεί να εμφανίσει δείκτη προόδου στον χρήστη κατά τη λήψη πόρων. Μετά την ολοκλήρωση της φόρτωσης, οι πόροι είναι διαθέσιμοι στο κεντρικό πακέτο της εφαρμογής μέσω των τυπικών μηχανισμών FileManager και NSDataAsset.
Οι ποσοστώσεις ODR εξαρτώνται από την έκδοση iOS. Από το iOS 13, η συσκευή μπορεί να αποθηκεύσει έως 20 GB πόρων που έχουν ληφθεί κατόπιν ζήτησης ανά λογαριασμό. Αυτός ο όγκος κατανέμεται μεταξύ όλων των εφαρμογών που είναι εγκατεστημένες στη συσκευή " αν μια εφαρμογή καταλαμβάνει πολύ χώρο, λιγότερος απομένει για τις άλλες.
Η παρακολούθηση του κατειλημμένου χώρου γίνεται μέσω του NSBundleResourceRequest. Η εφαρμογή μπορεί να ελέγξει τον διαθέσιμο χώρο αποθήκευσης ODR και βάσει αυτού να αποφασίσει ποιους πόρους θα φορτώσει πρώτα. Συνιστάται η υλοποίηση μηχανισμού fallback: εάν ο χώρος ODR είναι γεμάτος, χρησιμοποιήστε πόρους από το κεντρικό πακέτο μειωμένης ποιότητας.
Κατά την υπέρβαση της ποσόστωσης, το σύστημα διαγράφει πόρους με ετικέτες On-Demand με σειρά λιγότερο πρόσφατης χρήσης, ξεκινώντας από τους παλαιότερους. Ο Resource Manager στον κώδικα της εφαρμογής μπορεί να παρακολουθεί τον τρέχοντα όγκο του κατειλημμένου χώρου ODR μέσω της ιδιότητας NSBundleResourceRequest.Ο προγραμματιστής πρέπει να λάβει υπόψη ότι το iOS μπορεί ανά πάσα στιγμή να αποφασίσει τη διαγραφή πόρων On-Demand " η εφαρμογή πρέπει να χειριστεί σωστά την κατάσταση όπου ένας προηγουμένως φορτωμένος πόρος γίνεται ξαφνικά μη διαθέσιμος. Συνιστάται η σύλληψη σφαλμάτων πρόσβασης σε πόρους και η εκ νέου αίτησή τους μέσω beginAccessingResources. Για κρίσιμους πόρους χωρίς τους οποίους η εφαρμογή δεν μπορεί να λειτουργήσει, χρησιμοποιήστε Initial Install Tags που δεν διαγράφονται από το σύστημα.
Τα On-Demand Resources παρέχουν στον προγραμματιστή ένα ευέλικτο εργαλείο διαχείρισης του μεγέθους της εφαρμογής, αλλά επιβάλλουν μια σειρά περιορισμών σχετικά με τη διαθεσιμότητα δικτύου και τις πολιτικές αποθήκευσης iOS.
Το κύριο πλεονέκτημα του ODR " η δραστική μείωση του μεγέθους αρχικής εγκατάστασης. Παιχνίδια με πολλά επίπεδα, εφαρμογές με περιεχόμενο βίντεο ή μεγάλα σύνολα εικόνων μπορούν να φορτώνουν περιεχόμενο τμηματικά. Ο χρήστης αποκτά άμεση πρόσβαση στη βασική λειτουργικότητα, ενώ οι πρόσθετοι πόροι λαμβάνονται στο παρασκήνιο.
Το ODR απαιτεί μόνιμη σύνδεση στο διαδίκτυο για τη φόρτωση πόρων κατά την πρώτη πρόσβαση. Ο χρήστης σε περιοχή με κακή κάλυψη μπορεί να αντιμετωπίσει καθυστερήσεις και σφάλματα φόρτωσης. Επιπλέον, η Apple δεν εγγυάται ότι οι φορτωμένοι πόροι θα παραμείνουν στη συσκευή " σε περίπτωση έλλειψης χώρου, το iOS μπορεί να διαγράψει ετικέτες On-Demand χωρίς προειδοποίηση.
Συχνές Ερωτήσεις
Το ODR επιτρέπει την προσθήκη και τροποποίηση πόρων χωρίς δημοσίευση νέας έκδοσης στο App Store. Αρκεί να ενημερώσετε τα αρχεία στον διακομιστή της Apple μέσω Xcode και να τα αντιστοιχίσετε στις ίδιες ετικέτες. Στο επόμενο αίτημα, η εφαρμογή θα λάβει την τρέχουσα έκδοση του πόρου. Αυτό είναι βολικό για εποχιακό περιεχόμενο, προσωρινές προωθητικές ενέργειες και δοκιμές A/B νέων εικόνων και διατάξεων.
Το σύστημα διαγράφει πόρους με την ένδειξη On-Demand όταν χρειάζεται να ελευθερώσει χώρο για άλλες εφαρμογές. Οι πόροι Initial Install Tags δεν διαγράφονται. Η σειρά διαγραφής καθορίζεται από τον αλγόριθμο LRU (Least Recently Used) " πρώτα διαγράφονται οι πόροι στους οποίους δεν έχει γίνει πρόσβαση για το μεγαλύτερο χρονικό διάστημα.
Από το iOS 13, το συνολικό όριο αποθήκευσης ODR είναι 20 GB ανά Apple ID χρήστη. Το μέγεθος μιας ετικέτας δεν πρέπει να υπερβαίνει τα 512 MB για βέλτιστη απόδοση φόρτωσης. Σε περίπτωση υπέρβασης του ορίου, τα αιτήματα καταλήγουν σε σφάλμα NSBundleResourceRequestLowDiskSpaceError.
Ναι, μετά τη φόρτωση, ο πόρος αποθηκεύεται στην τοπική προσωρινή μνήμη και είναι διαθέσιμος σε λειτουργία εκτός σύνδεσης χωρίς σύνδεση στο διαδίκτυο. Προβλήματα προκύπτουν μόνο εάν το iOS έχει διαγράψει τον πόρο λόγω έλλειψης χώρου και ο χρήστης προσπαθεί να τον προσεγγίσει χωρίς δίκτυο.
Το ODR είναι ενσωματωμένο με την υποδομή του App Store: οι πόροι φιλοξενούνται στο CDN της Apple, διαχειρίζονται από το σύστημα προσωρινής αποθήκευσης και δεν απαιτούν από τον προγραμματιστή να οργανώσει δικό του διακομιστή. Το URLSession απαιτεί υποδομή διακομιστή, έλεγχο εκδόσεων και χειροκίνητη διαχείριση προσωρινής μνήμης. Το ODR επίσης χειρίζεται αυτόματα τη συνέχιση της λήψης μετά από διακοπή σύνδεσης.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.