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 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 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 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ểm | Action Extension | Share Extension |
|---|---|---|
| Mục đích | Biến đổi nội dung | Truyền nội dung đến ứng dụng |
| Giao diện | Tùy chọn (tùy chỉnh) | SLComposeServiceViewController |
| Trả về dữ liệu | Có, qua completeRequest | Không |
| Ngữ cảnh | Ở lại trong ứng dụng chủ | Chuyển sang tiện ích mở rộng |
| Vị trí menu | Action Sheet (phần trên) | Share Sheet (phần dưới) |
| Hành động điển hình | Dịch, hiệu chỉnh, bộ lọc | Lưu, xuất bản |
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.
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.
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ợ.
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.
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.
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ý.
// 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 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.
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.
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).
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.
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.
Đố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.
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
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.
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.
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.
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ự.
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
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.
Đọc thêm