On-Demand Resources " Apple tərəfindən tətbiq məzmununun gecikmiş yüklənməsi üçün texnologiyadır. Bütün resursları quraşdırma paketinə daxil etmək əvəzinə, tərtibatçı onları App Store serverlərində yerləşdirir və lazım olduqda sorğulayır. Apple ODR Guide-a görə, bu ilkin quraşdırma ölçüsünü azaltmağa və tətbiq versiyasını yeniləmədən yeni məzmun əlavə etməyə imkan verir.
Əsas məqamlar
On-Demand Resources (ODR) " iOS, tvOS və macOS-a daxil edilmiş məzmun idarəetmə sistemidir. Tərtibatçıya tətbiq resurslarını məcburi (quraşdırma paketinə daxil olan) və tələb üzrə yüklənən (App Store-da saxlanılan və lazım olduqda endirilən) bölməyə imkan verir.
ODR sistemi üç əsas varlıqla işləyir: teqlər, resurs paketləri və sorğular. Teq fayl qrupunu birləşdirən identifikator sətridir. Resurs paketi teqlə əlaqəli məlumatlar dəstidir. Sorğu paketin yüklənməsini başladan NSBundleResourceRequest proqram çağırışıdır.
Resurs yükləmə bir neçə mərhələdən keçir: teqlərin göstərilməsi ilə sorğunun başladılması, yerli anbarda mövcudluğun yoxlanılması, olmadıqda Apple serverlərindən endirilmə, tətbiqin hazırlıq barədə məlumatlandırılması və istifadədən sonra resursun sərbəst buraxılması. Sistem buferləşdirməni və istifadə olunmayan resursların silinməsini avtomatik idarə edir.
| Mərhələ | Sistem hərəkəti | İcra müddəti |
|---|---|---|
| Başlatma | Teqlə NSBundleResourceRequest yaradılması | Dərhal |
| Keş yoxlaması | Yerli anbarda resurs axtarışı | 0.1–0.5 san |
| Yükləmə | Apple CDN-dən endirmə | Ölçüdən asılıdır |
| Bildiriş | Tamamlama handleri və ya delegatın çağırılması | Dərhal |
| Sərbəst buraxma | Resursun sistem tərəfindən silinə bilən kimi qeyd edilməsi | iOS tələbi ilə |
ODR mexanizmi App Store bulud anbarından resurs sorğularını idarə edən fon xidmətinə əsaslanır. Tətbiq bir teq sorğuladıqda, sistem resursun yerli keşdə olub-olmadığını yoxlayır. Yoxdursa " əlaqə kəsilməsində davam etdirmə dəstəyi ilə fon URL sessiyası vasitəsilə endirməyə başlayır.
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 metodu dərhal yükləmədən resursun keşdə mövcudluğunu yoxlayır. Əgər əlçatanlıq flagı müsbətdirsə " tətbiq gecikmədən işə davam edir. Resurs yoxdursa, beginAccessingResources progress xüsusiyyəti vasitəsilə gedişat göstəricisi ilə endirməyə başlayır.
iOS sistemi tətbiqin cari aktivliyindən asılı olaraq ODR resurs yükləmə prioritetlərini özü idarə edir. Tətbiq ön planda olduqda, yükləmə yüksək prioritetlə aparılır. Fondə iOS yükləməni təxirə sala və ya batareya səviyyəsi aşağı olduqda dayandıra bilər.
ODR resursları şəkillər, videolar, audio fayllar, spritelar, səviyyə məlumatları və tətbiqin işə salınması üçün kritik olmayan digər faylları əhatə edə bilər. Hər bir resurs funksional bloka aidiyyətini müəyyən edən bir və ya bir neçə teqə bağlanır.
Xcode-da teqlər Target Membership vərəqindəki Resource Tags inspektoru vasitəsilə konfiqurasiya edilir. Tərtibatçı layihədəki hər bir fayl üçün onun əsas bündlün bir hissəsi olub-olmadığını və ya teq vasitəsilə yükləndiyini müəyyən edir. Bir fayl bir neçə teqə aid ola bilər ki, bu da resursların tətbiqin müxtəlif bölmələri arasında təkrar istifadəsinə imkan verir.
<!-- Resource Tags konfiqurasiya nümunəsi Info.plist-də -->
<key>NSBundleResourceRequestTags</key>
<dict>
<key>level-3</key>
<array>
<string>levels/level3.scnassets</string>
<string>textures/level3_tex.png</string>
</array>
</dict>
Apple resursun cihazda nə qədər saxlanmalı olduğuna görə üç kateqoriya ODR teqi ayırır. Initial Install Tags tətbiqlə birlikdə yüklənir və heç vaxt sistem tərəfindən silinmir. Prefetch Tag Order quraşdırmadan dərhal sonra fon yükləmə sırasını müəyyən edir. Əsas teqlər tələb üzrə yüklənir və yer çatışmazlığı olduqda iOS tərəfindən silinə bilər.
Kateqoriyalardan əlavə, hər bir teq yükləmə prioritetinə malik ola bilər. Yüksək prioritetli teqlər aşağı prioritetli olanlardan əvvəl yüklənir, hətta daha sonra sorğulansalar belə. Bu, tərtibatçıya məzmunun görünmə ardıcıllığını idarə etməyə imkan verir: əvvəlcə əsas ekran üçün kritik resurslar, sonra tətbiqin dərin bölmələri üçün əlavə materiallar.
ODR konfiqurasiyası Xcode-da üç mərhələdən ibarətdir: resursların teqlər üzrə kateqoriyalara ayrılması, Info.plist-də yükləmə parametrlərinin konfiqurasiyası və NSBundleResourceRequest vasitəsilə sorğuların proqram təminatının həyata keçirilməsi. İşin çox hissəsi layihənin qurulması tərəfində aparılır.
// ODR statusunun yoxlanılması və gedişat monitorinqi
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)% yükləndi")
}
}
}
Yükləmə gedişatı KVO müşahidə dəstəyi ilə NSProgress sinfinin progress xüsusiyyəti vasitəsilə izlənilir. Tətbiq resursların endirilməsi zamanı istifadəçiyə yükləmə göstəricisini göstərə bilər. Yükləmə tamamlandıqdan sonra resurslar FileManager və NSDataAsset standart mexanizmləri vasitəsilə tətbiqin əsas bündlündə əlçatan olur.
ODR kvotaları iOS versiyasından asılıdır. iOS 13-dən etibarən cihaz bir hesab üçün 20 GB-a qədər tələb üzrə yüklənmiş resurs saxlaya bilər. Bu həcm cihazda quraşdırılmış bütün tətbiqlər arasında bölüşdürülür " bir tətbiq çox yer tutarsa, digərlərinə daha az qalır.
İşğal olunmuş yerin monitorinqi NSBundleResourceRequest vasitəsilə həyata keçirilir. Tətbiq mövcud ODR yaddaşını yoxlaya və bundan asılı olaraq hansı resursların ilk növbədə yüklənəcəyinə qərar verə bilər. Fallback mexanizminin tətbiqi tövsiyə olunur: ODR yaddaşı doludursa, əsas bündldən aşağı keyfiyyətli resurslardan istifadə edin.
Kvota aşıldıqda sistem ən az istifadə olunan resurslardan başlayaraq On-Demand teqləri olan resursları silir. Tətbiq kodunda Resource Manager NSBundleResourceRequest xüsusiyyəti vasitəsilə cari işğal olunmuş ODR yaddaş həcmini izləyə bilər.Tərtibatçı nəzərə almalıdır ki, iOS istənilən vaxt On-Demand resurslarının silinməsi barədə qərar verə bilər " tətbiq əvvəllər yüklənmiş resursun qəflətən əlçatan olmadığı vəziyyəti düzgün idarə etməlidir. Resurslara giriş xətalarının tutulması və beginAccessingResources vasitəsilə təkrar sorğulanması tövsiyə olunur. Tətbiqin işləyə bilmədiyi kritik vacib resurslar üçün sistem tərəfindən silinməyən Initial Install Tags-dan istifadə edin.
On-Demand Resources tərtibatçıya tətbiq ölçüsünü idarə etmək üçün çevik alət verir, lakin şəbəkə əlçatanlığı və iOS yaddaş siyasətləri ilə bağlı bir sıra məhdudiyyətlər qoyur.
ODR-nin əsas üstünlüyü ilkin quraşdırma ölçüsünün kəskin azaldılmasıdır. Bir neçə səviyyəli oyunlar, video məzmunlu tətbiqlər və ya böyük şəkil dəstləri olan proqramlar məzmunu hissə-hissə yükləyə bilər. İstifadəçi əsas funksionallığa dərhal çıxış əldə edir, əlavə resurslar isə fondə endirilir.
ODR ilkin müraciətdə resursların yüklənməsi üçün daimi internet bağlantısı tələb edir. Zəif əhatə zonasında olan istifadəçi gecikmələr və yükləmə xətaları ilə qarşılaşa bilər. Bundan əlavə, Apple yüklənmiş resursların cihazda qalacağına zəmanət vermir " yer çatışmazlığı olduqda iOS xəbərdarlıq etmədən On-Demand teqlərini silə bilər.
Tez-tez verilən suallar
ODR App Store-da yeni versiya dərc etmədən resursları əlavə etməyə və dəyişdirməyə imkan verir. Apple serverində faylları Xcode vasitəsilə yeniləmək və onları eyni teqlərə təyin etmək kifayətdir. Növbəti sorğuda tətbiq resursun cari versiyasını alacaq. Bu mövsümi məzmun, müvəqqəti promosyonlar və yeni şəkil və layoutların A/B testi üçün əlverişlidir.
Sistem digər tətbiqlər üçün yer boşaltmaq lazım olduqda On-Demand etiketli resursları silir. Initial Install Tags resursları silinmir. Silmə ardıcıllığı LRU (Least Recently Used) alqoritmi ilə müəyyən edilir " ilk növbədə ən uzun müddət müraciət edilməyən resurslar silinir.
iOS 13-dən etibarən ümumi ODR yaddaş limiti bir istifadəçi Apple ID-si üçün 20 GB təşkil edir. Bir teqin ölçüsü optimal yükləmə performansı üçün 512 MB-dan çox olmamalıdır. Limit aşıldıqda sorğular NSBundleResourceRequestLowDiskSpaceError xətası ilə nəticələnir.
Bəli, yükləmədən sonra resurs yerli keşdə saxlanılır və internet bağlantısı olmadan oflayn rejimdə əlçatandır. Problemlər yalnız iOS yer çatışmazlığı səbəbindən resursu silibsə və istifadəçi şəbəkə olmadan ona daxil olmağa çalışırsa yaranır.
ODR App Store infrastrukturu ilə inteqrasiya olunub: resurslar Apple CDN-də yerləşdirilir, keşləmə sistemi tərəfindən idarə olunur və tərtibatçıdan öz serverini təşkil etməyi tələb etmir. URLSession server infrastrukturu, versiya nəzarəti və əl ilə keş idarəetməsi tələb edir. ODR həmçinin əlaqə kəsilməsində yükləmənin avtomatik bərpasını idarə edir.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun