Entitlements là các quyền và cho phép kỹ thuật số được gán cho ứng dụng trong giai đoạn ký mã và xác định quyền truy cập vào các tính năng được bảo vệ của hệ điều hành Apple. Không giống như quyền của người dùng, Entitlements được hệ thống kiểm tra khi khởi động ứng dụng và người dùng không thể thay đổi. Theo Tài liệu dành cho nhà phát triển Apple (2025), cấu hình Entitlements chính xác là bắt buộc để sử dụng iCloud, Push Notifications và App Groups. Entitlements là yếu tố chính của mô hình bảo mật iOS và macOS.
Những điểm chính
Entitlements (dịch từ tiếng Anh là “quyền”) là các cặp khóa-giá trị được bao gồm trong chữ ký mã của ứng dụng tại thời điểm xây dựng và xác định ứng dụng có thể truy cập vào những khả năng và dữ liệu hệ thống nào. Entitlements đã được tích hợp vào mô hình bảo mật của Apple từ khi giới thiệu iOS SDK và là bắt buộc đối với tất cả các ứng dụng được phân phối qua App Store.
Khái niệm Entitlements khác với các quyền truyền thống trên Android. Trong khi quyền của Android được yêu cầu từ người dùng tại thời điểm sử dụng tính năng lần đầu tiên, Entitlements trong iOS được hệ thống xác minh khi khởi động ứng dụng dựa trên chữ ký số. Người dùng không thể thu hồi hoặc thay đổi entitlement — quyền này được cấp cho nhà phát triển thông qua App Store Connect và được nhúng trong hồ sơ cấp phép.
Mỗi entitlement có mục đích và định dạng được xác định chặt chẽ. Ví dụ, com.apple.security.application-groups cho phép truy cập vào vùng chứa dùng chung cho một tập hợp các ứng dụng của cùng một nhà phát triển, trong khi aps-environment kích hoạt hỗ trợ Push Notifications. Apple xem xét thủ công các yêu cầu entitlement trong quá trình App Review, ngăn chặn việc lạm dụng quyền.
Entitlements được phân loại theo mục đích chức năng thành nhiều danh mục. Dịch vụ hệ thống — iCloud, Push Notifications, Siri. Bảo mật và dữ liệu — Keychain Access Groups, App Groups, Data Protection. Mạng và truyền thông — Multipath TCP, VPN, Hotspot Configuration. Khả năng phần cứng — Máy ảnh, Micrô, Bluetooth (thông qua các capabilities liên quan).
Xcode nhóm các entitlements liên quan thành Capabilities — các công tắc cấp cao trên tab Signing & Capabilities. Bật Capability sẽ tự động thêm các entitlements cần thiết vào tệp .entitlements. Ví dụ: bật Capability Push Notifications sẽ thêm entitlement aps-environment với giá trị development hoặc production, trong khi bật iCloud sẽ thêm một tập hợp entitlements cho CloudKit và bộ nhớ Key-Value.
Một số capabilities yêu cầu cấu hình bổ sung trên cổng Apple Developer. Ví dụ: App Groups yêu cầu đăng ký định danh nhóm trên cổng, sau đó nó có sẵn để chọn trong Xcode. Đối với Push Notifications, cần tạo khóa hoặc chứng chỉ APNs. Nếu không có các bước chuẩn bị này, entitlement sẽ không hoạt động ngay cả khi có tệp .entitlements chính xác.
Entitlement com.apple.security.application-groups cho phép nhiều ứng dụng của cùng một nhà phát triển chia sẻ một vùng chứa chung trên hệ thống tệp. Nó được sử dụng để chia sẻ dữ liệu giữa ứng dụng chính và các tiện ích mở rộng (Widget, Watch App, Share Extension). Tất cả các ứng dụng trong cùng một nhóm có thể đọc và ghi tệp trong thư mục dùng chung /Library/Group Containers/.
Keychain Access Groups (khóa keychain-access-groups) là một entitlement quan trọng khác cho phép các ứng dụng trong cùng một nhóm chia sẻ quyền truy cập vào các mục Keychain. Điều này rất quan trọng để triển khai đăng nhập một lần: người dùng đăng nhập vào một ứng dụng và tự động có quyền truy cập vào cùng một tài khoản trong ứng dụng khác mà không cần nhập lại mật khẩu.
Cấu hình Entitlements được thực hiện trong Xcode trên tab Signing & Capabilities trong cài đặt target. Nhà phát triển chọn Capabilities cần thiết từ danh sách và Xcode tự động tạo hoặc cập nhật tệp .entitlements. Tệp này được lưu trữ trong dự án ở định dạng XML với cấu trúc plist và chứa tất cả các khóa entitlement cho target đó.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example.shared</string>
</array>
<key>aps-environment</key>
<string>development</string>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.example.keychain</string>
</array>
</dict>
</plist>
Khi tạo tệp entitlement thủ công, điều quan trọng là phải tuân theo định dạng khóa và tiền tố. Entitlements của Apple sử dụng kiểu tên miền đảo ngược (com.apple.*). Entitlements tùy chỉnh cho mục đích riêng cũng có thể nhưng phải được đăng ký trên cổng nhà phát triển. Xcode cung cấp tính năng tự động hoàn thành cho tất cả các khóa entitlement tiêu chuẩn.
Để gỡ lỗi Entitlements, hãy sử dụng lệnh codesign trong terminal macOS. Lệnh codesign -d --entitlements :- <đường_dẫn_ứng_dụng> hiển thị tất cả các entitlements mà ứng dụng đã được ký. Điều này hữu ích để chẩn đoán sự cố: nếu một entitlement bị thiếu trong đầu ra, ứng dụng sẽ không có quyền truy cập vào chức năng tương ứng bất kể cài đặt Xcode.
Mặc dù Xcode tự động tạo tệp entitlement khi bật Capabilities, các nhà phát triển giàu kinh nghiệm thường tạo hoặc chỉnh sửa nó thủ công để tinh chỉnh. Tệp có phần mở rộng .entitlements và định dạng plist (XML). Bạn có thể thêm các khóa entitlement tùy chỉnh không có trong giao diện Xcode hoặc kết hợp entitlements từ các capabilities khác nhau trong một tệp.
Khi chỉnh sửa thủ công, điều quan trọng là phải đảm bảo tính chính xác về cú pháp của XML. Lỗi trong cấu trúc plist sẽ khiến entitlements không được áp dụng khi ký. Xcode kiểm tra tệp .entitlements tại thời điểm biên dịch và đưa ra lỗi nếu định dạng không chính xác. Đối với các dự án phức tạp với nhiều target và tiện ích mở rộng, nên lưu trữ các khóa entitlement chung trong các tệp riêng biệt và nhập chúng thông qua Build Settings.
// cli: checking entitlements of an installed application
codesign -d --entitlements :- /Applications/Safari.app
// Example output contains a list of active entitlements
<dict>
<key>com.apple.security.ts.apple-wifi</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
Entitlements đóng vai trò quan trọng trong mô hình bảo mật của Apple. Vì entitlements là một phần của chữ ký số của ứng dụng, việc giả mạo chúng là không thể nếu không ký lại mã. Apple kiểm tra entitlements ở nhiều cấp độ: trong quá trình xây dựng, Xcode ký entitlements cùng với tệp thực thi; trong quá trình cài đặt, hệ thống kiểm tra tính toàn vẹn của chữ ký; khi khởi động, hệ thống xác minh lại entitlements.
Một yêu cầu bảo mật quan trọng là nguyên tắc entitlement tối thiểu. Nhà phát triển chỉ nên bao gồm những entitlements thực sự được sử dụng trong ứng dụng. Entitlements không cần thiết làm tăng bề mặt tấn công và có thể khiến ứng dụng bị từ chối trong App Review. Apple kiểm tra rõ ràng rằng entitlements phù hợp với chức năng của ứng dụng.
Một số entitlements được coi là nhạy cảm và yêu cầu phê duyệt bổ sung từ Apple. Chúng bao gồm: com.apple.developer.healthkit (HealthKit), com.apple.developer.passkit (Wallet), com.apple.developer.authentication-services.authentication (Sign in with Apple) và com.apple.developer.nfc.readersession.formats (NFC). Để có được các entitlements này, bạn phải chứng minh sự cần thiết của chúng trong quá trình App Review.
Khi làm việc với entitlements, điều quan trọng là phải xem xét sự khác biệt giữa iOS và macOS. Các ứng dụng máy tính để bàn macOS (Sandboxed) có tập hợp entitlements rộng hơn so với iOS. Ví dụ: entitlement com.apple.security.temporary-exception.* cho phép tạm thời vượt qua sandbox cho một số hoạt động nhất định — các entitlements như vậy hoàn toàn không có trên iOS.
Entitlements được liên kết chặt chẽ với Hồ sơ cấp phép (Provisioning Profiles). Hồ sơ cấp phép là một tệp liên kết chứng chỉ nhà phát triển, danh sách các thiết bị được phép và một tập hợp entitlements cho một ứng dụng cụ thể. Khi cài đặt ứng dụng, hệ thống so sánh entitlements trong mã với entitlements trong hồ sơ cấp phép. Nếu một entitlement có trong mã nhưng không có trong hồ sơ, ứng dụng sẽ không có quyền truy cập vào chức năng tương ứng.
Để chẩn đoán sự cố với entitlements, trước tiên hãy kiểm tra hồ sơ cấp phép. Xcode tự động tạo hồ sơ dựa trên các capabilities đã chọn trên cổng Apple Developer. Nếu một capability được thêm vào Xcode nhưng không hoạt động trên cổng, ứng dụng sẽ gặp sự cố với lỗi ký khi cố gắng sử dụng chức năng được bảo vệ.
Hãy xem xét các entitlements được sử dụng phổ biến nhất trong phát triển iOS. aps-environment (Push Notifications) — bắt buộc để gửi thông báo push. com.apple.developer.ubiquity-container-identifiers (iCloud) — để đồng bộ dữ liệu qua CloudKit. com.apple.security.application-groups — để chia sẻ dữ liệu giữa các ứng dụng và tiện ích mở rộng. com.apple.developer.associated-domains — cho Universal Links và Handoff.
Mỗi entitlements này có một quy trình cấu hình nghiêm ngặt. Push Notifications yêu cầu tạo khóa APNs trên cổng Apple Developer và bật capability trong Xcode. Sau đó, entitlement được tự động đặt trong tệp .entitlements. iCloud yêu cầu thiết lập vùng chứa trên cổng và chọn nó trong Xcode từ danh sách thả xuống.
Associated Domains — một entitlement liên kết ứng dụng với một tên miền web. Nó được sử dụng cho Universal Links (liên kết sâu mở trực tiếp trong ứng dụng) và Handoff (tiếp tục làm việc trên thiết bị Apple khác). Giá trị entitlement chứa một mảng các chuỗi ở định dạng applinks:example.com. Yêu cầu đặt tệp apple-app-site-association trên máy chủ.
Bảng các entitlements phổ biến và mục đích của chúng:
| Khóa Entitlement | Mục đích | Yêu cầu xem xét |
|---|---|---|
| aps-environment | Thông báo Push | Không |
| com.apple.developer.ubiquity-* | Đồng bộ iCloud | Không |
| application-groups | Vùng chứa ứng dụng dùng chung | Không |
| com.apple.developer.healthkit | Dữ liệu HealthKit | Có |
| com.apple.developer.nfc.* | Đọc thẻ NFC | Có |
| associated-domains | Universal Links | Không |
Câu hỏi thường gặp
Entitlements là các quyền tĩnh được nhúng trong chữ ký của ứng dụng và được hệ thống xác minh khi khởi động. Quyền là các cho phép động được yêu cầu từ người dùng trong thời gian chạy (máy ảnh, vị trí địa lý).
Sử dụng lệnh codesign -d --entitlements trong terminal macOS. Đối với ứng dụng App Store, entitlements được kiểm tra qua tiện ích ProvisionQL hoặc qua Xcode Organizer.
Thay đổi entitlements yêu cầu bản dựng mới và ký lại ứng dụng. Nếu entitlement yêu cầu phê duyệt của Apple, bạn sẽ cần phải trải qua App Review một lần nữa. Nếu không ký lại, không thể thay đổi entitlements.
Tệp .entitlements là một tài liệu XML ở định dạng plist được lưu trữ trong dự án Xcode. Nó chứa danh sách tất cả các entitlements của ứng dụng dưới dạng có cấu trúc và được ký cùng với tệp thực thi.
Capabilities là các công tắc cấp cao trên tab Signing & Capabilities trong Xcode. Bật một capability sẽ tự động thêm các entitlements tương ứng vào tệp .entitlements và cấu hình hồ sơ cấp phép.
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