App Group là một cơ chế iOS tạo ra một bộ chứa dùng chung để trao đổi dữ liệu giữa ứng dụng và các phần mở rộng của nó. Nếu không có nó, mỗi tiến trình (ứng dụng chính, widget, share extension) chạy trong một sandbox biệt lập và không thể truy cập dữ liệu của thành phần lân cận. Theo Apple Developer Documentation, 2026, App Group giải quyết vấn đề này thông qua một định danh nhóm duy nhất được chỉ định trong entitlements. Đây là một công cụ cơ bản để tạo ra trải nghiệm người dùng nhất quán trong hệ sinh thái iOS.
Những điểm chính
App Group là một cơ chế của hệ điều hành iOS cung cấp một khu vực lưu trữ dùng chung cho nhiều tiến trình của cùng một nhà phát triển. Nếu không có nó, mỗi phần mở rộng hoạt động trong sandbox riêng của nó và không thể đọc dữ liệu được ghi bởi thành phần khác. App Group giải quyết sự cô lập này bằng cách tạo một thư mục trên hệ thống tệp có thể truy cập cho tất cả các tiến trình có entitlement chính xác.
Định danh nhóm bắt đầu bằng tiền tố group. và được chỉ định trong tệp entitlements của dự án. Trong Xcode, định danh này được thêm qua Capabilities — hệ thống tự động đưa nó vào chữ ký của ứng dụng. Sau khi cấu hình, tất cả các thành viên trong nhóm có thể truy cập thư mục dùng chung tại Library/Application Support/ bên trong bộ chứa.
Theo Apple WWDC 2020 Session 10026, App Group bao gồm ba kịch bản chính: đồng bộ cài đặt qua NSUserDefaults, chia sẻ tệp qua FileManager và Core Data dùng chung với một kho lưu trữ duy nhất. Mỗi kịch bản chỉ yêu cầu chỉ định định danh nhóm trong API tương ứng.
iOS tạo bộ chứa dùng chung khi lần đầu tiên bất kỳ tiến trình nào có entitlement com.apple.security.application-groups chạy. Về mặt vật lý, bộ chứa nằm trong một thư mục hệ thống — đường dẫn của nó khác với sandbox của ứng dụng chính và các phần mở rộng, nhưng tất cả các tiến trình được ủy quyền đều có quyền đọc và ghi.
Apple đảm bảo bảo mật cho App Group thông qua sự kết hợp của team ID và chữ ký mã. Một tiến trình không được ký bằng cùng chứng chỉ nhà phát triển không thể truy cập bộ chứa nhóm. Điều này ngăn chặn rò rỉ dữ liệu giữa các ứng dụng của các nhà phát triển khác nhau.
Định dạng định danh: group.<team-id>.<name>. Ví dụ: group.ABC123DEFG.widget-data. Nhiều nhóm có thể được tạo trên một thiết bị, mỗi nhóm có tập thành viên riêng. Một ứng dụng có thể thuộc về nhiều App Group cùng lúc — điều này hữu ích để tách dữ liệu của các phần mở rộng khác nhau.
// Get the App Group container URL
guard let containerURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.widget")
else { return }
// Create a file in the shared container
let fileURL = containerURL.appendingPathComponent("shared.data")
try "Hello from main app".write(to: fileURL, atomically: true, encoding: .utf8)
FileManager cung cấp phương thức containerURL(forSecurityApplicationGroupIdentifier:) trả về URL của thư mục dùng chung. Điều quan trọng là gọi phương thức này riêng biệt trong mỗi tiến trình — đường dẫn vật lý giống nhau, nhưng mỗi tiến trình nhìn thấy nó qua lăng kính bảo mật riêng của nó.
Việc kích hoạt App Group trong Xcode bắt đầu với Capabilities — công tắc App Groups thêm entitlement vào dự án. Apple Developer Portal cũng yêu cầu định danh ứng dụng phải bao gồm khả năng này. Nếu không có nó, chữ ký mã sẽ không hoạt động trên thiết bị thật.
Mở dự án của bạn trong Xcode, chọn target ứng dụng và đi đến tab Signing & Capabilities. Nhấp + và chọn App Groups. Tạo một nhóm mới hoặc chọn nhóm hiện có. Lặp lại các bước tương tự cho mỗi phần mở rộng cần truy cập bộ chứa dùng chung. Tất cả người tham gia phải sử dụng cùng một định danh nhóm.
Sau khi kích hoạt Capabilities, Xcode tự động tạo một tệp .entitlements với khóa com.apple.security.application-groups và một mảng các định danh. Đảm bảo rằng tất cả các phần mở rộng cần thiết có tệp này với team ID chính xác trong định danh nhóm.
<!-- Example entitlements file -->
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example.shared</string>
</array>
Nếu dự án của bạn có nhiều phần mở rộng (Today Widget, Share Extension, Notification Service), mỗi phần phải có tệp entitlements riêng với cùng nhóm. Việc thiếu entitlements trên bất kỳ target nào là lý do phổ biến khiến phần mở rộng không nhìn thấy dữ liệu dùng chung.
Cách đơn giản nhất để đồng bộ dữ liệu giữa ứng dụng và các phần mở rộng của nó là UserDefaults với suite name. Thay vì UserDefaults.standard tiêu chuẩn, bạn tạo một phiên bản với định danh App Group và tất cả các tiến trình đọc cùng một cài đặt.
Theo Apple Human Interface Guidelines, cơ chế này phù hợp để đồng bộ trạng thái: chủ đề đã chọn, mục yêu thích, cờ onboarding. Tuy nhiên, nó không được thiết kế cho khối lượng dữ liệu lớn hoặc các thao tác ghi đồng thời — hãy sử dụng tệp hoặc Core Data cho những trường hợp đó.
// Write to UserDefaults App Group (main app)
let defaults = UserDefaults(suiteName: "group.com.example.shared")
defaults?.set(true, forKey: "isDarkMode")
defaults?.synchronize()
// Read from UserDefaults App Group (widget extension)
let sharedDefaults = UserDefaults(suiteName: "group.com.example.shared")
let isDark = sharedDefaults?.bool(forKey: "isDarkMode") ?? false
Lưu ý: phiên bản UserDefaults với suiteName được tạo riêng trong mỗi tiến trình nhưng đọc từ cùng một tệp plist trong bộ chứa dùng chung. Phương thức synchronize() đảm bảo ghi ngay lập tức vào đĩa — trong iOS 13+ có thể bỏ qua vì hệ thống đồng bộ dữ liệu định kỳ.
Đối với các kịch bản phức tạp hơn, App Group cung cấp quyền truy cập vào một hệ thống tệp dùng chung. Bất kỳ tệp nào được tạo trong thư mục bộ chứa đều có thể truy cập được cho tất cả các tiến trình trong nhóm. Điều này cho phép một cơ sở dữ liệu Core Data dùng chung, bộ nhớ đệm hình ảnh hoặc tệp tạm thời.
Để sử dụng kho lưu trữ Core Data dùng chung, hãy tạo một NSPersistentContainer với URL của tệp .sqlite nằm trong thư mục App Group. Đảm bảo rằng chỉ một tiến trình ghi vào cơ sở dữ liệu tại một thời điểm — ghi đồng thời có thể làm hỏng dữ liệu. Một kiến trúc điển hình: ứng dụng chính ghi, các phần mở rộng đọc.
// Setup Core Data with App Group container
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "SharedModel")
guard let appGroupURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.shared")
else { return container }
let storeURL = appGroupURL.appendingPathComponent("SharedModel.sqlite")
container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: storeURL)]
container.loadPersistentStores { _, error in
if let error = error { fatalError(error.localizedDescription) }
}
return container
}()
Một cách tiếp cận thay thế là bộ nhớ đệm hình ảnh dựa trên tệp. NSCache chỉ tồn tại trong bộ nhớ, nhưng thông qua App Group, bạn có thể lưu hình ảnh đã lưu vào bộ nhớ đệm trên đĩa trong thư mục dùng chung. Phần mở rộng widget có thể truy cập cùng các tệp và hiển thị dữ liệu cập nhật mà không cần tải xuống mạng bổ sung.
| Kịch bản | API được khuyến nghị | Kích thước dữ liệu |
|---|---|---|
| Cài đặt và cờ | UserDefaults suiteName | lên đến 1 KB |
| Bộ nhớ đệm hình ảnh | FileManager + NSCache | lên đến 100 MB |
| Dữ liệu có cấu trúc | Core Data store | lên đến 500 MB |
| Tệp tạm thời | FileManager tạm thời | lên đến 50 MB |
Khi làm việc với các tệp dùng chung, hãy nhớ rằng hệ thống có thể kết thúc phần mở rộng bất kỳ lúc nào. Sử dụng NSFileCoordinator để điều phối truy cập và tránh hỏng dữ liệu khi nhiều tiến trình ghi đồng thời.
Câu hỏi thường gặp
App Group là một cơ chế iOS tạo ra một bộ chứa dùng chung để lưu trữ dữ liệu giữa ứng dụng và các phần mở rộng của nó. Nó cho phép các tiến trình có cùng định danh nhóm trao đổi tệp, cài đặt UserDefaults và dữ liệu Core Data thông qua một thư mục duy nhất trên hệ thống tệp.
Mở Capabilities của target trong Xcode, kích hoạt App Groups và thêm định danh theo định dạng group.*. Sau đó lặp lại các bước tương tự cho mỗi phần mở rộng cần truy cập bộ chứa dùng chung. Đảm bảo tất cả người tham gia sử dụng cùng một định danh nhóm.
Tất cả các loại phần mở rộng iOS đều hỗ trợ App Group: Today Widget (phần mở rộng widget), Share Extension, Notification Service Extension, Custom Keyboard và các loại khác. Mỗi phần mở rộng phải có một tệp entitlements riêng với cùng định danh nhóm như ứng dụng chính.
Có, nhưng chỉ khi các ứng dụng được ký bằng cùng chứng chỉ nhà phát triển và có cùng team ID. Apple đảm bảo bảo mật thông qua chữ ký mã: hai ứng dụng từ các nhà phát triển khác nhau không thể truy cập cùng một bộ chứa ngay cả với định danh nhóm giống hệt nhau.
Sử dụng UserDefaults với suite name cho các cài đặt nhỏ, FileManager cho tệp và Core Data cho dữ liệu có cấu trúc. Tất cả các API này đều hoạt động với thư mục App Group — chỉ cần chỉ định định danh nhóm khi khởi tạo. Đối với Core Data, đảm bảo URL của kho lưu trữ trỏ đến thư mục dùng chung.
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