Background Modes — مجموعهای از قابلیتهای اعلامشدنی iOS است که به برنامه اجازه میدهد پس از انتقال به حالت پسزمینه به اجرای کد ادامه دهد. هر حالت با نوع خاصی از وظایف مطابقت دارد: صدا، موقعیتیابی جغرافیایی، VoIP، بلوتوث، fetch و processing. طبق Apple, 2026، استفاده نادرست از Background Modes یکی از دلایل رایج رد برنامهها در بررسی App Store است.
نکات اصلی
Background Modes — capabilityهای پروژه Xcode هستند که قصد برنامه را برای اجرای انواع خاصی از عملیاتهای پسزمینه اعلام میکنند. برخلاف Android، جایی که برنامه میتواند هر Service را در پسزمینه راهاندازی کند، iOS نیاز به مشخص کردن صریح حالت در Info.plist دارد. هر حالت قوانین استفاده دقیقی دارد و توسط Apple در بررسی تأیید میشود.
وقتی برنامه به پسزمینه میرود، iOS آن را پس از ۳–۵ ثانیه معلق میکند. اگر برنامه Background Mode را اعلام کرده و از API مربوطه (مثلاً AVAudioSession برای صدا) استفاده فعالانه کند، سیستم آن را به حالت اجرای ویژهای منتقل میکند. برنامه باقی میماند در حافظه RAM و میتواند کد محدود شده توسط نوع حالت را اجرا کند.
iOS از Background Modes زیر پشتیبانی میکند: Audio، Location، VoIP، Bluetooth LE، 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 | اعلانهای Push VoIP | 4.0+ |
| BLE | bluetooth-central | کار با دستگاههای BLE | 7.0+ |
| Fetch | fetch | بارگیری دورهای داده | 7.0+ |
| Processing | processing | وظایف طولانی مدت پسزمینه | 13.0+ |
| Push to Talk | push-to-talk | Push to Talk صوتی | 16.0+ |
Audio Background Mode — رایجترین حالت است که توسط پخشکنندههای موسیقی، برنامههای پادکست و سرویسهای صوتی استفاده میشود. برنامه میتواند به پخش صدا ادامه دهد، از طریق Control Center کنترل شود و در Lock Screen نمایش داده شود. برای فعالسازی کافی است AVAudioSession را با رده .playback پیکربندی کنید.
برای کار صدا در پسزمینه باید AVAudioSession را پیکربندی و فعال کنید. رده .playback به سیستم اعلام میکند که برنامه در حال پخش صدا است و باید در پسزمینه فعال بماند. بدون این پیکربندی، صدا پس از بستن برنامه در عرض ۵–۱۰ ثانیه متوقف میشود.
import AVFoundation
func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(
.playback,
mode: .default,
options: []
)
try session.setActive(true)
} catch {
print("خطای جلسه صوتی: \(error)")
}
}
برای ادغام با Control Center و Lock Screen باید MPRemoteCommandCenter را پیکربندی کنید. این دستورات Play، Pause، Next و Previous Track را پردازش میکند. همچنین باید MPNowPlayingInfoProperty را برای نمایش فراداده بهروزرسانی کنید: نام آهنگ، هنرمند، جلد و پیشرفت پخش.
از iOS 14 به بعد، Background Mode audio از Picture in Picture برای ویدیو نیز پشتیبانی میکند. برنامه میتواند ویدیو را در یک پنجره شناور هنگام بسته شدن ادامه دهد. برای فعالسازی از AVPictureInPictureController با AVPlayerLayer استفاده کنید. حالت فقط در صورتی کار میکند که برنامه یک track صوتی پخش کند.
Location Background Mode به برنامه اجازه میدهد بهروزرسانیهای موقعیت جغرافیایی را در پسزمینه دریافت کند. در ناوبرها، ردیابهای تناسب اندام، برنامههای تحویل و شبکههای اجتماعی استفاده میشود. بدون این حالت، برنامه فقط یک بار هنگام انتقال به پسزمینه موقعیت را دریافت میکند و پس از آن بهروزرسانیها متوقف میشود.
CLLocationManager از چندین استراتژی ردیابی پشتیبانی میکند: تغییرات قابل توجه (significant-change location)، ردیابی استاندارد (standard location) و نظارت بر منطقه (region monitoring). برای کار در پسزمینه با حداکثر دقت از allowsBackgroundLocationUpdates = true و pausesLocationUpdatesAutomatically = false استفاده کنید.
ردیابی مداوم موقعیت در پسزمینه یکی از پرمصرفترین سناریوها از نظر انرژی است. iOS به طور خودکار فرکانس بهروزرسانی را با توجه به سرعت حرکت تنظیم میکند: هنگام پیادهروی هر ۱۰–۳۰ ثانیه، هنگام رانندگی با ماشین هر ۱–۵ ثانیه. برای ناوبری از 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 کار میکند — سیستم فقط هنگام تغییر قابل توجه مختصات (معمولاً ۵۰۰ متر و بیشتر) برنامه را بیدار میکند. نیاز به روشن بودن مداوم GPS ندارد که باعث صرفهجویی در باتری میشود. برای برنامههای آب و هوایی مناسب است که هنگام جابجایی کاربر دادهها را بهروزرسانی میکنند.
Bluetooth LE Background Mode به برنامه اجازه میدهد با دستگاههای BLE در پسزمینه تعامل داشته باشد. توسط دستبندهای تناسب اندام، سنسورهای پزشکی، دستگاههای Smart Home و ناوبری Beacon استفاده میشود. این حالت به دو زیرشاخه تقسیم میشود: bluetooth-central (برنامه به دستگاهها متصل میشود) و bluetooth-peripheral (برنامه به عنوان دستگاه عمل میکند).
برنامه در نقش Central میتواند دستگاههای BLE را در پسزمینه اسکن کرده و به آنها متصل شود. برای این کار باید bluetooth-central در Background Modes مشخص شود و CBCentralManager.scanForPeripherals با گزینه CBCentralManagerScanOptionAllowDuplicatesKey فراخوانی شود. در پسزمینه اسکن با فرکانس کاهش یافته کار میکند — سیستم ممکن است تشخیص را برای صرفهجویی در انرژی به تأخیر بیندازد.
برنامه در نقش Peripheral میتواند سرویسها را تبلیغ کرده و به درخواستهای دستگاههای دیگر پاسخ دهد. حالت bluetooth-peripheral به برنامه اجازه میدهد حتی در پسزمینه برای سایر دستگاههای BLE قابل مشاهده باقی بماند. در برنامههای HealthKit و راهحلهای IoT استفاده میشود.
نظارت iBeacon بدون مجوزهای اضافی در پسزمینه کار میکند — سیستم خودش ورود و خروج از منطقه Beacon را ردیابی میکند. اما برای اسکن محتوای Beacon (proximity UUID، major، minor) نیاز به مجوز بلوتوث و bluetooth-central Background Mode است. از CLLocationManager با CLBeaconRegion برای نظارت استفاده کنید.
VoIP Background Mode برای برنامههای ارتباط صوتی (Skype، Zoom، WhatsApp) طراحی شده است. این حالت به برنامه اجازه میدهد برای دریافت تماسهای ورودی به سرور متصل باقی بماند. از iOS 8 به بعد، برای VoIP از PushKit استفاده میشود — چارچوبی که اعلانهای Push را از سرور VoIP بدون دخالت APNs پردازش میکند.
PushKit تنها مکانیزمی است که تحویل اعلان VoIP به دستگاه را تضمین میکند. پس از دریافت اعلان PushKit، سیستم برنامه را بیدار میکند، حتی اگر برنامه خاتمه یافته باشد. برنامه باید ظرف ۳۰ ثانیه به سرور متصل شده و یک اعلان محلی درباره تماس ورودی نمایش دهد.
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 — بهروزرسانیهای دورهای کوتاه (تا ۳۰ ثانیه)، Processing — وظایف طولانی (تا ۱۰ دقیقه) با شرایط (Wi-Fi، شارژ). Processing فقط از iOS 13+ در دسترس است.
حالت Fetch به سیستم اجازه میدهد به طور دورهای برنامه را برای بارگیری محتوای تازه بیدار کند. سیستم رفتار کاربر را تحلیل کرده و زمان بهینه را انتخاب میکند. برنامه باید در عرض ۳۰ ثانیه completion handler را فراخوانی کند. Fetch برای برنامههای خبری، فیدهای شبکههای اجتماعی و آب و هوا مناسب است.
BGProcessingTask برای وظایفی طراحی شده است که میتوانند بدون مشارکت کاربر انجام شوند: پاکسازی حافظه نهان، همگامسازی پایگاه داده بزرگ، پردازش فایلهای رسانهای. سیستم فقط در شرایط مساعد وظیفه را اجرا میکند — دستگاه در حال شارژ، متصل به Wi-Fi، نه در حالت Low Power. تا ۱۰ دقیقه در دسترس است.
برای BGProcessingTask باید requiresExternalPower و requiresNetworkConnectivity را مشخص کنید. سیستم میتواند اجرا را برای مدت نامحدودی به تأخیر بیندازد اگر شرایط برآورده نشود. برخلاف BGAppRefreshTask که باید حداقل یک بار در روز اجرا شود، Processing ممکن است هفتهها اجرا نشود اگر دستگاه به ندرت شارژ شود.
Apple به شدت استفاده از Background Modes را در بررسی برنامهها کنترل میکند. قانون اصلی: هر حالت فعال باید با عملکرد برنامه توجیه شود. اگر برنامه Location Mode را اعلام کند اما از موقعیتیابی جغرافیایی استفاده نکند، با درخواست حذف capability رد میشود.
رایجترین تخلفات: Location Mode بدون نیاز آشکار (برنامه دسترسی «Always» را برای نمایش تبلیغات درخواست میکند)، Audio Mode بدون پخش صدا در پسزمینه، VoIP بدون PushKit، BLE Mode بدون دستگاههای بلوتوث. Apple ممکن است برنامه را حتی در مرحله بهروزرسانی رد کند اگر حالت دیگر استفاده نشود.
هنگام ارسال برای بررسی، در Notes توجیه مشخصی برای هر حالت ارائه دهید. به عنوان مثال، «Location Background Mode برای ردیابی مسیر کاربر در ویژگی تناسب اندام استفاده میشود». بدون توضیح، بازبین ممکن است برنامه را رد کند. برای عملکردهای محرمانه (VoIP)، Apple ممکن است حساب آزمایشی درخواست کند.
از حداقل مجموعه لازم حالتها استفاده کنید. اگر برنامه نیاز به بارگیری داده در پسزمینه یک بار در ساعت دارد — Location Mode را فعال نکنید، از Fetch یا BGAppRefreshTask استفاده کنید. حالتهای اضافی نه تنها منجر به رد میشوند، بلکه تأثیر منفی ایجاد میکنند: کاربر در تنظیمات میبیند که برنامه از موقعیتیابی جغرافیایی در پسزمینه استفاده میکند.
سوالات متداول
هیچ محدودیتی برای تعداد وجود ندارد، اما هر حالت باید با عملکرد برنامه توجیه شود. فعال کردن همه حالتها بدون نیاز — دلیل تضمینی رد در بررسی. محدودیت عملی ۲–۳ حالت در هر برنامه است، در غیر این صورت کاربر درخواستهای مجوز متعددی خواهد دید.
از 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 — پرهزینهترین، میتواند زمان کار را ۳۰–۵۰٪ در ردیابی مداوم کاهش دهد. Audio Mode — متوسط (۱۵–۲۰٪). Fetch و Processing — حداقل (۲–۵٪). BLE Mode — کم (۵–۱۰٪) به دلیل بهرهوری انرژی Bluetooth LE.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید