Photo Editing Extension là cơ chế iOS cho phép các ứng dụng bên thứ ba thêm công cụ chỉnh sửa trực tiếp vào ứng dụng Ảnh hệ thống. Không giống như các trình chỉnh sửa đầy đủ tính năng, tiện ích mở rộng không tải ảnh vào ứng dụng riêng biệt — người dùng áp dụng bộ lọc, điều chỉnh màu sắc hoặc thêm hiệu ứng mà không cần rời khỏi giao diện tiêu chuẩn. Theo Tài liệu dành cho nhà phát triển Apple (2025), PhotoKit cung cấp hơn 40 API để làm việc với tài nguyên ảnh, bao gồm PHAdjustmentData và PHContentEditingController.
Những điểm chính
Photo Editing Extension là một loại tiện ích mở rộng ứng dụng trong iOS nhúng các công cụ xử lý ảnh vào giao diện tiêu chuẩn của ứng dụng Ảnh. Người dùng mở ảnh, nhấn nút Chỉnh sửa và chọn tiện ích mở rộng mong muốn từ danh sách đã cài đặt. Sau khi chỉnh sửa, kết quả được lưu lại vào thư viện và tệp gốc vẫn có sẵn để khôi phục.
Kiến trúc này giải quyết một vấn đề chính của trải nghiệm người dùng: không cần chuyển đổi giữa các ứng dụng, xuất và nhập ảnh, hay theo dõi phiên bản. Theo WWDC 2025, tất cả các tiện ích mở rộng chạy trong một tiến trình biệt lập với hộp cát riêng và thời gian thực thi giới hạn — lên đến 30 giây cho mỗi thao tác chỉnh sửa.
Tiện ích mở rộng không có quyền truy cập vào các tệp tùy ý trong bộ nhớ thiết bị — chỉ vào ảnh mà người dùng đã truyền một cách rõ ràng qua giao diện lựa chọn. Điều này đảm bảo an toàn dữ liệu người dùng khi sử dụng các công cụ của bên thứ ba.
PhotoKit là một framework của Apple để làm việc với thư viện phương tiện của thiết bị, được giới thiệu trong iOS 8. Nó cung cấp quyền truy cập lập trình vào các tài nguyên Ảnh, bao gồm ảnh, video, album và siêu dữ liệu. Đối với các tiện ích mở rộng chỉnh sửa, PhotoKit đóng vai trò là lớp trung gian giữa bộ nhớ và giao diện sửa đổi.
PHAsset đại diện cho một đối tượng phương tiện riêng lẻ trong thư viện — ảnh hoặc video. Thông qua PHAsset, bạn có thể lấy siêu dữ liệu: ngày chụp, loại tệp, vị trí trên bản đồ và hướng máy ảnh. PHAssetResource cung cấp quyền truy cập vào các tài nguyên cơ bản — ví dụ, vào tệp ảnh gốc ở định dạng RAW hoặc HEIC.
Đối với tiện ích mở rộng chỉnh sửa, PHContentEditingInput có tầm quan trọng then chốt — một đối tượng chứa tệp ảnh (hoặc video) đầy đủ có sẵn để đọc và xử lý. Tiện ích mở rộng nhận đối tượng này tại thời điểm kích hoạt và sử dụng nó làm vật liệu nguồn.
PHImageManager quản lý việc tải và lưu trữ đệm ảnh. Đối với tiện ích mở rộng chỉnh sửa, nó không được sử dụng trực tiếp — tiện ích mở rộng nhận tệp đầy đủ qua PHContentEditingInput. Tuy nhiên, PHImageRequestOptions cho phép bạn cấu hình các tham số yêu cầu: kích thước, loại phân phối (đồng bộ hoặc không đồng bộ) và định dạng kết quả.
Theo Apple, PHImageManager tự động lưu trữ đệm hình thu nhỏ ảnh trong RAM, giúp tăng tốc hiển thị xem trước lặp lại. Đối với tiện ích mở rộng chỉnh sửa, bạn nên sử dụng PHImageRequestOptionsDeliveryModeHighQualityFormat để có chất lượng ảnh tốt nhất.
let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.isSynchronous = true
PHImageManager.default().requestImage(
for: asset,
targetSize: .init(width: 1024, height: 1024),
contentMode: .aspectFill,
options: options
) { image, _ in
// use image for display
}
Mỗi Photo Editing Extension triển khai giao thức PHContentEditingController — thành phần điều khiển trung tâm của tiện ích mở rộng. Giao thức định nghĩa các phương thức để hiển thị giao diện, nhận dữ liệu đầu vào và lưu kết quả.
beginContentEditing(with:) được gọi khi phiên chỉnh sửa bắt đầu. Tiện ích mở rộng nhận PHContentEditingInput và phải hiển thị giao diện với ảnh gốc. finishContentEditing(completionHandler:) hoàn tất chỉnh sửa — tiện ích mở rộng trả về PHContentEditingOutput với tệp đã sửa đổi và AdjustmentData. cancelContentEditing() hủy các thay đổi mà không lưu.
Một sắc thái quan trọng: tại thời điểm gọi beginContentEditing, tiện ích mở rộng chỉ có quyền truy cập vào một phiên bản của ảnh — phiên bản mà người dùng đã yêu cầu. Nó không thể truy cập vào ảnh hoặc album khác. Đây là hạn chế của hộp cát do Apple đưa ra vì lý do bảo mật.
class PhotoEditingViewController: UIViewController {
override func beginContentEditing(
with input: PHContentEditingInput
) {
guard let url = input.fullSizeImageURL else { return }
let image = CIImage(contentsOf: url)
displayImage.image = UIImage(ciImage: image)
}
}
PHContentEditingController tách biệt giao diện chỉnh sửa khỏi logic lưu trữ. Tiến trình chính của iOS gọi beginContentEditing, tiện ích mở rộng hiển thị UI của nó, người dùng thực hiện thay đổi, sau đó finishContentEditing tạo tệp mới. Apple khuyên bạn nên thực hiện tất cả các xử lý tốn tài nguyên — bộ lọc CIFilter, thao tác Core Image — trong luồng nền, không phải luồng chính, để không chặn giao diện.
PHAdjustmentData là cơ chế chính cho phép chỉnh sửa không phá hủy trong Photo Editing Extension. Đây là một đối tượng chứa thông tin về các thay đổi đã áp dụng ở định dạng tùy ý. Tiện ích mở rộng tuần tự hóa các tham số bộ lọc, mặt nạ và cài đặt thành AdjustmentData và lưu chúng cùng với ảnh đã sửa đổi.
Khi mở lại ảnh, tiện ích mở rộng đọc AdjustmentData, khôi phục trạng thái giao diện trước đó và cho phép người dùng tiếp tục chỉnh sửa từ cùng một điểm. Nếu tiện ích mở rộng không được cài đặt, ảnh được hiển thị ở phiên bản đã lưu cuối cùng, trong khi bản gốc được lưu trữ riêng.
Theo Tài liệu Apple, PHAdjustmentData lưu trữ formatIdentifier và formatVersion — các chuỗi để xác định định dạng dữ liệu. Khi cập nhật tiện ích mở rộng, bạn nên kiểm tra phiên bản và xử lý chính xác các định dạng cũ.
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
Tại thời điểm finishContentEditing, tiện ích mở rộng ghi AdjustmentData vào đối tượng PHContentEditingOutput cùng với tệp ảnh đã sửa đổi. Hệ thống sau đó lưu cả hai thành phần: phiên bản để hiển thị và siêu dữ liệu để khôi phục phiên chỉnh sửa.
Photo Editing Extension tự động xuất hiện trong menu của ứng dụng Ảnh sau khi cài đặt ứng dụng chứa nó. Người dùng mở ảnh, chọn Chỉnh sửa, và ở hàng công cụ phía dưới, tất cả các tiện ích mở rộng chỉnh sửa đã cài đặt — cả hệ thống và bên thứ ba — được hiển thị.
Tiện ích mở rộng được đăng ký thông qua Info.plist của ứng dụng chính với khóa NSExtensionActivationRule, khóa này chỉ định loại nội dung nào kích hoạt tiện ích mở rộng. Đối với trình chỉnh sửa ảnh, ActivationRule thường yêu cầu image — tiện ích mở rộng sẽ không xuất hiện cho video hoặc Ảnh sống.
Apple khuyên bạn nên chỉ định các loại kích hoạt cụ thể để không làm quá tải menu chỉnh sửa. Nếu tiện ích mở rộng chỉ hỗ trợ JPEG và HEIC, bạn nên giới hạn kích hoạt ở các định dạng này.
<!-- Info.plist -->
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.photo-editing</string>
<key>NSExtensionActivationRule</key>
<string>SUBQUERY (extensionItems,
@count <= 1)</string>
</dict>
Sau khi chọn tiện ích mở rộng, iOS tạo một tiến trình riêng với UIViewController tùy chỉnh được hiển thị trên giao diện Ảnh. Người dùng thấy ảnh của mình, các công cụ của tiện ích mở rộng và các nút Hủy/Xong. Tiện ích mở rộng không thể thay đổi điều hướng bên ngoài bộ điều khiển của nó hoặc truy cập vào các phần khác của hệ thống.
Theo Nguyên tắc Giao diện Người dùng của Apple, giao diện tiện ích mở rộng phải tối giản và chức năng — không có quảng cáo, liên kết ngoài hoặc các yếu tố điều hướng không cần thiết. Bạn nên sử dụng UIScrollView để hiển thị bảng công cụ nhằm tránh làm lộn xộn màn hình.
Câu hỏi thường gặp
Tiện ích mở rộng nhận PHContentEditingInput với URL của tệp ảnh đầy đủ thông qua phương thức beginContentEditing(with:). Quyền truy cập chỉ được cấp cho một ảnh đã chọn — không có quyền đối với các tài nguyên thư viện khác.
Không, bản gốc không bao giờ bị sửa đổi. Tiện ích mở rộng tạo phiên bản mới thông qua PHContentEditingOutput, và AdjustmentData lưu trữ các tham số thay đổi để có thể khôi phục về trạng thái ban đầu.
Tiện ích mở rộng hoạt động với tất cả các định dạng được PhotoKit hỗ trợ: JPEG, HEIC, RAW, PNG, TIFF và Ảnh sống. Các giới hạn được đặt thông qua NSExtensionActivationRule trong Info.plist của tiện ích mở rộng.
iOS phân bổ tối đa 30 giây cho thao tác finishContentEditing. Nếu vượt quá giới hạn, tiện ích mở rộng bị buộc kết thúc và các thay đổi không được lưu. Xử lý nền với CIFilter không kéo dài thời gian này.
Có, Core Image (CIFilter) và Metal (cho shader tùy chỉnh) được hỗ trợ đầy đủ. Apple khuyên bạn nên chuyển các tính toán nặng sang các luồng nền thông qua Grand Central Dispatch.
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