نظرة عامة على امتدادات التطبيقات
تعرّفوا على امتدادات المشاركة والإجراءات وغيرها
نظرة عامة على امتدادات التطبيقات درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
ما هي امتدادات التطبيقات
يتيح app extension لتطبيقكم توفير وظائف داخل تطبيقات أخرى أو ضمن واجهات النظام، مثل مشاركة المحتوى ولوحات المفاتيح المخصصة وفهرسة Spotlight وغير ذلك. وكل امتداد هو هدف منفصل له دورة حياة وحاوية معزولة ونقطة دخول خاصة به يحددها النظام.
// Extensions run in their own process, launched
// by the host (Photos, Safari, Messages, the system),
// not by your main app.التطبيق المضيف والحاوية والعزل
هناك ثلاثة أطراف: يستدعي host app الامتداد، ويضمّنه container app الخاص بكم، بينما يعمل extension نفسه ضمن بيئة معزولة. ولا يمكن للامتداد التواصل بحرية مع تطبيقكم؛ بل يتواصلان عبر App Group، وليس من خلال الوصول المباشر إلى الذاكرة مطلقًا.
import Foundation
// Container app + Extension target share data via
// an App Group, e.g. group.com.example.app
let group = "group.com.example.app"
_ = groupShare Extensions
يظهر Share Extension في ورقة المشاركة بالنظام، مما يتيح للمستخدمين إرسال محتوى، مثل النصوص وعناوين URL والصور، من أي تطبيق إلى تطبيقكم. وهو يشتق من وحدة تحكم بالعرض أو يستضيفها، ويقرأ العناصر المشتركة من سياق الامتداد.
import Foundation
// Share extension reads incoming items:
// extensionContext?.inputItems
// each NSExtensionItem has attachments (NSItemProvider)
let share = "appears in the share sheet"
_ = shareقراءة العناصر المشتركة
يصل المحتوى المشترك على شكل مرفقات من نوع NSItemProvider. وتتحققون من معرّف النوع ثم تحمّلون القيمة بشكل غير متزامن. وبهذه الطريقة يحصل امتداد المشاركة على عنوان URL أو الصورة التي يشاركها المستخدم.
import UniformTypeIdentifiers
func handle(_ provider: NSItemProvider) {
if provider.hasItemConformingToTypeIdentifier(
UTType.url.identifier) {
provider.loadItem(
forTypeIdentifier: UTType.url.identifier) {
value, _ in
print("shared url:", value ?? "none")
}
}
}Action Extensions
يحوّل Action Extension المحتوى أو يعرضه في موضعه، مثل ترجمة نص محدد أو إضافة تعليقات توضيحية إلى ملف PDF، ويمكنه إعادة نتيجة إلى المضيف. وعلى خلاف امتداد المشاركة، صُمّم هذا الامتداد للعمل على المحتوى بدلًا من إرساله إلى مكان آخر.
import Foundation
// Action extension may return modified items:
// extensionContext?.completeRequest(
// returningItems: outputItems)
let action = "acts on content, can return a result"
_ = actionNotification Service Extension
يعترض Notification Service Extension إشعارات الدفع الواردة التي تتضمن mutable-content: 1 لتعديلها قبل عرضها، مثل فك تشفير النص أو تنزيل مرفق وسائط أو إعادة كتابة العنوان، وذلك ضمن مهلة زمنية قصيرة.
import UserNotifications
// Override in UNNotificationServiceExtension:
// didReceive(_ request:, withContentHandler:)
// mutate bestAttemptContent, then call the handler
let service = "modifies push before it shows"
_ = serviceNotification Content Extension
يوفّر Notification Content Extension واجهة مستخدم مخصصة لإشعار موسّع، مثل خريطة أو مشغّل وسائط أو عناصر تحكم تفاعلية، تظهر عندما يضغط المستخدم مطولًا على الشعار. ويرتبط هذا الامتداد بفئة إشعار.
import UserNotifications
// UNNotificationContentExtension renders a custom view
// for a given UNNotificationCategory when expanded.
let content = "custom expanded notification UI"
_ = contentدورة حياة completeRequest
تعمل الامتدادات لفترة قصيرة. عند الانتهاء، استدعوا extensionContext?.completeRequest(returningItems:completionHandler:) للإشارة إلى اكتمال العملية والسماح للمضيف بإغلاق الامتداد. وللخروج قبل الأوان، استخدموا cancelRequest(withError:). فإبقاء العملية مفتوحة يهدر الموارد، وقد يتولى النظام إنهاءها.
import Foundation
func finish(context: NSExtensionContext?) {
context?.completeRequest(
returningItems: [], completionHandler: nil)
}نقاط الامتداد الأخرى
يوفّر iOS العديد من نقاط الامتداد: لوحات المفاتيح المخصصة، وموفّرات المستندات، وفهرسة Spotlight، وحاجبات محتوى Safari، وSiri intents، وتحرير الصور، وامتدادات موفّر الملفات. ويلتزم كل امتداد ببروتوكول يحدده النظام، ويُعلَن عنه بواسطة NSExtensionPointIdentifier في Info.plist.
// Info.plist of an extension declares its point:
// NSExtension > NSExtensionPointIdentifier
// e.g. com.apple.share-services
// com.apple.usernotifications.service
let point = "each extension declares its point"
_ = pointحدود الذاكرة والوقت
تعمل الامتدادات ضمن حدود أكثر تشددًا من التطبيق الرئيسي، إذ تتوفر لها ذاكرة أقل ومهلة زمنية قصيرة. نفّذوا الحد الأدنى من العمل، وتجنبوا عمليات الحجز الكبيرة، وانقلوا المعالجة الثقيلة إلى التطبيق الرئيسي عبر التخزين المشترك كلما أمكن.
import Foundation
// Tight memory + short runtime.
// Pattern: extension stages data in the App Group,
// the main app processes it fully on next launch.
let limits = "keep extensions lean and fast"
_ = limitsمشاركة التعليمات البرمجية بين الأهداف
لتجنب تكرار المنطق، ضعوا النماذج والمساعدات المشتركة في إطار عمل أو حزمة Swift يعتمد عليها كل من التطبيق والامتداد. حدّدوا فقط ما يحتاج إليه كل هدف؛ إذ يربط الامتداد التعليمات البرمجية نفسها من دون نسخها.
import Foundation
// Shared Swift package 'AppCore' linked by:
// - main app target
// - share extension target
// - widget extension target
let shared = "one source of truth for models"
_ = sharedاختبار سريع
تذكّروا كيفية تواصل الامتداد مع تطبيق الحاوية.
مراجعة
استعرضتم امتدادات التطبيقات:
- الامتدادات أهداف منفصلة ومعزولة، ويطلقها مضيف؛ وتشمل الأنواع امتدادات المشاركة والإجراءات وخدمة الإشعارات ومحتوى الإشعارات.
- اقرؤوا المحتوى الوارد عبر
NSItemProvider، وأنهوا التنفيذ باستخدامcompleteRequest. - يعلن كل امتداد عن
NSExtensionPointIdentifierالخاص به، ويعمل ضمن حدود صارمة للذاكرة والوقت. - شاركوا البيانات عبر App Group، وأعيدوا استخدام التعليمات البرمجية من خلال حزمة مشتركة.
الأسئلة الشائعة
هل درس «نظرة عامة على امتدادات التطبيقات» مجاني؟
نعم — نص درس «نظرة عامة على امتدادات التطبيقات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «نظرة عامة على امتدادات التطبيقات»؟
تعرّفوا على امتدادات المشاركة والإجراءات وغيرها تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «نظرة عامة على امتدادات التطبيقات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إنشاء Widget باستخدام WidgetKit
- موفّرو المخططات الزمنية واللقطات
- نظرة عامة على امتدادات التطبيقات
- App Intents والاختصارات