Action Extension: nó là gì, cách hoạt động và phát triển tiện ích mở rộng

Tác giả: IT Sectr Đã đăng: 2026-06-15 Thời gian đọc: 10 phút

Action Extension là một tiện ích mở rộng iOS thực hiện các hành động tùy chỉnh trên nội dung từ các ứng dụng khác mà không cần chuyển đổi ngữ cảnh. Không giống như Share Extension gửi dữ liệu đến ứng dụng khác, Action Extension biến đổi nội dung ngay tại chỗ: dịch văn bản, thay đổi bộ lọc hình ảnh, kiểm tra chính tả hoặc tạo PDF. Theo Apple (2024), Action Extension là loại tiện ích mở rộng phổ biến thứ hai sau Share Extension, được sử dụng trong 42% ứng dụng thuộc danh mục “Năng suất”. Hành động tức thì mà không cần khởi chạy ứng dụng chính là lợi thế chính cho người dùng.

Những điểm chính

  • Action Extension — tiện ích mở rộng iOS để biến đổi nội dung trong ứng dụng chủ.
  • NSExtensionContext — ngữ cảnh thực thi với dữ liệu đầu vào và đầu ra.
  • UTI — Uniform Type Identifiers để xác định loại nội dung đang xử lý.
  • UIActivity — cơ chế kế thừa để triển khai các hành động trong iOS 6–7.
  • App Groups — truyền dữ liệu đã xử lý trở lại ứng dụng.

Action Extension là gì

Action Extension là một loại tiện ích mở rộng ứng dụng iOS cho phép thực hiện các hành động trên nội dung trực tiếp trong ngữ cảnh của ứng dụng chủ. Người dùng chọn văn bản trong Safari, nhấn “Hành động” và chọn, ví dụ, “Kiểm tra chính tả” — tiện ích mở rộng xử lý văn bản và trả về kết quả mà không rời khỏi trình duyệt. Tiện ích mở rộng nhận dữ liệu đầu vào qua NSExtensionContext và có thể trả về nội dung đã sửa đổi.

Action Extension xuất hiện trong iOS 8 như một phần của kiến trúc tiện ích mở rộng ứng dụng. Đặc điểm chính của nó là tiện ích mở rộng không có giao diện riêng (tùy chọn) và chạy trong ngữ cảnh của ứng dụng chủ. Người dùng không rời khỏi màn hình hiện tại, đảm bảo ma sát nhận thức tối thiểu. Theo Apple, Action Extension là loại tiện ích mở rộng duy nhất có thể đồng thời đọc và sửa đổi nội dung của ứng dụng chủ (qua NSExtensionContext với trả về kết quả).

Action Extension được sử dụng ở đâu

Action Extension được sử dụng trong nhiều tình huống khác nhau: dịch văn bản trong trình duyệt, tạo PDF từ trang web, áp dụng bộ lọc cho ảnh trong thư viện, kiểm tra chính tả trong bất kỳ trường văn bản nào, rút ngắn URL, mã hóa văn bản và thêm dấu trang. Tính linh hoạt làm cho Action Extension trở thành công cụ phổ biến cho các ứng dụng thuộc danh mục “Tiện ích” và “Năng suất”.

Action Extension so với Share Extension

Action Extension và Share Extension thường bị nhầm lẫn, nhưng mục đích của chúng hoàn toàn khác nhau. Share Extension gửi nội dung từ ứng dụng chủ đến ứng dụng của bạn; Action Extension xử lý nội dung và trả về. Sự khác biệt ảnh hưởng đến kiến trúc, trải nghiệm người dùng và yêu cầu cấu hình Info.plist.

Đặc điểmAction ExtensionShare Extension
Mục đíchBiến đổi nội dungTruyền nội dung đến ứng dụng
Giao diệnTùy chọn (tùy chỉnh)SLComposeServiceViewController
Trả về dữ liệuCó, qua completeRequestKhông
Ngữ cảnhỞ lại trong ứng dụng chủChuyển sang tiện ích mở rộng
Vị trí menuAction Sheet (phần trên)Share Sheet (phần dưới)
Hành động điển hìnhDịch, hiệu chỉnh, bộ lọcLưu, xuất bản

Người dùng chọn hành động như thế nào

Action Extension xuất hiện trong menu hành động (Action Sheet) khi nhấn nút “Chia sẻ” hoặc “...”. iOS tự động đặt Action Extensions ở phần trên của sheet (hành động) và Share Extensions ở phần dưới (ứng dụng). Tình huống người dùng: đã chọn văn bản → nhấn “Hành động” → chọn Action Extension của bạn → nhận kết quả đã xử lý mà không cần chuyển đổi ứng dụng.

Kiến trúc Action Extension

Action Extension bao gồm một target trong Xcode, UIViewController để hiển thị giao diện (tùy chọn), NSExtensionContext để nhập/xuất dữ liệu và cấu hình Info.plist. Kiến trúc đơn giản hơn Share Extension: không có giao diện soạn thảo bắt buộc và tiện ích mở rộng có thể hoạt động hoàn toàn không có UI.

Các thành phần của Action Extension

Target — một bundle riêng biệt với định danh kế thừa từ ứng dụng chính. UIViewController — giao diện tùy chọn để hiển thị tiến trình, cài đặt hoặc kết quả. NSExtensionContext — một vùng chứa với dữ liệu đầu vào (inputItems) và phương thức completeRequest để trả về kết quả. Info.plist — cấu hình kích hoạt qua NSExtensionActivationRule và thuộc tính (NSExtensionAttributes) để chỉ định các loại nội dung được hỗ trợ.

NSExtensionContext và luồng dữ liệu

Action Extension nhận dữ liệu đầu vào qua extensionContext?.inputItems — một mảng NSExtensionItem. Mỗi mục chứa các tệp đính kèm với dữ liệu và UTI. Sau khi xử lý, tiện ích mở rộng gọi completeRequest(returningItems:) với một mảng NSExtensionItem đầu ra. Ứng dụng chủ nhận dữ liệu đã xử lý và hiển thị nó. Mô hình bất đồng bộ: tiện ích mở rộng có thể thực hiện các hoạt động dài, giữ ngữ cảnh trong tối đa 30 giây.

Tạo Action Extension

Hãy xem xét việc tạo Action Extension bằng Swift để dịch văn bản đã chọn. Tiện ích mở rộng nhận văn bản từ ứng dụng chủ, gửi đến máy chủ dịch thuật và trả về kết quả. ActionViewController là bộ điều khiển cơ bản được Xcode tạo khi thêm 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
                    }
                }
            }
        }
    }
}

Sau khi xử lý, tiện ích mở rộng trả về kết quả cho ứng dụng chủ. completeRequest với dữ liệu đầu ra là một tình huống thay thế trong đó tiện ích mở rộng không hiển thị UI mà trả về ngay nội dung đã xử lý.

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
)

Xử lý dữ liệu và trả về kết quả

Action Extension có thể hoạt động ở hai chế độ: có UI và không có UI. Ở chế độ không có UI, tiện ích mở rộng thực hiện hành động hoàn toàn trong nền và gọi completeRequest ngay sau khi xử lý. Ở chế độ có UI, tiện ích mở rộng hiển thị bộ điều khiển, người dùng xác nhận hành động và chỉ sau đó completeRequest mới gửi kết quả. Việc chọn chế độ phụ thuộc vào độ phức tạp của hành động và nhu cầu nhập liệu của người dùng.

Tải dữ liệu từ tệp đính kèm

Phương thức loadItem(forTypeIdentifier:) hoạt động bất đồng bộ — dữ liệu có thể lớn (hình ảnh, video). NSItemProvider quản lý phát trực tuyến và bộ nhớ đệm. Đối với hình ảnh, sử dụng kUTTypeImage, đối với tệp, sử dụng kUTTypeFileURL. Quan trọng: loadItem có thể được gọi trên luồng nền — chỉ cập nhật UI qua DispatchQueue.main.

Trả về dữ liệu đã sửa đổi

Action Extension trả về dữ liệu đã xử lý qua completeRequest với một mảng NSExtensionItem. Mỗi mục tương ứng với loại dữ liệu đầu ra. Ứng dụng chủ có thể thay thế nội dung gốc bằng nội dung đã xử lý — ví dụ: thay thế hình ảnh gốc bằng hình ảnh đã lọc. NSExtensionItem hỗ trợ các UTI giống như đầu vào, cộng với các UTI bổ sung (ví dụ: public.html cho nội dung web).

Các trường hợp sử dụng Action Extension

Action Extension được sử dụng trong hàng chục tình huống — từ các tiện ích đơn giản đến quy trình kinh doanh phức tạp. Các ví dụ cổ điển bao gồm các thao tác văn bản, đồ họa và tệp, cũng như tích hợp nội dung web.

Tình huống văn bản

Action Extension cho văn bản: dịch, kiểm tra chính tả, đếm ký tự, thay đổi chữ hoa/thường, mã hóa, tạo mã QR từ văn bản. Người dùng chọn văn bản trong bất kỳ ứng dụng nào có trường văn bản (Safari, Notes, Mail) và thực hiện hành động bằng một lần chạm. Tô sáng cú pháp mã, định dạng Markdown và rút ngắn URL là những ví dụ phổ biến về Action Extension cho người dùng nâng cao.

Tình huống đồ họa

Đối với hình ảnh, Action Extension cung cấp: áp dụng bộ lọc, cắt, thay đổi kích thước, chuyển đổi định dạng (HEIC sang JPEG), thêm hình mờ, nhận dạng văn bản (OCR) và nén. Xử lý hình ảnh phải nhanh — người dùng mong đợi kết quả trong vòng 2–3 giây. Đối với các hoạt động nặng, hãy sử dụng Core Image trên GPU hoặc hàng đợi nền.

Tình huống web

Action Extension cho URL: tạo PDF từ trang web, lưu vào Pocket/Pinterest, kiểm tra tốc độ trang web, lưu trữ trang, lấy siêu dữ liệu Open Graph, tạo ảnh chụp màn hình trang. Tạo PDF là một trong những tình huống được yêu cầu nhiều nhất: người dùng chuyển đổi trang web thành PDF mà không cần mở dịch vụ bên thứ ba.

Câu hỏi thường gặp

Sự khác biệt chính giữa Action Extension và Share Extension là gì?

Share Extension gửi nội dung từ ứng dụng chủ đến ứng dụng của bạn. Action Extension xử lý nội dung tại chỗ và trả về kết quả. Share — truyền dữ liệu, Action — biến đổi. Sự khác biệt cơ bản này xác định kiến trúc và UX.

Action Extension có thể không có giao diện không?

Có. Nếu hành động không yêu cầu nhập liệu từ người dùng (ví dụ: đếm ký tự), tiện ích mở rộng có thể thực hiện trong nền và trả về kết quả ngay lập tức qua completeRequest. Trong Info.plist, bạn cần chỉ định NSExtensionActivationSupportsWebURL hoặc UTI khác phù hợp với loại dữ liệu.

Action Extension xuất hiện trong những ứng dụng nào?

Trong bất kỳ ứng dụng nào hỗ trợ UIActivityViewController hoặc bộ điều khiển hành động tiêu chuẩn. Bao gồm Safari, Ảnh, Tệp, Ghi chú, Mail và hàng nghìn ứng dụng bên thứ ba. Action Extension không hoạt động trong các ứng dụng không sử dụng cơ chế hành động tiêu chuẩn của iOS.

Làm thế nào để trả về nội dung đã xử lý cho ứng dụng chủ?

Qua extensionContext.completeRequest(returningItems:) với một mảng NSExtensionItem. Mỗi mục đầu ra chứa NSItemProvider với dữ liệu đã xử lý. Ứng dụng chủ nhận kết quả trong ủy quyền UIActivityViewController hoặc callback tương tự.

Những giới hạn của Action Extension là gì?

Tiện ích mở rộng chạy tối đa 30 giây, sau đó iOS buộc kết thúc nó. Không có quyền truy cập trực tiếp vào ứng dụng chính — chỉ thông qua App Groups. Action Extension không thể thực hiện các tác vụ nền sau khi hoàn thành. Đối với các hoạt động dài, hãy sử dụng NSURLSession nền với thông báo khi khởi chạy tiếp theo.

Tổng kết

  • Action Extension — tiện ích mở rộng iOS để biến đổi nội dung trực tiếp trong ứng dụng chủ.
  • Khác với Share Extension ở chỗ trả về dữ liệu đã xử lý qua NSExtensionContext.
  • Có thể hoạt động với UI hoặc hoàn toàn trong nền mà không có giao diện.
  • Hỗ trợ tất cả các loại nội dung: văn bản, hình ảnh, URL, tệp qua UTI.
  • Được sử dụng để dịch, bộ lọc, tạo PDF, OCR và kiểm tra chính tả.
  • Giới hạn thời gian thực thi — 30 giây, truy cập ứng dụng — qua App Groups.
  • Action Extension được sử dụng trong 42% ứng dụng thuộc danh mục “Năng suất”.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm