الحدث الرئيسي لهذا العام في عالم مطوري iOS و MacOS ، WWDC ، يرضي دائمًا جميع الأشخاص المعنيين بالصناعة من خلال إصدار إصدارات جديدة من نظام التشغيل ، والأطر ، والأجهزة - بشكل عام ، كل ما يحتاج فعليًا إلى العمل عليه.
لم يكن هذا العام استثناءً وكان موضوع النقاش النشط هو الإصدار الجديد من نظام التشغيل iOS و SwiftUI ونظام تشغيل iPadOS للأجهزة التي تفهمها بنفسك.
ومع ذلك ، كانت هناك مواضيع أقل تغطيتها ، ولكن ليس أقل إثارة للاهتمام من هذا - على سبيل المثال ، تم لمس شيء مفيد مثل تنفيذ خلفية التطبيقات.
باختصار عن الموضوع
بالنسبة لأولئك الذين لا يفهمون تمامًا ماهية تنفيذ الخلفية ، دعنا نفسر: التنفيذ في الخلفية يعني أن التطبيق يؤدي بعض الأعمال في حالة ما عندما لا يعمل فعليًا على شاشة الهاتف الذكي للمستخدم (أي أنه ليس في المقدمة) .

تظهر هذه الصورة بوضوح في الشروط التي يمكن للتطبيق البقاء فيها وكيفية الانتقال من واحدة إلى أخرى.
أيضًا ، ركز مطورو Apple في هذه الجلسة على استهلاك الموارد (آمل أنه من الواضح تمامًا أنه عند العمل في الخلفية ، يستمر التطبيق في استهلاك الطاقة). ولكن حان الوقت للذهاب مباشرة إلى التقرير.
ما حدث في WWDC
في الواقع ، بدأ المتحدثون بنفس الشيء كما فعلت - تحدثوا لفترة وجيزة عن العمل في الخلفية ووصفوا المهام التي سيتم تنفيذها هناك.

نحن نقترب من التنمية. هناك 3 اعتبارات رئيسية لـ Apple عندما يتعلق الأمر بأداء الخلفية:
كل شيء بسيط للغاية - إذا كانت مهمة تطبيق قيد التشغيل في الخلفية ، يمكن أن يحدث هذا التنفيذ أثناء تشغيل تطبيق آخر في المقدمة. وبالتالي ، هناك حد مورد مفروض عليك لضمان عدم استهلاك الموارد بشكل مفرط. إذا تم تجاوز هذه الحدود ، فقد يتم إنهاء طلبك بالقوة من قِبل Apple ، مما يؤدي إلى إبطاء وقت بدء التشغيل الإضافي. فيما يتعلق بالخصوصية ، توصي الشركة بشدة أن يستخدم المطورون جميع ميزات واجهة برمجة التطبيقات الخاصة بهم لإبلاغ المستخدم بالبيانات التي يستخدمها التطبيق في عمله (حتى في الخلفية).
بالمناسبة ، كانت قائمة واجهات برمجة التطبيقات هذه مثيرة للإعجاب إلى حد كبير - فهي لم تقم بمراجعة منفصلة ، لكنني أنصحك بالاهتمام بها.
نعم ، وفي الجلسة نفسها ، أظهر مطورو Apple لمحة موجزة عن الاحتمالات باستخدام مثال تطبيق messenger (يستحق مشاهدة مقطع فيديو من WWDC).
BackgroundTasks
ما يقرب من نصف التقرير هذا العام مخصص لهذا الإطار.
2 أنواع المهام التي توفرها هذه الجدة:
- تحديث التطبيق المهمة
- مهمة معالجة الخلفية
تحديث التطبيق المهمة
BG App Refresh Task هي نوع خاص من مهام الخلفية التي يمكننا استخدامها لتحديث بيانات التطبيق. الشيء الوحيد الذي يجعل هذا النوع من المهام مميزًا جدًا هو سلوك المستخدم. يتعرف نظام iOS على عدد المرات وفي أي وقت يقوم المستخدم بتشغيل التطبيق الخاص بك ، ويحاول تشغيل BGAppRefreshTask في وقت من غير المحتمل أن يستخدم فيه التطبيق التطبيق.

نعم ، لن يعمل لمدة أطول من 30 ثانية - الميزة غير سارة للغاية ، والتي خلفتها الإصدارات السابقة من نظام التشغيل.
النظر في مثال على التعليمات البرمجية من الإنترنت.
import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.refresh", using: DispatchQueue.global() ) { task in self.handleAppRefresh(task) } return true } private func handleAppRefresh(_ task: BGTask) { let queue = OperationQueue() queue.maxConcurrentOperationCount = 1 let appRefreshOperation = AppRefreshOperation() queue.addOperation(appRefreshOperation) task.expirationHandler = { queue.cancelAllOperations() } let lastOperation = queue.operations.last lastOperation?.completionBlock = { task.setTaskCompleted(success: !(lastOperation?.isCancelled ?? false)) } scheduleAppRefresh() } }
هناك عدة نقاط تحتاج إلى التوقف والتفكير فيها بشكل أفضل:
- قم بتثبيت معالج انتهاء الصلاحية على كائن المهمة (expirationHandler) ، نظرًا لأن النظام يوفر وقتًا محدودًا لإكمال العمل ، وإذا تم تجاوزه ، فسيتعين عليك مسح الموارد.
- تأكد من أنه تم استدعاء الأسلوب setTaskCompleted بمجرد اكتمال العملية.
- BGTaskScheduler هي الفئة الرئيسية التي يتم استخدامها لجدولة عمل الخلفية.
مهمة معالجة الخلفية
نوع آخر من الاختراق في الخلفية هو BG Processing Task. يمكنك استخدامه لتدريب نموذج ML على الجهاز أو القيام بعملية تنظيف في قاعدة البيانات. تعد شركة Apple بأن يكون النظام قادرًا على تخصيص ما يصل إلى عدة دقائق من الوقت لهذا النوع من المهام ، والذي يعد ابتكارًا مهمًا جدًا للعمل الشاق الذي لا يتناسب مع مدة 30 ثانية بائسة.
مرة أخرى مثال:
import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.train", using: DispatchQueue.global() ) { task in self.handleMLTrain(task) } return true } private func scheduleMLTrain() { do { let request = BGProcessingTaskRequest(identifier: "pl.snowdog.example.train") request.requiresExternalPower = true request.requiresNetworkConnectivity = true try BGTaskScheduler.shared.submit(request) } catch { print(error) } } }
نقاط مهمة:
- requiesExternalPower هي قيمة منطقية تشير إلى ما إذا كان الجهاز المتصل بمصدر طاقة مطلوبًا لمهمة المعالجة.
- requireNetworkConnectivity - قيمة منطقية تشير إلى ما إذا كان اتصال الشبكة مطلوبًا لمهمة المعالجة.
التصحيح
هنا ، أيضا ، لا يخلو من وسائل الراحة. يمكن أن يكون التأخير بين وقت التنفيذ المجدول لمهمة الخلفية واللحظة التي يقوم فيها النظام بتشغيل التطبيق لإكماله عدة ساعات. عند تطوير تطبيق ما ، يمكنك استخدام وظيفتين خاصتين لبدء مهمة وفرض إتمامها مبكرًا وفقًا للجدول الزمني المحدد. تعمل ميزات تصحيح الأخطاء فقط على الأجهزة.
- إطلاق المهمة:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"TASK_IDENTIFIER"]
- الإنهاء القسري المبكر للمهمة:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateExpirationForTaskWithIdentifier:@"TASK_IDENTIFIER"]
في الختام
يعد BackgroundTasks طريقة رائعة للتخطيط لعملك الشاق مع أفضل تجربة للمستخدم باستخدام البيئة الخاصة بك. نظرًا لأن الإصدار الثالث عشر من النظام ، أصبحت العديد من أساليب العمل في الخلفية قديمة ، فإن الإطار سيظل شائعًا للغاية في التطبيقات. بالنظر إلى الاحتمالات المذكورة أعلاه ، فإن هذا منطقي تمامًا.
أوصي أيضًا بمشاهدة
مقطع فيديو من WWDC ، والأمثلة الموصوفة هناك مثيرة جدًا للاهتمام.