App Group: khái niệm, tạo bộ chứa dùng chung và cấu hình truy cập

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

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 — một thư mục dùng chung trên hệ thống tệp iOS có thể truy cập bởi ứng dụng và các phần mở rộng của nó.
  • Định danh theo mẫu group.* và được thêm vào Capabilities của dự án Xcode.
  • UserDefaults với suite name cho phép đồng bộ cài đặt giữa các tiến trình mà không cần mã bổ sung.
  • Core Data qua App Group cho phép các phần mở rộng đọc và ghi dữ liệu vào cơ sở dữ liệu dùng chung với cấu hình Store URL chính xác.
  • Bảo mật được đảm bảo vì chỉ các tiến trình có cùng team ID và entitlement mới có thể truy cập bộ chứa.

App Group là gì?

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.

Bộ chứa dùng chung của App Group hoạt động như thế nào

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.

Quyền truy cập và bảo mật

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 danh nhóm

Đị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.

swift
// 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ó.

Thiết lập App Group trong Xcode

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.

Thiết lập từng bước

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.

Kiểm tra entitlements

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.

xml
<!-- 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.

Sử dụng UserDefaults với App Group

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 đó.

swift
// 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ỳ.

Truy cập dùng chung tệp và Core Data

Đố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.

Cấu hình Core Data với App Group

Để 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.

swift
// 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ảnAPI được khuyến nghịKích thước dữ liệu
Cài đặt và cờUserDefaults suiteNamelên đến 1 KB
Bộ nhớ đệm hình ảnhFileManager + NSCachelên đến 100 MB
Dữ liệu có cấu trúcCore Data storelên đến 500 MB
Tệp tạm thờiFileManager tạm thờilê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 trong iOS là gì?

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.

Làm thế nào để tạo App Group trong Xcode?

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.

Những phần mở rộng nào có thể sử dụng App Group?

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ó thể sử dụng App Group giữa các ứng dụng khác nhau không?

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.

Làm thế nào để đồng bộ dữ liệu qua App Group giữa ứng dụng và widget?

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

  • App Group là cách duy nhất để tổ chức trao đổi dữ liệu giữa ứng dụng iOS và các phần mở rộng của nó thông qua một bộ chứa dùng chung trên hệ thống tệp.
  • Định danh nhóm theo định dạng group.<team-id>.<name> và được thêm qua Capabilities Xcode với tệp entitlements bắt buộc cho mỗi target.
  • UserDefaults với suite name là phương pháp đơn giản nhất để đồng bộ cài đặt và cờ giữa các tiến trình mà không cần quản lý tệp.
  • Core Data với App Group yêu cầu chỉ định URL kho lưu trữ bên trong bộ chứa và điều phối truy cập giữa các tiến trình để tránh hỏng cơ sở dữ liệu.
  • FileManager.containerURL trả về đường dẫn đến thư mục dùng chung, giống nhau cho tất cả các tiến trình có entitlements chính xác.
  • Bảo mật dữ liệu được đảm bảo bằng xác minh team ID và chữ ký mã — chỉ các ứng dụng của cùng một nhà phát triển mới có thể truy cập bộ chứa dùng chung.
  • Đối với ghi đồng thời vào tệp dùng chung, hãy sử dụng NSFileCoordinator và để đồng bộ thay đổi giữa các tiến trình, hãy sử dụng Darwin Notifications hoặc CFNotificationCenter.

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