Share Extension là một tiện ích mở rộng iOS giúp thêm ứng dụng của bạn vào menu Chia sẻ hệ thống. Người dùng có thể gửi nội dung từ Safari, Ảnh, Tệp hoặc bất kỳ ứng dụng nào khác trực tiếp đến ứng dụng của bạn — mà không cần sao chép hay chuyển đổi giữa các cửa sổ. Theo Apple (2024), các ứng dụng có Share Extension nhận được nhiều hơn 35% nội dung người dùng so với các ứng dụng không có khả năng chia sẻ. Tiện ích mở rộng xử lý văn bản, hình ảnh, video, URL và tệp thông qua giao diện NSExtensionItem thống nhất.
Những điểm chính
Share Extension là một loại tiện ích mở rộng ứng dụng iOS xuất hiện trong menu Chia sẻ hệ thống khi chọn nội dung trong bất kỳ ứng dụng nào. Người dùng đánh dấu văn bản trong Safari, nhấn Chia sẻ và thấy ứng dụng của bạn trong danh sách các hành động có sẵn. Sau khi chọn, nội dung được chuyển đến tiện ích mở rộng để xử lý: lưu, xuất bản, gửi hoặc chuyển đổi.
Không giống như Action Extension, Share Extension chuyên về nhận nội dung từ các ứng dụng bên ngoài. Action Extension ngược lại gửi dữ liệu từ ứng dụng của bạn ra ngoài. Share Extension là điểm vào của nội dung người dùng, một yếu tố chính trong việc thu hút người dùng: người dùng dùng thử ứng dụng của bạn qua Share Extension mà không cần cài đặt đầy đủ. App Store cấm các ứng dụng có chức năng duy nhất là hiển thị quảng cáo qua Share Extension (App Store Review Guideline 4.2).
Share Extension giảm rào cản gia nhập: người dùng gửi nội dung đến ứng dụng của bạn từ một ngữ cảnh quen thuộc — trình duyệt, thư viện, trình quản lý tệp. Theo Branch (2024), các ứng dụng có Share Extension cho thấy tỷ lệ giữ chân cao hơn 28% vào ngày thứ 7. Một hiệu ứng bổ sung là tính lan truyền: mỗi lần người dùng nhìn thấy ứng dụng của bạn trong trang Chia sẻ, việc xây dựng thương hiệu thụ động diễn ra mà không tốn chi phí quảng cáo.
Cơ chế Share Extension dựa trên việc truyền nội dung qua các vùng chứa NSExtensionItem hệ thống. Ứng dụng chủ (Safari, Ảnh) đóng gói nội dung đã chọn vào NSExtensionItem với một loại được chỉ định (public.image, public.url, public.plain-text). Hệ thống chuyển vùng chứa này đến tiện ích mở rộng, nơi trích xuất dữ liệu qua extensionContext.inputItems.
Share Extension chạy trong một tiến trình riêng biệt với thời gian thực thi giới hạn — khoảng 30 giây để xử lý. Tiện ích mở rộng không nên thực hiện các thao tác đồng bộ dài. Để tải tệp lớn lên, hãy sử dụng NSURLSession với cấu hình nền. SLComposeServiceViewController là lớp cơ sở cho Share Extension với tính năng xem trước nội dung và nút gửi.
iOS sử dụng Uniform Type Identifiers (UTI) để xác định loại nội dung đang được truyền. Các UTI chính cho Share Extension: public.image (ảnh, ảnh chụp màn hình), public.url (liên kết), public.plain-text (văn bản), public.video (tệp video) và public.file-url (tệp). Tiện ích mở rộng đăng ký các UTI được hỗ trợ trong Info.plist qua khóa NSExtensionActivationRule.
Share Extension bao gồm ba thành phần: target trong Xcode, SLComposeServiceViewController và cấu hình Info.plist. Kiến trúc xác định loại nội dung nào được xử lý, giao diện hiển thị như thế nào và dữ liệu được lưu ở đâu.
| Thành phần | Mục đích | Đặc điểm |
|---|---|---|
| Target | Target tiện ích mở rộng trong Xcode | Bundle riêng biệt với định danh |
| ViewController | Giao diện và logic xử lý | SLComposeServiceViewController hoặc tùy chỉnh |
| Info.plist | Cấu hình kích hoạt và UTI | NSExtensionActivationRule với vị từ |
| App Groups | Bộ nhớ dùng chung với ứng dụng | UserDefaults suite để truyền dữ liệu |
Yếu tố cấu hình chính của Share Extension là quy tắc kích hoạt. Nó xác định trong điều kiện nào tiện ích mở rộng xuất hiện trong trang Chia sẻ. Quy tắc được đặt trong Info.plist dưới dạng từ điển với các ràng buộc: số lượng ảnh tối đa, độ dài văn bản tối thiểu, sự hiện diện bắt buộc của URL. Quy tắc tiêu chuẩn kích hoạt tiện ích mở rộng cho bất kỳ một loại nội dung nào.
// Info.plist — NSExtensionActivationRule cho Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Hãy xem một ví dụ thực tế về việc tạo Share Extension bằng Swift cho ứng dụng đánh dấu trang. Tiện ích mở rộng nhận URL từ Safari, hiển thị giao diện xem trước và lưu liên kết vào App Group. SLComposeServiceViewController cung cấp giao diện người dùng có sẵn với trường văn bản và nút Đăng.
import Social
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController {
override func isContentValid() -> Bool {
return !(contentText?.isEmpty() ?? true)
}
override func didSelectPost() {
guard let item = extensionContext?.inputItems.first as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(forTypeIdentifier: kUTTypeURL as String) {
[weak self] (item, error) in
if let url = item as? URL {
BookmarkService().save(url, title: self?.contentText)
}
self?.extensionContext?.completeRequest(
returningItems: [], completionHandler: nil)
}
}
}
}
Sau khi gửi nội dung, tiện ích mở rộng kết thúc bằng cách gọi completeRequest — đây là bước bắt buộc; nếu không có nó, hệ thống sẽ không giải phóng tiến trình tiện ích mở rộng. Quan trọng: Share Extension chạy trong môi trường giới hạn với quyền truy cập mạng và hệ thống tệp bị hạn chế — hãy sử dụng phiên nền để tải nội dung lên.
Share Extension phải xử lý chính xác các loại dữ liệu đầu vào khác nhau: văn bản, hình ảnh, video, URL và tệp. Mỗi loại sử dụng UTI và phương pháp trích xuất riêng. Xử lý phổ quát — lặp qua attachment.attachments với kiểm tra hasItemConformingToTypeIdentifier.
Hình ảnh được truyền dưới dạng public.image với khả năng truy xuất qua UIImage hoặc Data. Đối với hình ảnh lớn, hãy sử dụng jpegData(compressionQuality:) trước khi lưu. Share Extension không nên sửa đổi hình ảnh gốc nếu không có sự cho phép rõ ràng của người dùng. Nên lưu ảnh gốc trong App Group và tạo bản xem trước để hiển thị trong giao diện.
Safari và các trình duyệt khác truyền URL dưới dạng public.url và văn bản đã chọn dưới dạng public.plain-text. Một NSExtensionItem đơn lẻ có thể chứa cả hai loại cùng lúc — URL của trang và văn bản được chọn trên đó. Share Extension nên kiểm tra tất cả các tệp đính kèm và trích xuất dữ liệu liên quan. Kịch bản kết hợp: lưu URL làm dấu trang và văn bản làm ghi chú đính kèm.
Share Extension và ứng dụng chính chạy trong các tiến trình khác nhau và không có quyền truy cập chia sẻ vào hệ thống tệp. Trao đổi dữ liệu sử dụng cơ chế App Groups: một vùng chứa dùng chung với định danh group.*. Sau khi lưu dữ liệu trong App Group, tiện ích mở rộng thông báo cho ứng dụng qua CFNotificationCenter hoặc Darwin Notify.
App Groups được bật trong Capabilities của target: chọn App Groups và thêm định danh (ví dụ: group.com.example.myapp). Cả hai target — ứng dụng chính và tiện ích mở rộng — phải có quyền truy cập vào cùng một nhóm. UserDefaults suite cho phép đọc và ghi dữ liệu vào bộ nhớ dùng chung với chi phí tối thiểu.
// Lưu dữ liệu vào App Group từ Share Extension
let sharedDefaults = UserDefaults(suiteName: "group.com.example.myapp")
let bookmark: [String: Any] = [
"url": url.absoluteString,
"title": contentText ?? "",
"date": Date().timeIntervalSince1970
]
sharedDefaults?.set(bookmark, forKey: "bookmark_\(Date().timeIntervalSince1970)")
sharedDefaults?.synchronize()
Các câu hỏi thường gặp
Share Extension nhận nội dung từ các ứng dụng khác vào ứng dụng của bạn. Action Extension ngược lại thực hiện hành động trên nội dung trong ứng dụng chủ — dịch văn bản, sửa đổi hình ảnh. Share Extension là nhận, Action Extension là chuyển đổi.
Điều này phụ thuộc vào loại nội dung mà ứng dụng của bạn xử lý. Đối với dấu trang — public.url. Đối với trình chỉnh sửa ảnh — public.image. Đối với ghi chú — public.plain-text. Đối với nhiều loại, hãy sử dụng NSExtensionActivationRule với kết hợp các vị từ AND/OR.
Nguyên nhân phổ biến là NSExtensionActivationRule không chính xác hoặc UTI không khớp. Kiểm tra trong Info.plist: quy tắc kích hoạt phải khớp với loại nội dung đang thử nghiệm. Cũng đảm bảo tiện ích mở rộng được bật trong Cài đặt → ứng dụng của bạn → Siri & Tìm kiếm. Xcode clean build thường giải quyết vấn đề.
Hệ thống phân bổ khoảng 30 giây để thực thi. Sau đó, iOS buộc kết thúc tiến trình tiện ích mở rộng. Đối với các thao tác dài, hãy sử dụng NSURLSession nền và xử lý kết quả ở lần khởi chạy ứng dụng tiếp theo.
Có, thay vì SLComposeServiceViewController bạn có thể sử dụng UIViewController thông thường. Trong trường hợp này, bạn kiểm soát hoàn toàn giao diện. Tuy nhiên, bạn cần tự triển khai các nút gửi và hủy. Giao diện tùy chỉnh được khuyến nghị cho các kịch bản xử lý nội dung không chuẩn.
Tóm tắ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