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 است: هیچ رابط compose اجباری وجود ندارد و افزونه می‌تواند کاملاً بدون UI کار کند.

اجزای Action Extension

Target — یک باندل جداگانه با شناسه‌ای که از برنامه اصلی به ارث رسیده است. 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 با داده‌های خروجی — سناریوی جایگزین، زمانی که افزونه UI را نشان نمی‌دهد و بلافاصله محتوای پردازش‌شده را بازمی‌گرداند.

swift
// بازگرداندن متن پردازش‌شده به برنامه میزبان
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 می‌تواند در دو حالت کار کند: با UI و بدون UI. در حالت بدون UI، افزونه اقدام را کاملاً در پس‌زمینه انجام می‌دهد و بلافاصله پس از پردازش completeRequest را فراخوانی می‌کند. در حالت با UI، افزونه یک کنترلر نشان می‌دهد، کاربر اقدام را تأیید می‌کند و تنها پس از آن completeRequest نتیجه را ارسال می‌کند. انتخاب حالت به پیچیدگی اقدام و نیاز به ورودی کاربر بستگی دارد.

بارگیری داده از پیوست

متد loadItem(forTypeIdentifier:) به صورت ناهمگام کار می‌کند — داده‌ها می‌توانند بزرگ باشند (تصاویر، ویدئو). NSItemProvider بارگیری جریانی و ذخیره‌سازی موقت را مدیریت می‌کند. برای تصاویر از kUTTypeImage، برای فایل‌ها از kUTTypeFileURL استفاده کنید. مهم: loadItem ممکن است در رشته فرعی پس‌زمینه فراخوانی شود — UI را فقط از طریق DispatchQueue.main به‌روزرسانی کنید.

بازگرداندن داده‌های تغییر یافته

Action Extension داده‌های پردازش‌شده را از طریق completeRequest با آرایه‌ای از NSExtensionItem بازمی‌گرداند. هر عنصر با نوع داده خروجی مطابقت دارد. برنامه میزبان می‌تواند محتوای اصلی را با محتوای پردازش‌شده جایگزین کند — مثلاً تصویر اصلی را با تصویر فیلترشده جایگزین کند. NSExtensionItem از همان UTIهای ورودی به علاوه موارد اضافی (مانند public.html برای محتوای وب) پشتیبانی می‌کند.

سناریوهای استفاده از Action Extension

Action Extension در ده‌ها سناریو به کار می‌رود — از ابزارهای ساده تا فرآیندهای تجاری پیچیده. نمونه‌های کلاسیک عملیات متنی، گرافیکی و فایلی و همچنین یکپارچه‌سازی با محتوای وب را شامل می‌شوند.

سناریوهای متنی

Action Extension برای متن: ترجمه، بررسی املا، شمارش کاراکترها، تغییر حروف، رمزگذاری، ایجاد کد QR از متن. کاربر متن را در هر برنامه‌ای با فیلد متنی (Safari، یادداشت‌ها، ایمیل) انتخاب می‌کند و با یک کلیک اقدام را انجام می‌دهد. برجسته‌سازی نحوی کد، قالب‌بندی 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، Photos، Files، Notes، Mail و هزاران برنامه شخص ثالث. Action Extension کار نمی‌کند در برنامه‌هایی که از مکانیزم‌های استاندارد iOS برای اقدامات استفاده نمی‌کنند.

چگونه محتوای پردازش‌شده را به برنامه میزبان بازگردانیم؟

از طریق extensionContext.completeRequest(returningItems:) با آرایه‌ای از NSExtensionItem. هر عنصر خروجی شامل NSItemProvider با داده‌های پردازش‌شده است. برنامه میزبان نتیجه را در نماینده UIActivityViewController یا callback مشابه دریافت می‌کند.

محدودیت‌های Action Extension چیست؟

افزونه تا 30 ثانیه کار می‌کند و پس از آن iOS به اجبار آن را خاتمه می‌دهد. دسترسی مستقیم به برنامه اصلی وجود ندارد — فقط از طریق App Groups. Action Extension نمی‌تواند وظایف پس‌زمینه را پس از اتمام انجام دهد. برای عملیات طولانی از NSURLSession پس‌زمینه با اعلان در راه‌اندازی بعدی استفاده کنید.

خلاصه

  • Action Extension — افزونه iOS برای تبدیل محتوا مستقیم در برنامه میزبان.
  • با Share Extension از طریق بازگرداندن داده‌های پردازش‌شده از طریق NSExtensionContext متفاوت است.
  • می‌تواند با UI یا کاملاً در پس‌زمینه بدون رابط کار کند.
  • از انواع محتوای متن، تصاویر، URL و فایل‌ها از طریق UTI پشتیبانی می‌کند.
  • برای ترجمه، فیلترها، تولید PDF، OCR و بررسی املا استفاده می‌شود.
  • محدودیت زمان اجرا — 30 ثانیه، دسترسی به برنامه — از طریق App Groups.
  • Action Extension در 42٪ از برنامه‌های دسته «بهره‌وری» استفاده می‌شود.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید