On-Demand Resources: چیست، مکانیزم درخواست و ذخیره‌سازی منابع

نویسنده: IT Sectr منتشر شده: 2026-04-17 زمان مطالعه: 9 دقیقه

On-Demand Resources «فناوری اپل برای بارگذاری تأخیری محتوای برنامه است». به جای گنجاندن همه منابع در بسته نصب، توسعه‌دهنده آنها را در سرورهای App Store قرار می‌دهد و در صورت نیاز درخواست می‌کند. به گفته Apple ODR Guide، این کار باعث کاهش حجم نصب اولیه و افزودن محتوای جدید بدون به‌روزرسانی نسخه برنامه می‌شود.

نکات اصلی

  • On-Demand Resources «مکانیزم بارگذاری منابع بر اساس تقاضا پس از نصب برنامه است»
  • منابع در سرورهای اپل ذخیره می‌شوند و از طریق NSBundleResourceRequest درخواست می‌شوند
  • برچسب‌ها منابع را بر اساس بلوک‌های عملکردی برنامه گروه‌بندی می‌کنند
  • پیش‌بارگذاری امکان بارگذاری زودهنگام منابع برای بهبود تجربه کاربری را فراهم می‌کند
  • سهمیه‌ها محدود هستند و نیاز به نظارت توسط توسعه‌دهنده دارند

On-Demand Resources در iOS چیست

On-Demand Resources (ODR) «سیستم مدیریت محتوای داخلی iOS، tvOS و macOS است». این سیستم به توسعه‌دهنده اجازه می‌دهد منابع برنامه را به دو دسته اجباری (بخشی از بسته نصب) و قابل بارگذاری بر اساس تقاضا (ذخیره شده در App Store و دریافت در صورت نیاز) تقسیم کند.

مفاهیم پایه ODR

سیستم ODR با سه موجودیت کلیدی کار می‌کند: برچسب‌ها، بسته‌های منابع و درخواست‌ها. برچسب یک رشته شناسه است که گروهی از فایل‌ها را متحد می‌کند. بسته منبع مجموعه داده‌ای است که با برچسب مرتبط است. درخواست یک فراخوانی برنامه‌ای NSBundleResourceRequest است که بارگذاری بسته را آغاز می‌کند.

چرخه عمر درخواست منبع

بارگذاری منبع چند مرحله را طی می‌کند: مقداردهی اولیه درخواست با مشخص کردن برچسب‌ها، بررسی وجود در حافظه محلی، دریافت از سرورهای اپل در صورت عدم وجود، اطلاع‌رسانی به برنامه از آماده‌بودن و آزادسازی منبع پس از استفاده. سیستم به طور خودکار کش و حذف منابع استفاده‌نشده را مدیریت می‌کند.

مرحلهعمل سیستمزمان اجرا
مقداردهیایجاد NSBundleResourceRequest با برچسبفوری
بررسی کشجستجوی منبع در حافظه محلی۰٫۱–۰٫۵ ثانیه
بارگذاریدریافت از CDN اپلبستگی به حجم دارد
اطلاع‌رسانیفراخوانی completion handler یا نمایندهفوری
آزادسازیعلامت‌گذاری منبع به عنوان قابل حذف توسط سیستمبه درخواست iOS

ODR در iOS چگونه کار می‌کند

مکانیزم ODR بر اساس سرویس پس‌زمینه‌ای است که درخواست‌های منابع از فضای ابری App Store را مدیریت می‌کند. وقتی برنامه یک برچسب را درخواست می‌کند، سیستم بررسی می‌کند که آیا منبع در کش محلی وجود دارد. اگر نه، بارگذاری را از طریق یک جلسه URL پس‌زمینه با پشتیبانی از ادامه در صورت قطع اتصال آغاز می‌کند.

مدیریت درخواست‌ها از طریق NSBundleResourceRequest

swift
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 ممکن است بارگذاری را به تأخیر بیندازد یا در صورت کم بودن باتری آن را متوقف کند.

  • اولویت بالا «بارگذاری فوری برای منابعی که بلافاصله نیاز هستند»
  • اولویت پایین «بارگذاری تأخیری برای پیش‌بارگذاری و کش اولیه»
  • پس‌زمینه «بارگذاری فقط با Wi-Fi فعال و شارژ کافی باتری»

انواع منابع و برچسب‌های ODR

منابع ODR می‌توانند شامل تصاویر، ویدیوها، فایل‌های صوتی، اسپرایت‌ها، داده‌های مراحل و هر فایل دیگری باشند که برای راه‌اندازی برنامه حیاتی نیستند. هر منبع به یک یا چند برچسب متصل می‌شود که تعلق آن را به بلوک عملکردی مشخص می‌کند.

برچسب‌گذاری محتوا در Xcode

در Xcode، برچسب‌ها از طریق بازرس Resource Tags در برگه Target Membership پیکربندی می‌شوند. توسعه‌دهنده برای هر فایل در پروژه مشخص می‌کند که آیا بخشی از بسته اصلی است یا از طریق برچسب بارگذاری می‌شود. یک فایل می‌تواند به چندین برچسب تعلق داشته باشد که امکان استفاده مجدد از منابع بین بخش‌های مختلف برنامه را فراهم می‌کند.

xml
<!-- نمونه پیکربندی 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 قابل حذف هستند.

علاوه بر دسته‌بندی، هر برچسب می‌تواند اولویت بارگذاری داشته باشد. برچسب‌های با اولویت بالا زودتر از برچسب‌های کم‌اولویت بارگذاری می‌شوند، حتی اگر دیرتر درخواست شده باشند. این به توسعه‌دهنده اجازه می‌دهد ترتیب نمایش محتوا را مدیریت کند: ابتدا منابع حیاتی برای صفحه اصلی، سپس مطالب اضافی برای بخش‌های عمیق برنامه.

  • Initial install tags «در نصب اول بارگذاری می‌شوند، توسط سیستم حذف نمی‌شوند»
  • Prefetched tags «پس از نصب در پس‌زمینه دریافت می‌شوند برای بهبود UX»
  • On-demand tags «به صورت برنامه‌ای درخواست می‌شوند، در کمبود فضا توسط iOS حذف می‌شوند»

پیکربندی On-Demand Resources در Xcode

پیکربندی ODR در Xcode شامل سه مرحله است: دسته‌بندی منابع بر اساس برچسب‌ها، تنظیم پارامترهای بارگذاری در Info.plist و پیاده‌سازی نرم‌افزاری درخواست‌ها از طریق NSBundleResourceRequest. بیشتر کار در سمت ساخت پروژه انجام می‌شود.

دسته‌بندی در Target Membership

swift
// بررسی وضعیت و نظارت بر پیشرفت 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 استفاده کنید که توسط سیستم حذف نمی‌شوند.

مزایا و محدودیت‌های ODR

On-Demand Resources ابزاری انعطاف‌پذیر برای مدیریت اندازه برنامه در اختیار توسعه‌دهنده قرار می‌دهد، اما محدودیت‌هایی مرتبط با دسترسی به شبکه و سیاست‌های ذخیره‌سازی iOS اعمال می‌کند.

مزایای استفاده از ODR

مزیت اصلی ODR کاهش شدید حجم نصب اولیه است. بازی‌های دارای چندین مرحله، برنامه‌های با محتوای ویدیویی یا مجموعه‌های بزرگ تصاویر می‌توانند محتوا را به صورت تکه‌ای بارگذاری کنند. کاربر بلافاصله به قابلیت‌های اولیه دسترسی پیدا می‌کند و منابع اضافی در پس‌زمینه دریافت می‌شوند.

محدودیت‌های فناوری

ODR برای بارگذاری منابع در اولین مراجعه به اتصال دائمی اینترنت نیاز دارد. کاربر در منطقه‌ای با پوشش ضعیف ممکن است با تأخیر و خطاهای بارگذاری مواجه شود. علاوه بر این، اپل تضمین نمی‌کند که منابع بارگذاری شده روی دستگاه باقی بمانند «در صورت کمبود فضا، iOS ممکن است برچسب‌های On-Demand را بدون هشدار حذف کند».

  • نیاز به شبکه «اولین درخواست منبع نیاز به اتصال به اینترنت دارد»
  • حذف خودکار «iOS ممکن است در کمبود فضای دستگاه کش را پاک کند»
  • دشواری اشکال‌زدایی «بازتولید مشکلات بارگذاری نیاز به شبیه‌سازی شرایط مختلف شبکه دارد»
  • اندازه برچسب «اپل توصیه می‌کند برای عملکرد بهینه از ۵۱۲ مگابایت در هر برچسب تجاوز نکنید»
  • مدیریت خطا «برنامه باید خطاهای بارگذاری را به درستی مدیریت کرده و درخواست‌ها را تکرار کند»

سؤالات متداول

آیا می‌توان از ODR برای افزودن پویای محتوا بدون به‌روزرسانی برنامه استفاده کرد؟

ODR امکان افزودن و تغییر منابع را بدون انتشار نسخه جدید در App Store فراهم می‌کند. کافی است فایل‌ها را روی سرور اپل از طریق Xcode به‌روزرسانی کرده و به همان برچسب‌ها اختصاص دهید. در درخواست بعدی، برنامه نسخه جاری منبع را دریافت خواهد کرد. این برای محتوای فصلی، تبلیغات موقت و تست A/B تصاویر و طرح‌های جدید مناسب است.

iOS چگونه حذف منابع ODR را در کمبود فضا مدیریت می‌کند؟

سیستم منابع با برچسب On-Demand را هنگامی که نیاز به آزاد کردن فضا برای برنامه‌های دیگر است حذف می‌کند. منابع Initial Install Tags حذف نمی‌شوند. ترتیب حذف توسط الگوریتم LRU (Least Recently Used) تعیین می‌شود «ابتدا منابعی که بیشترین مدت به آنها دسترسی نشده حذف می‌شوند».

حداکثر حجم منابع ODR برای یک برنامه چقدر است؟

از iOS 13، محدودیت کلی فضای ذخیره‌سازی ODR ۲۰ گیگابایت برای هر Apple ID کاربر است. اندازه یک برچسب نباید برای عملکرد بهینه بارگذاری از ۵۱۲ مگابایت تجاوز کند. در صورت تجاوز از حد مجاز، درخواست‌ها با خطای NSBundleResourceRequestLowDiskSpaceError پایان می‌یابند.

آیا ODR پس از بارگذاری اولیه در حالت آفلاین کار می‌کند؟

بله، پس از بارگذاری، منبع در کش محلی ذخیره می‌شود و در حالت آفلاین بدون اتصال به اینترنت در دسترس است. مشکلات فقط زمانی رخ می‌دهد که iOS منبع را به دلیل کمبود فضا حذف کرده باشد و کاربر بدون شبکه سعی در دسترسی به آن داشته باشد.

تفاوت ODR با بارگذاری ساده فایل از طریق URLSession چیست؟

ODR با زیرساخت App Store یکپارچه شده است: منابع روی CDN اپل میزبانی می‌شوند، توسط سیستم کش مدیریت می‌شوند و نیازی به سازماندهی سرور اختصاصی توسط توسعه‌دهنده ندارند. URLSession نیاز به زیرساخت سرور، کنترل نسخه و مدیریت دستی کش دارد. ODR همچنین به طور خودکار ادامه بارگذاری را پس از قطع اتصال مدیریت می‌کند.

خلاصه

  • On-Demand Resources «فناوری بارگذاری تأخیری محتوا در برنامه‌های iOS و tvOS است»
  • سیستم مبتنی بر برچسب‌هایی است که منابع را گروه‌بندی کرده و درخواست‌ها از طریق NSBundleResourceRequest انجام می‌شوند
  • پشتیبانی می‌شوند همه انواع فایل‌ها: تصاویر، ویدیوها، صدا، اسپرایت‌ها و داده‌های مراحل
  • دسته‌های برچسب « Initial Install، Prefetched و On-Demand با سیاست‌های ذخیره‌سازی متفاوت»
  • محدودیت فضای ذخیره‌سازی « ۲۰ گیگابایت برای Apple ID، تا ۵۱۲ مگابایت برای هر برچسب»
  • حجم نصب با انتقال منابع از بسته اصلی به سرورهای اپل کاهش می‌یابد
  • توصیه « استفاده از ODR برای بازی‌ها، برنامه‌های با محتوای رسانه‌ای و پروژه‌های با ساختار چندلایه»

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید