Background Modes هي مجموعة من الإمكانيات القابلة للتصريح في iOS والتي تسمح للتطبيق بمواصلة تنفيذ الكود بعد الانتقال إلى الخلفية. كل وضع يتوافق مع نوع محدد من المهام: الصوت، تحديد الموقع، VoIP، Bluetooth، الجلب (fetch) والمعالجة (processing). وفقًا لـ Apple، 2026، فإن الاستخدام غير الصحيح لـ Background Modes هو أحد الأسباب الشائعة لرفض التطبيقات أثناء مراجعة App Store.
النقاط الرئيسية
Background Modes هي إمكانيات مشروع Xcode التي تعلن عن نية التطبيق لتنفيذ أنواع محددة من العمليات في الخلفية. على عكس Android، حيث يمكن للتطبيق تشغيل أي Service في الخلفية، يتطلب iOS تصريحًا صريحًا بالوضع في Info.plist. كل وضع له قواعد استخدام صارمة ويتم التحقق منه بواسطة Apple أثناء المراجعة.
عندما ينتقل التطبيق إلى الخلفية، يقوم iOS بتعليقه خلال 3–5 ثوانٍ. إذا أعلن التطبيق عن Background Mode واستخدم API المقابل بنشاط (مثل AVAudioSession للصوت)، يقوم النظام بنقله إلى وضع تنفيذ خاص. يبقى التطبيق في الذاكرة ويمكنه تنفيذ كود محدود حسب نوع الوضع.
يدعم iOS Background Modes التالية: Audio (الصوت)، Location (تحديد الموقع)، VoIP، Bluetooth LE (ملحقات BLE)، Background Fetch (التحديثات الدورية)، Background Processing (المهام الطويلة)، External Accessory Communication، Push to Talk (PTT) و HealthKit. كل وضع يتطلب تبريرًا في وصف التطبيق.
| الوضع | مفتاح Info.plist | الغرض | إصدار iOS |
|---|---|---|---|
| Audio | audio | الصوت في الخلفية، AirPlay | 4.0+ |
| Location | location | تتبع الموقع | 4.0+ |
| VoIP | voip | إشعارات VoIP الفورية | 4.0+ |
| BLE | bluetooth-central | العمل مع أجهزة BLE | 7.0+ |
| Fetch | fetch | تنزيل دوري للبيانات | 7.0+ |
| Processing | processing | مهام خلفية طويلة | 13.0+ |
| Push to Talk | push-to-talk | صوت الدفع للتحدث | 16.0+ |
Audio Background Mode هو الوضع الأكثر شيوعًا، المستخدم في مشغلات الموسيقى وتطبيقات البودكاست وخدمات الصوت. يمكن للتطبيق مواصلة تشغيل الصوت، والتحكم به عبر مركز التحكم، والظهور على شاشة القفل. لتنشيطه، يكفي تكوين AVAudioSession بالفئة .playback.
لكي يعمل الصوت في الخلفية، يجب تكوين AVAudioSession وتنشيطها. الفئة .playback تخبر النظام بأن التطبيق يشغل صوتًا ويجب أن يبقى نشطًا في الخلفية. بدون هذا التكوين، سيتوقف الصوت بعد 5–10 ثوانٍ من تصغير التطبيق.
import AVFoundation
func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(
.playback,
mode: .default,
options: []
)
try session.setActive(true)
} catch {
print("خطأ جلسة الصوت: \(error)")
}
}
للتكامل مع مركز التحكم وشاشة القفل، يجب تكوين MPRemoteCommandCenter. يعالج أوامر التشغيل والإيقاف والتالي والسابق. كما يجب تحديث MPNowPlayingInfoProperty لعرض البيانات الوصفية: اسم المقطع، الفنان، الغلاف وتقدم التشغيل.
اعتبارًا من iOS 14، يدعم Audio Background Mode أيضًا Picture in Picture للفيديو. يمكن للتطبيق مواصلة عرض الفيديو في نافذة عائمة عند تصغيره. للتنشيط، استخدم AVPictureInPictureController مع AVPlayerLayer. يعمل هذا الوضع فقط إذا كان التطبيق يشغل مقطعًا صوتيًا.
Location Background Mode يسمح للتطبيق بتلقي تحديثات الموقع في الخلفية. يُستخدم في تطبيقات الملاحة وأجهزة تتبع اللياقة البدنية وتطبيقات التوصيل والشبكات الاجتماعية. بدون هذا الوضع، يتلقى التطبيق الموقع مرة واحدة فقط عند الانتقال إلى الخلفية، ثم تتوقف التحديثات.
CLLocationManager يدعم عدة استراتيجيات للتتبع: التغييرات الهامة في الموقع، التتبع القياسي، ومراقبة المناطق. للعمل في الخلفية بأقصى دقة، استخدم allowsBackgroundLocationUpdates = true و pausesLocationUpdatesAutomatically = false.
التتبع المستمر للموقع في الخلفية هو من أكثر السيناريوهات استهلاكًا للطاقة. iOS يضبط تلقائيًا تكرار التحديثات حسب سرعة الحركة: عند المشي، تحديثات كل 10–30 ثانية؛ عند القيادة، كل 1–5 ثوانٍ. للملاحة، استخدم desiredAccuracy = kCLLocationAccuracyBestForNavigation.
let locationManager = CLLocationManager()
locationManager.requestAlwaysAuthorization()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.activityType = .fitness
locationManager.startUpdatingLocation()
وضع significant-change location يعمل بدون Location Background Mode — يستيقظ النظام التطبيق فقط عندما تتغير الإحداثيات بشكل كبير (عادة 500 م أو أكثر). لا يتطلب GPS مستمر، مما يوفر البطارية. مناسب لتطبيقات الطقس التي تحدث البيانات عند تحرك المستخدم.
Bluetooth LE Background Mode يسمح للتطبيق بالتفاعل مع أجهزة BLE في الخلفية. يُستخدم في أساور اللياقة وأجهزة الاستشعار الطبية وأجهزة المنزل الذكي والملاحة بالمنارات. ينقسم الوضع إلى نوعين فرعيين: bluetooth-central (يتصل التطبيق بالأجهزة) و bluetooth-peripheral (يعمل التطبيق كجهاز).
يمكن للتطبيق الذي يعمل كـ Central مسح الأجهزة BLE والاتصال بها في الخلفية. للقيام بذلك، حدد bluetooth-central في Background Modes واستدع CBCentralManager.scanForPeripherals مع الخيار CBCentralManagerScanOptionAllowDuplicatesKey. في الخلفية، يعمل المسح بتردد منخفض — قد يؤخر النظام الاكتشاف لتوفير الطاقة.
يمكن للتطبيق الذي يعمل كـ Peripheral الإعلان عن الخدمات والرد على طلبات الأجهزة الأخرى. وضع bluetooth-peripheral يسمح للتطبيق بالبقاء مرئيًا لأجهزة BLE الأخرى حتى في الخلفية. يُستخدم في تطبيقات HealthKit وحلول IoT.
مراقبة iBeacon تعمل في الخلفية دون أذونات إضافية — النظام نفسه يتتبع الدخول والخروج من مناطق Beacon. ولكن لمسح محتوى Beacon (UUID القرب، major، minor) تحتاج إلى إذن Bluetooth و bluetooth-central Background Mode. استخدم CLLocationManager مع CLBeaconRegion للمراقبة.
VoIP Background Mode مصمم لتطبيقات الاتصال الصوتي (Skype، Zoom، WhatsApp). يسمح هذا الوضع للتطبيق بالبقاء متصلاً بالخادم لاستقبال المكالمات الواردة. ابتداءً من iOS 8، يُستخدم PushKit — إطار عمل يعالج إشعارات الدفع من خادم VoIP دون إشراك APNs.
PushKit هي الآلية الوحيدة التي تضمن تسليم إشعارات VoIP إلى الجهاز. عند استلام إشعار PushKit، يستيقظ النظام التطبيق، حتى لو كان قد تم إنهاؤه. يجب على التطبيق إنشاء اتصال بالخادم خلال 30 ثانية وعرض إشعار محلي للمكالمة الواردة.
import PushKit
class VoIPHandler: NSObject, PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping () -> Void
) {
let caller = payload.dictionaryPayload["caller"] as! String
reportIncomingCall(from: caller)
completion()
}
}
لا يمكن استخدام PushKit للإشعارات العادية — فقط لـ VoIP واتصالات watchOS وموفري الملفات. Apple تتحقق من ذلك أثناء المراجعة. الاستخدام غير المشروع يؤدي إلى رفض التطبيق. ابتداءً من iOS 13، PushKit يسلم الإشعار فقط — استدعاء CXProvider (CallKit) لعرض شاشة المكالمة إلزامي.
Background Fetch و Background Processing هما وضعان للتحديثات الخلفية للمحتوى والمهام الطويلة. Fetch للتحديثات الدورية القصيرة (حتى 30 ثانية)، Processing للمهام الطويلة (حتى 10 دقائق) بشروط (Wi-Fi، الشحن). Processing متاح فقط من iOS 13+.
وضع Fetch يسمح للنظام بإيقاظ التطبيق دوريًا لتنزيل محتوى جديد. يحلل النظام سلوك المستخدم ويختار الوقت الأمثل. يجب على التطبيق استدعاء completion handler خلال 30 ثانية. Fetch مناسب لتطبيقات الأخبار وتغذيات الشبكات الاجتماعية والطقس.
BGProcessingTask مصممة للمهام التي يمكن تنفيذها بدون تدخل المستخدم: تنظيف ذاكرة التخزين المؤقت، مزامنة قاعدة بيانات كبيرة، معالجة ملفات الوسائط. يبدأ النظام المهمة فقط في ظروف مواتية — الجهاز قيد الشحن، متصل بشبكة Wi-Fi، ليس في وضع الطاقة المنخفضة. متاح حتى 10 دقائق.
لـ BGProcessingTask، يجب تحديد requiresExternalPower و requiresNetworkConnectivity. قد يؤخر النظام التنفيذ إلى أجل غير مسمى إذا لم تتوفر الشروط. على عكس BGAppRefreshTask، الذي يجب تنفيذه مرة واحدة على الأقل يوميًا، قد لا يتم تنفيذ Processing لأسابيع إذا كان الجهاز نادرًا ما يُشحن.
تراجع Apple بدقة استخدام Background Modes أثناء مراجعة التطبيقات. القاعدة الرئيسية: كل وضع مفعل يجب أن يكون مبررًا بوظائف التطبيق. إذا أعلن التطبيق عن Location Mode لكنه لا يستخدم تحديد الموقع، سيتم رفضه مع طلب إزالة الإمكانية.
أكثر المخالفات شيوعًا: Location Mode بدون حاجة واضحة (يطلب التطبيق الوصول “دائمًا” لعرض الإعلانات)، Audio Mode بدون تشغيل صوت في الخلفية، VoIP بدون PushKit، BLE Mode بدون أجهزة Bluetooth. قد ترفض Apple التطبيق حتى في مرحلة التحديث إذا لم يعد الوضع مستخدمًا.
عند الإرسال للمراجعة، قدم تبريرًا محددًا لكل وضع في الملاحظات. على سبيل المثال، “يُستخدم Location Background Mode لتتبع مسار المستخدم في ميزة اللياقة البدنية”. بدون شرح، قد يرفض المراجع التطبيق. للوظائف السرية (VoIP)، قد تطلب Apple حساب اختبار.
استخدم الحد الأدنى الضروري من الأوضاع. إذا كان تطبيقك يحتاج إلى تنزيل بيانات في الخلفية مرة كل ساعة — لا تفعل Location Mode، استخدم Fetch أو BGAppRefreshTask. الأوضاع الإضافية لا تؤدي فقط إلى الرفض، بل تخلق انطباعًا سلبيًا: يرى المستخدم في الإعدادات أن التطبيق يستخدم تحديد الموقع في الخلفية.
الأسئلة الشائعة
لا يوجد حد للعدد، ولكن كل وضع يجب أن يكون مبررًا بوظائف التطبيق. تفعيل جميع الأوضاع بدون ضرورة هو سبب مضمون للرفض أثناء المراجعة. الحد العملي هو 2–3 أوضاع لكل تطبيق، وإلا سيرى المستخدم العديد من طلبات الأذونات.
استخدم UIApplication.shared.applicationState — يمكن للتطبيق التحقق مما إذا كان في الخلفية (state == .background). يمكنك أيضًا مراقبة إشعارات UIApplication.didEnterBackgroundNotification و willEnterForegroundNotification لتبديل السلوك.
Audio — تشغيل الصوت عبر السماعة أو سماعات الرأس. AirPlay — بث الصوت والفيديو إلى Apple TV وأجهزة AirPlay الأخرى. عمليًا، يغطي Audio Mode كلا السيناريين لأن AirPlay يستخدم جلسة الصوت. لا حاجة لوضع AirPlay منفصل منذ iOS 7+.
نعم، لهذا استخدم requestWhenInUseAuthorization() بدلاً من requestAlwaysAuthorization(). سيتلقى التطبيق الموقع فقط في المقدمة. إذا كنت بحاجة إلى تتبع قصير في الخلفية، استدع startUpdatingLocation() وأوقفه في willResignActive.
كل وضع يزيد من استهلاك الطاقة. Location Mode هو الأكثر استهلاكًا، قد يقلل عمر البطارية بنسبة 30–50% مع التتبع المستمر. Audio Mode معتدل (15–20%). Fetch و Processing ضئيلان (2–5%). BLE Mode منخفض (5–10%) بفضل كفاءة الطاقة في Bluetooth LE.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا