Action Extension هو امتداد iOS ينفذ إجراءات مخصصة على المحتوى من التطبيقات الأخرى دون تبديل السياق. على عكس Share Extension الذي يرسل البيانات إلى تطبيق آخر، يقوم Action Extension بتحويل المحتوى في مكانه: ترجمة النص، تغيير مرشحات الصورة، تدقيق الإملاء أو إنشاء PDF. وفقًا لـ Apple (2024)، Action Extension هو ثاني أكثر أنواع الامتدادات شيوعًا بعد Share Extension، المستخدم في 42% من التطبيقات في فئة “الإنتاجية”. الإجراء الفوري دون تشغيل التطبيق الرئيسي هو الميزة الرئيسية للمستخدم.
النقاط الرئيسية
Action Extension هو نوع من امتدادات iOS يسمح بتنفيذ إجراءات على المحتوى مباشرة في سياق التطبيق المضيف. يحدد المستخدم نصًا في Safari، ويضغط “إجراءات” ويختار، على سبيل المثال، “تدقيق الإملاء” — يقوم الامتداد بمعالجة النص وإرجاع النتيجة دون مغادرة المتصفح. يستقبل الامتداد بيانات الإدخال عبر NSExtensionContext ويمكنه إرجاع المحتوى المعدل.
ظهر Action Extension في iOS 8 كجزء من بنية امتدادات التطبيقات. ميزته الرئيسية هي أن الامتداد ليس له واجهة خاصة به (اختياري) ويعمل في سياق التطبيق المضيف. لا يغادر المستخدم الشاشة الحالية، مما يضمن أقل احتكاك معرفي. وفقًا لـ Apple، Action Extension هو النوع الوحيد من الامتدادات الذي يمكنه قراءة وتعديل محتوى التطبيق المضيف في وقت واحد (عبر NSExtensionContext مع إرجاع النتيجة).
يُستخدم Action Extension في سيناريوهات متنوعة: ترجمة النص في المتصفح، إنشاء PDF من صفحة ويب، تطبيق مرشح على صورة في المعرض، تدقيق الإملاء في أي حقل نصي، تقصير URL، تشفير النص وإضافة إشارات مرجعية. التنوع يجعل Action Extension أداة شائعة لتطبيقات فئتي “الأدوات المساعدة” و“الإنتاجية”.
غالبًا ما يتم الخلط بين Action Extension وShare Extension، لكن أغراضهما مختلفة جوهريًا. Share Extension يرسل المحتوى من التطبيق المضيف إلى تطبيقك؛ Action Extension يعالج المحتوى ويعيده. الفرق يؤثر على البنية وتجربة المستخدم ومتطلبات تكوين Info.plist.
| الخاصية | Action Extension | Share Extension |
|---|---|---|
| الغرض | تحويل المحتوى | نقل المحتوى إلى التطبيق |
| الواجهة | اختياري (مخصص) | SLComposeServiceViewController |
| إرجاع البيانات | نعم، عبر completeRequest | لا |
| السياق | يبقى في التطبيق المضيف | ينتقل إلى الامتداد |
| الموضع في القائمة | Action Sheet (الجزء العلوي) | Share Sheet (الجزء السفلي) |
| الإجراء النموذجي | ترجمة، تصحيح، مرشح | حفظ، نشر |
يظهر Action Extension في قائمة الإجراءات (Action Sheet) عند الضغط على زر “مشاركة” أو “...”. يضع iOS تلقائيًا Action Extensions في الجزء العلوي من الورقة (الإجراءات) وShare Extensions في الجزء السفلي (التطبيقات). سيناريو المستخدم: حدد نصًا → ضغط “إجراءات” → اختار Action Extension الخاص بك → استلم النتيجة المعالجة دون تبديل التطبيقات.
يتكون Action Extension من target في Xcode، وUIViewController لعرض الواجهة (اختياري)، وNSExtensionContext لإدخال/إخراج البيانات، وتكوين Info.plist. الهندسة أبسط من Share Extension: لا توجد واجهة تأليف إلزامية ويمكن للامتداد العمل بالكامل بدون واجهة مستخدم.
Target — bundle منفصل بمعرف موروث من التطبيق الرئيسي. UIViewController — واجهة اختيارية لعرض التقدم أو الإعدادات أو النتائج. NSExtensionContext — حاوية ببيانات الإدخال (inputItems) وطريقة completeRequest لإرجاع النتائج. Info.plist — تكوين التنشيط عبر NSExtensionActivationRule والسمات (NSExtensionAttributes) لتحديد أنواع المحتوى المدعومة.
يستقبل Action Extension بيانات الإدخال عبر extensionContext?.inputItems — مصفوفة من NSExtensionItem. يحتوي كل عنصر على مرفقات ببيانات وUTI. بعد المعالجة، يستدعي الامتداد completeRequest(returningItems:) مع مصفوفة من NSExtensionItem للإخراج. يستقبل التطبيق المضيف البيانات المعالجة ويعرضها. نموذج غير متزامن: يمكن للامتداد تنفيذ عمليات طويلة، مع الاحتفاظ بالسياق لمدة تصل إلى 30 ثانية.
لنلقِ نظرة على إنشاء Action Extension بلغة Swift لترجمة النص المحدد. يستقبل الامتداد نصًا من التطبيق المضيف، ويرسله إلى خادم الترجمة، ويعيد النتيجة. ActionViewController هو وحدة التحكم الأساسية التي ينشئها Xcode عند إضافة target.
import UIKit
import MobileCoreServices
class ActionViewController: UIViewController {
@IBOutlet var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
extractTextAndTranslate()
}
func extractTextAndTranslate() {
guard let item = extensionContext?.inputItems.first
as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(
forTypeIdentifier: kUTTypePlainText as String
) { [weak self] (text, error) in
guard let inputText = text as? String else { return }
TranslationService().translate(inputText, from: "en", to: "ru") {
translated in
DispatchQueue.main.async {
self?.resultLabel?.text = translated
}
}
}
}
}
}
بعد المعالجة، يعيد الامتداد النتيجة إلى التطبيق المضيف. completeRequest مع بيانات الإخراج هو سيناريو بديل حيث لا يظهر الامتداد واجهة مستخدم بل يعيد المحتوى المعالج فورًا.
// Returning processed text to host app
let resultItem = NSExtensionItem()
let resultData = translated.data(using: .utf8)!
let attachment = NSItemProvider(
item: resultData,
typeIdentifier: kUTTypePlainText as String
)
resultItem.attachments = [attachment]
extensionContext?.completeRequest(
returningItems: [resultItem], completionHandler: nil
)
يمكن لـ Action Extension العمل في وضعين: مع واجهة مستخدم وبدونها. في الوضع بدون واجهة مستخدم، ينفذ الامتداد الإجراء بالكامل في الخلفية ويستدعي completeRequest فورًا بعد المعالجة. في وضع واجهة المستخدم، يعرض الامتداد وحدة تحكم، ويؤكد المستخدم الإجراء، وعندها فقط يرسل completeRequest النتيجة. اختيار الوضع يعتمد على تعقيد الإجراء والحاجة إلى إدخال المستخدم.
طريقة loadItem(forTypeIdentifier:) تعمل بشكل غير متزامن — يمكن أن تكون البيانات كبيرة (صور، فيديوهات). يدير NSItemProvider التدفق والتخزين المؤقت. للصور استخدم kUTTypeImage، للملفات استخدم kUTTypeFileURL. مهم: قد يتم استدعاء loadItem في خيط خلفي — قم بتحديث واجهة المستخدم فقط عبر DispatchQueue.main.
يعيد Action Extension البيانات المعالجة عبر completeRequest مع مصفوفة من NSExtensionItem. كل عنصر يتوافق مع نوع بيانات الإخراج. يمكن للتطبيق المضيف استبدال المحتوى الأصلي بالمحتوى المعالج — على سبيل المثال، استبدال الصورة الأصلية بأخرى مرشحة. NSExtensionItem يدعم نفس UTI مثل الإدخال، بالإضافة إلى أنواع إضافية (مثل public.html للمحتوى الويب).
يُستخدم Action Extension في عشرات السيناريوهات — من الأدوات البسيطة إلى سير العمل التجاري المعقد. الأمثلة الكلاسيكية تغطي عمليات النصوص والرسومات والملفات، بالإضافة إلى تكامل المحتوى الويب.
Action Extension للنص: الترجمة، التدقيق الإملائي، عدد الأحرف، تغيير حالة الأحرف، التشفير، إنشاء رمز QR من النص. يحدد المستخدم نصًا في أي تطبيق به حقل نصي (Safari، Notes، Mail) وينفذ الإجراء بنقرة واحدة. تمييز بناء الجملة للكود، تنسيق Markdown وتقصير URL هي أمثلة شائعة لـ Action Extension للمستخدمين المتقدمين.
للصور، يقدم Action Extension: تطبيق المرشحات، القص، تغيير الحجم، تحويل التنسيقات (HEIC إلى JPEG)، إضافة علامة مائية، التعرف على النص (OCR)، والضغط. معالجة الصور يجب أن تكون سريعة — يتوقع المستخدم نتيجة خلال 2–3 ثوانٍ. للعمليات الثقيلة استخدم Core Image على GPU أو قوائم انتظار خلفية.
Action Extension لعناوين URL: إنشاء PDF من صفحة ويب، حفظ في Pocket/Pinterest، فحص سرعة الموقع، أرشفة الصفحة، الحصول على بيانات Open Graph، إنشاء لقطة شاشة للصفحة. إنشاء PDF هو أحد أكثر السيناريوهات طلبًا: يحول المستخدم صفحة ويب إلى PDF دون فتح خدمات طرف ثالث.
الأسئلة الشائعة
Share Extension يرسل المحتوى من التطبيق المضيف إلى تطبيقك. Action Extension يعالج المحتوى في مكانه ويعيد النتيجة. Share — نقل، Action — تحويل. هذا الفرق الأساسي يحدد البنية وتجربة المستخدم.
نعم. إذا كان الإجراء لا يتطلب إدخال من المستخدم (مثل عدد الأحرف)، يمكن للامتداد تنفيذه في الخلفية وإرجاع النتيجة فورًا عبر completeRequest. في Info.plist يجب تحديد NSExtensionActivationSupportsWebURL أو UTI آخر يطابق نوع البيانات.
في أي تطبيقات تدعم UIActivityViewController أو وحدات التحكم القياسية للإجراءات. تشمل هذه Safari، الصور، الملفات، الملاحظات، البريد وآلاف التطبيقات الخارجية. Action Extension لا يعمل في التطبيقات التي لا تستخدم آليات الإجراءات القياسية في iOS.
عبر extensionContext.completeRequest(returningItems:) مع مصفوفة من NSExtensionItem. كل عنصر إخراج يحتوي على NSItemProvider مع البيانات المعالجة. يستقبل التطبيق المضيف النتيجة في مفوض UIActivityViewController أو رد اتصال مشابه.
يعمل الامتداد لمدة تصل إلى 30 ثانية، وبعدها ينهيه iOS قسرًا. لا يوجد وصول مباشر للتطبيق الرئيسي — فقط عبر App Groups. لا يمكن لـ Action Extension تنفيذ مهام خلفية بعد الانتهاء. للعمليات الطويلة، استخدم NSURLSession الخلفي مع إشعار عند التشغيل التالي.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا