Action Extension: ما هو، كيف يعمل وتطوير الامتداد

المؤلف: IT Sectr نُشر: 2026-06-15 وقت القراءة: 10 دق

Action Extension هو امتداد iOS ينفذ إجراءات مخصصة على المحتوى من التطبيقات الأخرى دون تبديل السياق. على عكس Share Extension الذي يرسل البيانات إلى تطبيق آخر، يقوم Action Extension بتحويل المحتوى في مكانه: ترجمة النص، تغيير مرشحات الصورة، تدقيق الإملاء أو إنشاء PDF. وفقًا لـ Apple (2024)، Action Extension هو ثاني أكثر أنواع الامتدادات شيوعًا بعد Share Extension، المستخدم في 42% من التطبيقات في فئة “الإنتاجية”. الإجراء الفوري دون تشغيل التطبيق الرئيسي هو الميزة الرئيسية للمستخدم.

النقاط الرئيسية

  • Action Extension — امتداد iOS لتحويل المحتوى في التطبيق المضيف.
  • NSExtensionContext — سياق التنفيذ مع بيانات الإدخال والإخراج.
  • UTI — معرفات النوع الموحدة لتحديد نوع المحتوى المعالج.
  • UIActivity — آلية قديمة لتنفيذ الإجراءات في iOS 6–7.
  • App Groups — نقل البيانات المعالجة مرة أخرى إلى التطبيق.

ما هو Action Extension

Action Extension هو نوع من امتدادات iOS يسمح بتنفيذ إجراءات على المحتوى مباشرة في سياق التطبيق المضيف. يحدد المستخدم نصًا في Safari، ويضغط “إجراءات” ويختار، على سبيل المثال، “تدقيق الإملاء” — يقوم الامتداد بمعالجة النص وإرجاع النتيجة دون مغادرة المتصفح. يستقبل الامتداد بيانات الإدخال عبر NSExtensionContext ويمكنه إرجاع المحتوى المعدل.

ظهر Action Extension في iOS 8 كجزء من بنية امتدادات التطبيقات. ميزته الرئيسية هي أن الامتداد ليس له واجهة خاصة به (اختياري) ويعمل في سياق التطبيق المضيف. لا يغادر المستخدم الشاشة الحالية، مما يضمن أقل احتكاك معرفي. وفقًا لـ Apple، Action Extension هو النوع الوحيد من الامتدادات الذي يمكنه قراءة وتعديل محتوى التطبيق المضيف في وقت واحد (عبر NSExtensionContext مع إرجاع النتيجة).

أين يُستخدم Action Extension

يُستخدم Action Extension في سيناريوهات متنوعة: ترجمة النص في المتصفح، إنشاء PDF من صفحة ويب، تطبيق مرشح على صورة في المعرض، تدقيق الإملاء في أي حقل نصي، تقصير URL، تشفير النص وإضافة إشارات مرجعية. التنوع يجعل Action Extension أداة شائعة لتطبيقات فئتي “الأدوات المساعدة” و“الإنتاجية”.

Action Extension مقابل Share Extension

غالبًا ما يتم الخلط بين Action Extension وShare Extension، لكن أغراضهما مختلفة جوهريًا. Share Extension يرسل المحتوى من التطبيق المضيف إلى تطبيقك؛ Action Extension يعالج المحتوى ويعيده. الفرق يؤثر على البنية وتجربة المستخدم ومتطلبات تكوين Info.plist.

الخاصيةAction ExtensionShare Extension
الغرضتحويل المحتوىنقل المحتوى إلى التطبيق
الواجهةاختياري (مخصص)SLComposeServiceViewController
إرجاع البياناتنعم، عبر completeRequestلا
السياقيبقى في التطبيق المضيفينتقل إلى الامتداد
الموضع في القائمةAction Sheet (الجزء العلوي)Share Sheet (الجزء السفلي)
الإجراء النموذجيترجمة، تصحيح، مرشححفظ، نشر

كيف يختار المستخدم الإجراء

يظهر Action Extension في قائمة الإجراءات (Action Sheet) عند الضغط على زر “مشاركة” أو “...”. يضع iOS تلقائيًا Action Extensions في الجزء العلوي من الورقة (الإجراءات) وShare Extensions في الجزء السفلي (التطبيقات). سيناريو المستخدم: حدد نصًا → ضغط “إجراءات” → اختار Action Extension الخاص بك → استلم النتيجة المعالجة دون تبديل التطبيقات.

هندسة Action Extension

يتكون Action Extension من target في Xcode، وUIViewController لعرض الواجهة (اختياري)، وNSExtensionContext لإدخال/إخراج البيانات، وتكوين Info.plist. الهندسة أبسط من Share Extension: لا توجد واجهة تأليف إلزامية ويمكن للامتداد العمل بالكامل بدون واجهة مستخدم.

مكونات Action Extension

Target — bundle منفصل بمعرف موروث من التطبيق الرئيسي. UIViewController — واجهة اختيارية لعرض التقدم أو الإعدادات أو النتائج. NSExtensionContext — حاوية ببيانات الإدخال (inputItems) وطريقة completeRequest لإرجاع النتائج. Info.plist — تكوين التنشيط عبر NSExtensionActivationRule والسمات (NSExtensionAttributes) لتحديد أنواع المحتوى المدعومة.

NSExtensionContext وتدفقات البيانات

يستقبل Action Extension بيانات الإدخال عبر extensionContext?.inputItems — مصفوفة من NSExtensionItem. يحتوي كل عنصر على مرفقات ببيانات وUTI. بعد المعالجة، يستدعي الامتداد completeRequest(returningItems:) مع مصفوفة من NSExtensionItem للإخراج. يستقبل التطبيق المضيف البيانات المعالجة ويعرضها. نموذج غير متزامن: يمكن للامتداد تنفيذ عمليات طويلة، مع الاحتفاظ بالسياق لمدة تصل إلى 30 ثانية.

إنشاء Action Extension

لنلقِ نظرة على إنشاء Action Extension بلغة Swift لترجمة النص المحدد. يستقبل الامتداد نصًا من التطبيق المضيف، ويرسله إلى خادم الترجمة، ويعيد النتيجة. ActionViewController هو وحدة التحكم الأساسية التي ينشئها Xcode عند إضافة target.

swift
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 مع بيانات الإخراج هو سيناريو بديل حيث لا يظهر الامتداد واجهة مستخدم بل يعيد المحتوى المعالج فورًا.

swift
// 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 في عشرات السيناريوهات — من الأدوات البسيطة إلى سير العمل التجاري المعقد. الأمثلة الكلاسيكية تغطي عمليات النصوص والرسومات والملفات، بالإضافة إلى تكامل المحتوى الويب.

سيناريوهات النص

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 دون فتح خدمات طرف ثالث.

الأسئلة الشائعة

ما الفرق الرئيسي بين Action Extension وShare Extension؟

Share Extension يرسل المحتوى من التطبيق المضيف إلى تطبيقك. Action Extension يعالج المحتوى في مكانه ويعيد النتيجة. Share — نقل، Action — تحويل. هذا الفرق الأساسي يحدد البنية وتجربة المستخدم.

هل يمكن لـ Action Extension ألا يكون له واجهة؟

نعم. إذا كان الإجراء لا يتطلب إدخال من المستخدم (مثل عدد الأحرف)، يمكن للامتداد تنفيذه في الخلفية وإرجاع النتيجة فورًا عبر completeRequest. في Info.plist يجب تحديد NSExtensionActivationSupportsWebURL أو UTI آخر يطابق نوع البيانات.

في أي التطبيقات يظهر Action Extension؟

في أي تطبيقات تدعم UIActivityViewController أو وحدات التحكم القياسية للإجراءات. تشمل هذه Safari، الصور، الملفات، الملاحظات، البريد وآلاف التطبيقات الخارجية. Action Extension لا يعمل في التطبيقات التي لا تستخدم آليات الإجراءات القياسية في iOS.

كيف يتم إرجاع المحتوى المعالج إلى التطبيق المضيف؟

عبر extensionContext.completeRequest(returningItems:) مع مصفوفة من NSExtensionItem. كل عنصر إخراج يحتوي على NSItemProvider مع البيانات المعالجة. يستقبل التطبيق المضيف النتيجة في مفوض UIActivityViewController أو رد اتصال مشابه.

ما هي قيود Action Extension؟

يعمل الامتداد لمدة تصل إلى 30 ثانية، وبعدها ينهيه iOS قسرًا. لا يوجد وصول مباشر للتطبيق الرئيسي — فقط عبر App Groups. لا يمكن لـ Action Extension تنفيذ مهام خلفية بعد الانتهاء. للعمليات الطويلة، استخدم NSURLSession الخلفي مع إشعار عند التشغيل التالي.

الملخص

  • Action Extension — امتداد iOS لتحويل المحتوى مباشرة في التطبيق المضيف.
  • يختلف عن Share Extension بإرجاع البيانات المعالجة عبر NSExtensionContext.
  • يمكن أن يعمل مع واجهة مستخدم أو بالكامل في الخلفية بدون واجهة.
  • يدعم جميع أنواع المحتوى: النص، الصور، URL، الملفات عبر UTI.
  • يُستخدم للترجمة، المرشحات، إنشاء PDF، OCR وتدقيق الإملاء.
  • حد وقت التنفيذ — 30 ثانية، الوصول للتطبيق — عبر App Groups.
  • Action Extension يُستخدم في 42% من تطبيقات فئة “الإنتاجية”.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا