On-Demand Resources " Apple-ning ilova kontentini kechiktirib yuklash texnologiyasidir. Barcha resurslarni o'rnatish paketiga kiritish o'rniga, dasturchi ularni App Store serverlarida joylashtiradi va kerak bo'lganda so'raydi. Apple ODR Guide-ga ko'ra, bu dastlabki o'rnatish hajmini kamaytirish va ilova versiyasini yangilamasdan yangi kontent qo'shish imkonini beradi.
Asosiy fikrlar
On-Demand Resources (ODR) " iOS, tvOS va macOS-ga o'rnatilgan kontent boshqaruv tizimidir. Bu dasturchiga ilova resurslarini majburiy (o'rnatish paketiga kiradigan) va talab bo'yicha yuklanadigan (App Store-da saqlanadigan va kerak bo'lganda yuklab olinadigan) qismlarga ajratish imkonini beradi.
ODR tizimi uchta asosiy ob'ekt bilan ishlaydi: teglar, resurs paketlari va so'rovlar. Teg fayllar guruhini birlashtiruvchi identifikator qatoridir. Resurs paketi teg bilan bog'liq ma'lumotlar to'plamidir. So'rov paketni yuklashni boshlaydigan NSBundleResourceRequest dasturiy chaqiruvidir.
Resurs yuklash bir necha bosqichdan o'tadi: teglarni ko'rsatish bilan so'rovni ishga tushirish, mahalliy omborda mavjudligini tekshirish, yo'q bo'lganda Apple serverlaridan yuklab olish, ilovani tayyorlik haqida xabardor qilish va foydalanishdan keyin resursni bo'shatish. Tizim keshlash va foydalanilmayotgan resurslarni o'chirishni avtomatik boshqaradi.
| Bosqich | Tizim harakati | Bajarish vaqti |
|---|---|---|
| Ishga tushirish | Teg bilan NSBundleResourceRequest yaratish | Bir zumda |
| Keshni tekshirish | Mahalliy omborda resursni qidirish | 0.1–0.5 s |
| Yuklab olish | Apple CDN-dan yuklab olish | Hajmiga bog'liq |
| Xabardor qilish | Completion handler yoki delegatni chaqirish | Bir zumda |
| Bo'shatish | Resursni tizim tomonidan o'chirilishi mumkin deb belgilash | iOS talabiga ko'ra |
ODR mexanizmi App Store bulut omboridan resurs so'rovlarini boshqaruvchi fon xizmatiga asoslanadi. Ilova tegni so'raganda, tizim resursning mahalliy keshda mavjudligini tekshiradi. Agar yo'q bo'lsa " ulanish uzilishida davom ettirish qo'llab-quvvatlashi bilan fon URL sessiyasi orqali yuklab olishni boshlaydi.
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 metodi darhol yuklamasdan resursning keshda mavjudligini tekshiradi. Agar mavjudlik flagi ijobiy bo'lsa " ilova kechikishsiz ishni davom ettiradi. Agar resurs yo'q bo'lsa, beginAccessingResources progress xususiyati orqali borish ko'rsatkichi bilan yuklab olishni boshlaydi.
iOS tizimi ilonaning joriy faolligiga qarab ODR resurslarini yuklash prioritetlarini o'zi boshqaradi. Ilova oldingi planda bo'lsa, yuklash yuqori prioritet bilan amalga oshiriladi. Fonda iOS yuklashni kechiktirishi yoki batareya past bo'lganda to'xtatib qo'yishi mumkin.
ODR resurslari rasmlar, videolar, audio fayllar, spritlar, daraja ma'lumotlari va ilovani ishga tushirish uchun muhim bo'lmagan boshqa fayllarni o'z ichiga olishi mumkin. Har bir resurs funksional blokga tegishliligini belgilaydigan bir yoki bir nechta teg bilan bog'lanadi.
Xcode-da teglar Target Membership yorlig'idagi Resource Tags inspektori orqali sozlanadi. Dasturchi loyihadagi har bir fayl uchun uning asosiy bundle qismi yoki teg orqali yuklanishini belgilaydi. Bitta fayl bir nechta tegga tegishli bo'lishi mumkin, bu resurslarni ilonaning turli bo'limlari o'rtasida qayta ishlatish imkonini beradi.
<!-- Info.plist da Resource Tags konfiguratsiyasiga misol -->
<key>NSBundleResourceRequestTags</key>
<dict>
<key>level-3</key>
<array>
<string>levels/level3.scnassets</string>
<string>textures/level3_tex.png</string>
</array>
</dict>
Apple resursning qurilmada qancha vaqt saqlanishiga qarab uchta ODR tegi kategoriyasini ajratadi. Initial Install Tags ilova bilan birga yuklanadi va hech qachon tizim tomonidan o'chirilmaydi. Prefetch Tag Order o'rnatishdan so'ng darhol fon yuklash tartibini belgilaydi. Asosiy teglar talab bo'yicha yuklanadi va joy yetishmasa iOS tomonidan o'chirilishi mumkin.
Kategoriyalardan tashqari, har bir teg yuklash prioritetiga ega bo'lishi mumkin. Yuqori prioriterli teglar past prioritetlilardan oldin yuklanadi, hatto keyinroq so'ralgan bo'lsa ham. Bu dasturchiga kontentning paydo bo'lish tartibini boshqarish imkonini beradi: avval asosiy ekran uchun muhim resurslar, keyin ilonaning chuqur bo'limlari uchun qo'shimcha materiallar.
ODR sozlash Xcode-da uch bosqichdan iborat: resurslarni teglar bo'yicha kategoriyalash, Info.plist-da yuklash parametrlarini sozlash va NSBundleResourceRequest orqali so'rovlarni dasturiy amalga oshirish. Ishning ko'p qismi loyiha qurish tomonida amalga oshiriladi.
// ODR holatini tekshirish va borishni kuzatish
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)% yuklandi")
}
}
}
Yuklash borishi KVO kuzatish qo'llab-quvvatlashi bilan NSProgress sinfining progress xususiyati orqali kuzatiladi. Ilova resurslarni yuklab olish vaqtida foydalanuvchiga borish ko'rsatkichini ko'rsatishi mumkin. Yuklash tugagandan so'ng, resurslar FileManager va NSDataAsset standart mexanizmlari orqali ilonaning asosiy bundle'ida mavjud bo'ladi.
ODR kvotalari iOS versiyasiga bog'liq. iOS 13 dan boshlab, qurilma bitta hisob uchun 20 GB gacha talab bo'yicha yuklangan resurslarni saqlashi mumkin. Bu hajm qurilmada o'rnatilgan barcha ilovalar o'rtasida taqsimlanadi " agar bitta ilova ko'p joy egallasa, boshqalarga kamroq qoladi.
Ishg'ol qilingan joyni kuzatish NSBundleResourceRequest orqali amalga oshiriladi. Ilova mavjud ODR xotirasini tekshirishi va shunga qarab qaysi resurslarni birinchi navbatda yuklashni hal qilishi mumkin. Fallback mexanizmini joriy qilish tavsiya etiladi: agar ODR xotirasi to'la bo'lsa, asosiy bundle dan past sifatli resurslardan foydalaning.
Kvota oshib ketganda, tizim eng kam ishlatilgan resurslardan boshlab, On-Demand teglari bo'lgan resurslarni o'chiradi. Ilova kodidagi Resource Manager NSBundleResourceRequest xususiyati orqali joriy ishg'ol qilingan ODR xotira hajmini kuzatishi mumkin.Dasturchi hisobga olishi kerakki, iOS istalgan vaqtda On-Demand resurslarini o'chirish to'g'risida qaror qabul qilishi mumkin " ilova oldin yuklangan resurs to'satdan mavjud bo'lmagan vaziyatni to'g'ri boshqarishi kerak. Resurslarga kirish xatolarini ushlash va beginAccessingResources orqali qayta so'rash tavsiya etiladi. Ilova ishlay olmaydigan muhim resurslar uchun tizim tomonidan o'chirilmaydigan Initial Install Tags dan foydalaning.
On-Demand Resources dasturchiga ilova hajmini boshqarish uchun moslashuvchan vosita beradi, lekin tarmoq mavjudligi va iOS xotira siyosatlari bilan bog'liq bir qator cheklovlarni qo'yadi.
ODR ning asosiy afzalligi dastlabki o'rnatish hajmini keskin kamaytirishdir. Bir nechta darajali o'yinlar, video kontentli ilovalar yoki katta rasm to'plamlari bo'lgan dasturlar kontentni qismlarga bo'lib yuklashi mumkin. Foydalanuvchi asosiy funksionallikka darhol kirishadi, qo'shimcha resurslar esa fonda yuklab olinadi.
ODR birinchi murojaatda resurslarni yuklash uchun doimiy internet ulanishini talab qiladi. Yomon qamrov zonasidagi foydalanuvchi kechikishlar va yuklash xatolariga duch kelishi mumkin. Bundan tashqari, Apple yuklangan resurslarning qurilmada qolishiga kafolat bermaydi " joy yetishmasa, iOS ogohlantirishsiz On-Demand teglarini o'chirishi mumkin.
Tez-tez so'raladigan savollar
ODR App Store-da yangi versiyani nashr etmasdan resurslarni qo'shish va o'zgartirish imkonini beradi. Apple serveridagi fayllarni Xcode orqali yangilash va ularni bir xil teglarga tayinlash kifoya. Keyingi so'rovda ilova resursning joriy versiyasini oladi. Bu mavsumiy kontent, vaqtinchalik aksiyalar va yangi rasm va layoutlarning A/B testi uchun qulay.
Tizim boshqa ilovalar uchun joy bo'shatish kerak bo'lganda On-Demand teglangan resurslarni o'chiradi. Initial Install Tags resurslari o'chirilmaydi. O'chirish tartibi LRU (Least Recently Used) algoritmi bilan belgilanadi " avval eng uzoq vaqt davomida murojaat qilinmagan resurslar o'chiriladi.
iOS 13 dan boshlab, umumiy ODR xotira chegarasi bitta foydalanuvchi Apple ID si uchun 20 GB ni tashkil qiladi. Bir tegning hajmi optimal yuklash ishlashi uchun 512 MB dan oshmasligi kerak. Chegara oshib ketganda, so'rovlar NSBundleResourceRequestLowDiskSpaceError xatosi bilan tugaydi.
Ha, yuklashdan so'ng resurs mahalliy keshda saqlanadi va oflayn rejimda internet ulanishisiz mavjud bo'ladi. Muammolar faqat iOS joy yetishmasligi sababli resursni o'chirgan bo'lsa va foydalanuvchi tarmoqsiz unga kirishga harakat qilsa yuzaga keladi.
ODR App Store infratuzilmasi bilan integratsiyalashgan: resurslar Apple CDN da joylashtiriladi, keshlash tizimi tomonidan boshqariladi va dasturchidan o'z serverini tashkil qilishni talab qilmaydi. URLSession server infratuzilmasi, versiya nazorati va qo'lda kesh boshqaruvini talab qiladi. ODR shuningdek ulanish uzilishida yuklashni avtomatik davom ettirishni boshqaradi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.