On-Demand Resources «فناوری اپل برای بارگذاری تأخیری محتوای برنامه است». به جای گنجاندن همه منابع در بسته نصب، توسعهدهنده آنها را در سرورهای App Store قرار میدهد و در صورت نیاز درخواست میکند. به گفته Apple ODR Guide، این کار باعث کاهش حجم نصب اولیه و افزودن محتوای جدید بدون بهروزرسانی نسخه برنامه میشود.
نکات اصلی
On-Demand Resources (ODR) «سیستم مدیریت محتوای داخلی iOS، tvOS و macOS است». این سیستم به توسعهدهنده اجازه میدهد منابع برنامه را به دو دسته اجباری (بخشی از بسته نصب) و قابل بارگذاری بر اساس تقاضا (ذخیره شده در App Store و دریافت در صورت نیاز) تقسیم کند.
سیستم ODR با سه موجودیت کلیدی کار میکند: برچسبها، بستههای منابع و درخواستها. برچسب یک رشته شناسه است که گروهی از فایلها را متحد میکند. بسته منبع مجموعه دادهای است که با برچسب مرتبط است. درخواست یک فراخوانی برنامهای NSBundleResourceRequest است که بارگذاری بسته را آغاز میکند.
بارگذاری منبع چند مرحله را طی میکند: مقداردهی اولیه درخواست با مشخص کردن برچسبها، بررسی وجود در حافظه محلی، دریافت از سرورهای اپل در صورت عدم وجود، اطلاعرسانی به برنامه از آمادهبودن و آزادسازی منبع پس از استفاده. سیستم به طور خودکار کش و حذف منابع استفادهنشده را مدیریت میکند.
| مرحله | عمل سیستم | زمان اجرا |
|---|---|---|
| مقداردهی | ایجاد NSBundleResourceRequest با برچسب | فوری |
| بررسی کش | جستجوی منبع در حافظه محلی | ۰٫۱–۰٫۵ ثانیه |
| بارگذاری | دریافت از CDN اپل | بستگی به حجم دارد |
| اطلاعرسانی | فراخوانی completion handler یا نماینده | فوری |
| آزادسازی | علامتگذاری منبع به عنوان قابل حذف توسط سیستم | به درخواست iOS |
مکانیزم ODR بر اساس سرویس پسزمینهای است که درخواستهای منابع از فضای ابری 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 میتوانند شامل تصاویر، ویدیوها، فایلهای صوتی، اسپرایتها، دادههای مراحل و هر فایل دیگری باشند که برای راهاندازی برنامه حیاتی نیستند. هر منبع به یک یا چند برچسب متصل میشود که تعلق آن را به بلوک عملکردی مشخص میکند.
در 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>
اپل سه دسته برچسب 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، دستگاه میتواند تا ۲۰ گیگابایت منابع بارگذاری شده بر اساس تقاضا برای یک حساب ذخیره کند. این حجم بین همه برنامههای نصب شده روی دستگاه تقسیم میشود «اگر یک برنامه فضای زیادی اشغال کند، برای دیگران کمتر باقی میماند».
نظارت بر فضای اشغال شده از طریق NSBundleResourceRequest انجام میشود. برنامه میتواند فضای ذخیرهسازی ODR موجود را بررسی کرده و بر اساس آن تصمیم بگیرد کدام منابع را ابتدا بارگذاری کند. پیادهسازی مکانیزم جایگزین توصیه میشود: اگر فضای ODR پر است، از منابع بسته اصلی با کیفیت کاهشیافته استفاده کنید.
هنگام تجاوز از سهمیه، سیستم منابع با برچسبهای On-Demand را به ترتیب کمترین استفاده اخیر، از قدیمیترین شروع میکند. Resource Manager در کد برنامه میتواند حجم فعلی فضای اشغال شده ODR را از طریق ویژگی NSBundleResourceRequest پیگیری کند.توسعهدهنده باید در نظر بگیرد که iOS ممکن است در هر لحظه تصمیم به حذف منابع On-Demand بگیرد «برنامه باید وضعیتی را که منبع قبلاً بارگذاری شده ناگهان در دسترس نیست به درستی مدیریت کند». توصیه میشود خطاهای دسترسی به منابع را گرفته و دوباره از طریق beginAccessingResources درخواست کنید. برای منابع حیاتی که برنامه بدون آنها نمیتواند کار کند، از Initial Install Tags استفاده کنید که توسط سیستم حذف نمیشوند.
On-Demand Resources ابزاری انعطافپذیر برای مدیریت اندازه برنامه در اختیار توسعهدهنده قرار میدهد، اما محدودیتهایی مرتبط با دسترسی به شبکه و سیاستهای ذخیرهسازی iOS اعمال میکند.
مزیت اصلی ODR کاهش شدید حجم نصب اولیه است. بازیهای دارای چندین مرحله، برنامههای با محتوای ویدیویی یا مجموعههای بزرگ تصاویر میتوانند محتوا را به صورت تکهای بارگذاری کنند. کاربر بلافاصله به قابلیتهای اولیه دسترسی پیدا میکند و منابع اضافی در پسزمینه دریافت میشوند.
ODR برای بارگذاری منابع در اولین مراجعه به اتصال دائمی اینترنت نیاز دارد. کاربر در منطقهای با پوشش ضعیف ممکن است با تأخیر و خطاهای بارگذاری مواجه شود. علاوه بر این، اپل تضمین نمیکند که منابع بارگذاری شده روی دستگاه باقی بمانند «در صورت کمبود فضا، iOS ممکن است برچسبهای On-Demand را بدون هشدار حذف کند».
سؤالات متداول
ODR امکان افزودن و تغییر منابع را بدون انتشار نسخه جدید در App Store فراهم میکند. کافی است فایلها را روی سرور اپل از طریق Xcode بهروزرسانی کرده و به همان برچسبها اختصاص دهید. در درخواست بعدی، برنامه نسخه جاری منبع را دریافت خواهد کرد. این برای محتوای فصلی، تبلیغات موقت و تست A/B تصاویر و طرحهای جدید مناسب است.
سیستم منابع با برچسب On-Demand را هنگامی که نیاز به آزاد کردن فضا برای برنامههای دیگر است حذف میکند. منابع Initial Install Tags حذف نمیشوند. ترتیب حذف توسط الگوریتم LRU (Least Recently Used) تعیین میشود «ابتدا منابعی که بیشترین مدت به آنها دسترسی نشده حذف میشوند».
از iOS 13، محدودیت کلی فضای ذخیرهسازی ODR ۲۰ گیگابایت برای هر Apple ID کاربر است. اندازه یک برچسب نباید برای عملکرد بهینه بارگذاری از ۵۱۲ مگابایت تجاوز کند. در صورت تجاوز از حد مجاز، درخواستها با خطای NSBundleResourceRequestLowDiskSpaceError پایان مییابند.
بله، پس از بارگذاری، منبع در کش محلی ذخیره میشود و در حالت آفلاین بدون اتصال به اینترنت در دسترس است. مشکلات فقط زمانی رخ میدهد که iOS منبع را به دلیل کمبود فضا حذف کرده باشد و کاربر بدون شبکه سعی در دسترسی به آن داشته باشد.
ODR با زیرساخت App Store یکپارچه شده است: منابع روی CDN اپل میزبانی میشوند، توسط سیستم کش مدیریت میشوند و نیازی به سازماندهی سرور اختصاصی توسط توسعهدهنده ندارند. URLSession نیاز به زیرساخت سرور، کنترل نسخه و مدیریت دستی کش دارد. ODR همچنین به طور خودکار ادامه بارگذاری را پس از قطع اتصال مدیریت میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید