On-Demand Resources هي تقنية Apple لتحميل محتوى التطبيق المؤجل. بدلاً من تضمين جميع الموارد في حزمة التثبيت، يضعها المطورون على خوادم App Store ويطلبونها حسب الحاجة. وفقاً لدليل Apple ODR، يقلل هذا من حجم التثبيت الأولي ويسمح بإضافة محتوى جديد دون تحديث إصدار التطبيق.
الملخص
On-Demand Resources (ODR) هو نظام إدارة محتوى مدمج في iOS وtvOS وmacOS. يسمح للمطور بتقسيم موارد التطبيق إلى إلزامية (مضمنة في حزمة التثبيت) وعند الطلب (مخزنة في App Store ويتم تنزيلها عند الحاجة).
يعمل نظام ODR بثلاث كيانات رئيسية: الوسوم وحزم الموارد والطلبات. الوسم هو معرف نصي يجمع مجموعة من الملفات. حزمة الموارد هي مجموعة بيانات مرتبطة بوسم. الطلب هو استدعاء برمجي لـ NSBundleResourceRequest يبدأ تحميل الحزمة.
تحميل الموارد يمر بعدة مراحل: تهيئة الطلب مع الوسوم المحددة، التحقق من التوفر في التخزين المحلي، التنزيل من خوادم Apple في حالة الغياب، إعلام التطبيق عند الجاهزية، وتحرير المورد بعد الاستخدام. يدير النظام تلقائياً التخزين المؤقت وإزالة الموارد غير المستخدمة.
| المرحلة | إجراء النظام | وقت التنفيذ |
|---|---|---|
| التهيئة | إنشاء NSBundleResourceRequest مع وسم | فوري |
| فحص التخزين المؤقت | البحث عن المورد في التخزين المحلي | 0.1–0.5 ث |
| التنزيل | التنزيل من CDN Apple | يعتمد على الحجم |
| الإعلام | استدعاء معالج الإكمال أو المفوض | فوري |
| التحرير | وضع علامة على المورد كقابل للإزالة من قبل النظام | عند طلب 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>
تميز Apple ثلاث فئات من وسوم ODR بناءً على المدة التي يجب أن يبقى فيها المورد على الجهاز. وسوم التثبيت الأولي تُحمل مع التطبيق ولا تُحذف أبداً بواسطة النظام. ترتيب وسوم التحميل المسبق يحدد تسلسل التحميل الخلفي مباشرة بعد التثبيت. الوسوم الرئيسية تُطلب عند الطلب وقد تُحذف بواسطة 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 غيغابايت من الموارد عند الطلب لكل حساب. هذه المساحة مشتركة بين جميع التطبيقات المثبتة على الجهاز — إذا احتل تطبيق واحد مساحة كبيرة، تقل المساحة المتبقية للتطبيقات الأخرى.
مراقبة المساحة المستخدمة تتم عبر NSBundleResourceRequest. يمكن للتطبيق التحقق من مساحة تخزين ODR المتاحة وتحديد أي الموارد سيتم تحميلها أولاً بناءً على ذلك. يُوصى بتنفيذ آلية احتياطية: إذا كانت مساحة تخزين ODR ممتلئة، استخدم موارد منخفضة الجودة من الحزمة الرئيسية.
عندما يتم تجاوز الحصة، يحذف النظام الموارد ذات الوسوم عند الطلب بترتيب الأقل استخداماً مؤخراً، بدءاً من الأقدم. يمكن لمدير الموارد في كود التطبيق تتبع استخدام مساحة تخزين ODR الحالية عبر خاصية NSBundleResourceRequest.يجب على المطورين مراعاة أن iOS قد يقرر حذف موارد On-Demand في أي وقت — يجب أن يتعامل التطبيق بشكل صحيح مع المواقف التي يصبح فيها المورد الذي تم تحميله سابقاً غير متاح فجأة. يُوصى باعتراض أخطاء الوصول إلى الموارد وإعادة طلبها عبر beginAccessingResources. للموارد الحرجة التي لا يمكن للتطبيق العمل بدونها، استخدم وسوم التثبيت الأولي التي لا تُحذف بواسطة النظام.
On-Demand Resources تمنح المطور أداة مرنة لإدارة حجم التطبيق، لكنها تفرض عدداً من القيود المتعلقة بتوفر الشبكة وسياسات تخزين iOS.
الميزة الرئيسية لـ ODR هي التخفيض الجذري في حجم التثبيت الأولي. الألعاب ذات المستويات المتعددة والتطبيقات التي تحتوي على محتوى فيديو أو مجموعات كبيرة من الصور يمكنها تحميل المحتوى على أجزاء. يحصل المستخدم على الوصول إلى الوظائف الأساسية فوراً، بينما يتم تنزيل الموارد الإضافية في الخلفية.
ODR تتطلب اتصالاً مستمراً بالإنترنت لتحميل الموارد عند الوصول الأول. المستخدمون في المناطق ذات التغطية الضعيفة قد يواجهون تأخيرات وأخطاء في التحميل. بالإضافة إلى ذلك، لا تضمن Apple بقاء الموارد التي تم تنزيلها على الجهاز — عند ضيق المساحة، قد يحذف iOS وسوم On-Demand دون سابق إنذار.
الأسئلة الشائعة
ODR يسمح بإضافة وتعديل الموارد دون نشر إصدار جديد في App Store. يكفي تحديث الملفات على خادم Apple عبر Xcode وتعيينها لنفس الوسوم. عند الطلب التالي، سيحصل التطبيق على أحدث إصدار من المورد. هذا مناسب للمحتوى الموسمي والعروض الترويجية المؤقتة واختبار A/B للصور والتخطيطات الجديدة.
النظام يحذف الموارد ذات الوسم عند الطلب عندما يحتاج إلى تحرير مساحة لتطبيقات أخرى. موارد وسوم التثبيت الأولي لا تُحذف. يتم تحديد ترتيب الحذف بواسطة خوارزمية LRU (الأقل استخداماً مؤخراً) — أول ما يُحذف هي الموارد التي لم يتم الوصول إليها لأطول فترة.
منذ iOS 13، الحد الإجمالي لمساحة تخزين ODR هو 20 غيغابايت لكل مستخدم Apple ID. يجب ألا يتجاوز حجم الوسم الواحد 512 ميغابايت للحصول على أداء تنزيل أمثل. عند تجاوز الحد، تفشل الطلبات مع خطأ NSBundleResourceRequestLowDiskSpaceError.
نعم، بعد التنزيل، يتم حفظ المورد في التخزين المؤقت المحلي ويتوفر في وضع عدم الاتصال دون الحاجة إلى اتصال بالإنترنت. تظهر المشكلات فقط إذا قام iOS بحذف المورد بسبب ضيق المساحة وحاول المستخدم الوصول إليه بدون شبكة.
ODR متكامل مع بنية App Store: الموارد مستضافة على CDN Apple وتُدار بواسطة نظام التخزين المؤقت ولا تتطلب من المطور إعداد خادم خاص. URLSession يتطلب بنية خادم وتحكم في الإصدارات وإدارة يدوية للتخزين المؤقت. ODR أيضاً يتعامل تلقائياً مع استئناف التحميل عند انقطاع الاتصال.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا