المهام والتحديثات في الخلفية
جدول العمل في الخلفية باستخدام BGTaskScheduler.
المهام والتحديثات في الخلفية درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
لماذا توجد مهام الخلفية
يعلّق iOS التطبيقات بقوة لتوفير طاقة البطارية. ولتنفيذ عمل مفيد أثناء وجود التطبيق في الخلفية، مثل تحديث موجز أو معالجة تنزيل، تقومون بجدولته عبر BGTaskScheduler. ويقرر النظام متى ينفذه، موازنًا بين احتياجاتكم والطاقة وأنماط الاستخدام.
import BackgroundTasks
// You request work; the system schedules it later
// at an opportune moment (charging, on Wi-Fi, etc.)نوعا المهام
هناك نوعان: BGAppRefreshTask للتحديثات القصيرة والمتكررة (بضع ثوانٍ)، وBGProcessingTask للأعمال الأطول والأكثر استهلاكًا للموارد (عدة دقائق)، مثل صيانة قاعدة البيانات، مع إمكانية اشتراط الطاقة أو الشبكة.
import BackgroundTasks
// BGAppRefreshTask -> quick content refresh
// BGProcessingTask -> long maintenance, can require
// external power / networkالتصريح عن المعرّفات
تحتاج كل مهمة إلى معرّف فريد تدرجونه في Info.plist ضمن BGTaskSchedulerPermittedIdentifiers. ومن دون هذا التصريح، يفشل التسجيل. استخدموا سلاسل من نمط DNS العكسي.
// Info.plist:
// BGTaskSchedulerPermittedIdentifiers = [
// "com.example.app.refresh",
// "com.example.app.cleanup"
// ]
let ids = "declare every identifier in Info.plist"
_ = idsتسجيل معالج
عند التشغيل، سجّلوا معالجًا لكل معرّف باستخدام BGTaskScheduler.shared.register. يجب أن يحدث ذلك قبل اكتمال تشغيل التطبيق. ويعمل المعالج كلما قرر النظام لاحقًا تنفيذ المهمة.
import BackgroundTasks
func registerTasks() {
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.example.app.refresh",
using: nil) { task in
handleRefresh(task as! BGAppRefreshTask)
}
}إرسال طلب
لا يؤدي التسجيل إلا إلى ربط المعالج. ولطلب تنفيذ المهمة فعليًا، أنشئوا BGAppRefreshTaskRequest، واضبطوا تاريخ البدء المبكر، ثم نفّذوا submit. ويتعامل النظام مع هذا التاريخ على أنه تلميح لا ضمان.
import BackgroundTasks
func scheduleRefresh() {
let request = BGAppRefreshTaskRequest(
identifier: "com.example.app.refresh")
request.earliestBeginDate = Date(
timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
}أعيدوا الجدولة دائمًا
يُنفّذ الطلب المُرسل مرة واحدة كحد أقصى. وللاستمرار في التحديث، يجب على المعالج إرسال الطلب التالي قبل انتهائه. أعيدوا الجدولة أولًا، ثم نفّذوا العمل، حتى لا يؤدي تعطل التطبيق أثناء العمل إلى إيقاف الدورة.
import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
scheduleRefresh() // queue the next run first
// ... then perform this run's work
}الإشارة إلى اكتمال المهمة
يجب استدعاء task.setTaskCompleted(success:) عند الانتهاء. فنسيان ذلك يهدر ميزانية العمل في الخلفية، وقد يؤدي إلى خفض أولوية المهام المستقبلية. مرّروا ما إذا كان العمل قد نجح، حتى يتمكن النظام من تكييف الجدولة.
import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
scheduleRefresh()
Task {
let ok = await fetchLatest()
task.setTaskCompleted(success: ok)
}
}
func fetchLatest() async -> Bool { true }احترام معالج انتهاء المهلة
قد يستعيد النظام الوقت قبل الموعد المتوقع. اضبطوا task.expirationHandler لإلغاء العمل الجاري وتنظيف الموارد، حتى يخرج التطبيق بسلاسة إذا أُوقف مبكرًا. تعاملوا معه كمنبّه لموعد نهائي.
import BackgroundTasks
func handle(_ task: BGAppRefreshTask) {
let work = Task { await fetchLatest() }
task.expirationHandler = {
work.cancel() // stop before the OS suspends us
}
}
func fetchLatest() async -> Bool { true }معالجة المهام بمتطلبات
للأعمال الثقيلة، يتيح لكم BGProcessingTaskRequest ضبط requiresNetworkConnectivity وrequiresExternalPower. وينتظر النظام تحقق هذه الشروط، لذلك يمكن تنفيذ المهام الطويلة أثناء شحن الجهاز ليلًا مع اتصاله بشبكة Wi-Fi.
import BackgroundTasks
func scheduleCleanup() {
let req = BGProcessingTaskRequest(
identifier: "com.example.app.cleanup")
req.requiresExternalPower = true
req.requiresNetworkConnectivity = false
try? BGTaskScheduler.shared.submit(req)
}الاختبار في مصحح الأخطاء
لن تضطروا إلى الانتظار ساعات حتى يجدول النظام المهمة. أوقفوا التنفيذ في مصحح الأخطاء وشغّلوا أمر LLDB لإجبار مهمة مسجلة على البدء فورًا، حتى تتمكنوا من التحقق من المعالج من البداية إلى النهاية.
// In LLDB while paused:
// e -l objc -- (void)[[BGTaskScheduler sharedScheduler]
// _simulateLaunchForTaskWithIdentifier:
// @"com.example.app.refresh"]
let test = "force-launch task via LLDB"
_ = testدورة تحديث مكتملة
عند جمع الأجزاء معًا: سجّلوا المهمة عند التشغيل، وأرسلوا الطلب عند الانتقال إلى الخلفية، ثم أعيدوا الجدولة داخل المعالج، واحموه بمعالج انتهاء المهلة، ونفّذوا العمل غير المتزامن، وأبلغوا عن الاكتمال.
import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
scheduleRefresh()
let work = Task { await fetchLatest() }
task.expirationHandler = { work.cancel() }
Task {
let ok = await work.value
task.setTaskCompleted(success: ok)
}
}
func fetchLatest() async -> Bool { true }اختبار سريع
تذكّروا دورة حياة مهمة تحديث متكررة.
مراجعة
لقد تعلمتم جدولة العمل في الخلفية:
- استخدموا
BGAppRefreshTaskللتحديثات القصيرة، وBGProcessingTaskللصيانة الطويلة التي تتطلب الطاقة أو الشبكة. - صرّحوا عن المعرّفات في Info.plist، وسجّلوا المعالجات عند التشغيل باستخدام
register، وأرسلوا الطلبات باستخدامsubmitمع تحديدearliestBeginDate. - أعيدوا جدولة التشغيل التالي داخل المعالج، واضبطوا
expirationHandler، واستدعوا دائمًاsetTaskCompleted. - أجبروا المهام على البدء عبر LLDB للاختبار.
تعلم Swift مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 122
- الدروس
- 409
الأسئلة الشائعة
هل درس «المهام والتحديثات في الخلفية» مجاني؟
نعم — نص درس «المهام والتحديثات في الخلفية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «المهام والتحديثات في الخلفية»؟
جدول العمل في الخلفية باستخدام BGTaskScheduler. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «المهام والتحديثات في الخلفية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التسجيل للإشعارات الفورية
- التعامل مع حمولات الإشعارات
- المهام والتحديثات في الخلفية
- إجراءات الإشعارات وفئاتها