Provisioning Profile liên kết chứng chỉ nhà phát triển, định danh ứng dụng và danh sách thiết bị được phép để ký mã các ứng dụng iOS. Theo Apple Developer Documentation, 2026, hồ sơ là cần thiết cho bất kỳ lần chạy ứng dụng nào trên thiết bị vật lý — nếu không có nó Xcode không thể cài đặt bản dựng trên iPhone hoặc iPad. Bài viết này sẽ trình bày cấu trúc, các loại và quy trình tạo hồ sơ.
Điểm Chính
Provisioning Profile là một tệp cấu hình kỹ thuật số ở định dạng .mobileprovision (cho iOS) hoặc .provisionprofile (cho macOS) mà Apple sử dụng để kiểm soát việc cài đặt và chạy ứng dụng trên các thiết bị. Hồ sơ chứa siêu dữ liệu ký mã, nếu không có nó thì ứng dụng không thể chạy trên iPhone, iPad hoặc Apple Watch vật lý — trình mô phỏng không yêu cầu hồ sơ vì mã không được ký để chạy trên bộ vi xử lý thực.
Hồ sơ được cấp qua Apple Developer Portal và có ngày hết hạn — thường là một năm đối với hồ sơ Development và Distribution. Theo chính sách Apple, hồ sơ tự động liên kết với chứng chỉ Apple Developer Program mà nó được ký: nếu chứng chỉ bị thu hồi hoặc hết hạn, hồ sơ ngừng hoạt động.
Mỗi hồ sơ chứa một UUID duy nhất mà Xcode sử dụng để nhận dạng hồ sơ trong chuỗi khóa. Xcode tự động chọn hồ sơ phù hợp khi xây dựng, nhưng nhà phát triển có thể ghi đè lựa chọn trong cài đặt Signing & Capabilities. Có thể cài đặt không giới hạn số lượng hồ sơ trên một thiết bị — hệ thống quản lý thiết bị di động (MDM) của Apple sử dụng điều này để phân phối ứng dụng doanh nghiệp.
Ký mã là lý do chính khiến hồ sơ tồn tại. Apple yêu cầu mỗi ứng dụng chạy trên thiết bị iOS phải được ký bằng chứng chỉ do Apple cấp. Provisioning Profile đóng vai trò là cầu nối: nó xác nhận rằng nhà phát triển có quyền chạy ứng dụng trên thiết bị đó. Theo Apple Security Guide (2025), cơ chế hồ sơ ngăn chặn việc cài đặt phần mềm độc hại trên thiết bị người dùng ngay cả khi chứng chỉ nhà phát triển bị xâm phạm.
Hồ sơ cũng xác định dịch vụ hệ thống nào khả dụng cho ứng dụng. Nếu ứng dụng sử dụng thông báo Push, Apple Push Notification service (APNs) yêu cầu entitlements chính xác trong hồ sơ. Nếu không, thông báo từ máy chủ sẽ không được gửi đến thiết bị. Quy tắc tương tự áp dụng cho iCloud, App Groups, Wallet, HealthKit và các framework Apple khác.
Các nhà phát triển thường nhầm lẫn Provisioning Profile với Chứng chỉ Apple. Chứng chỉ là tài liệu kỹ thuật số xác nhận danh tính (ai ký), còn hồ sơ là cấu hình (ứng dụng nào, trên thiết bị nào, với quyền nào). Một chứng chỉ có thể được sử dụng trong nhiều hồ sơ, và một hồ sơ gắn với chính xác một chứng chỉ. Apple khuyên bạn nên tạo hồ sơ riêng cho từng ứng dụng và từng kịch bản — Development, Ad Hoc, App Store.
Quy trình ký ứng dụng bao gồm một số bước tuần tự. Xcode lấy tệp nhị phân ứng dụng (App Bundle), ký nó bằng khóa riêng của nhà phát triển, nhúng Provisioning Profile vào đó và gửi đến thiết bị. Thiết bị xác minh chữ ký bằng khóa công khai của Apple, so sánh UUID hồ sơ với danh sách hồ sơ đáng tin cậy trong hệ thống và chạy ứng dụng chỉ khi tất cả kiểm tra thành công.
Khi người dùng tải ứng dụng từ App Store, cơ chế khác. App Store Connect ký lại ứng dụng bằng chứng chỉ Distribution của riêng Apple, thay thế hồ sơ nhà phát triển bằng hồ sơ Store. Điều này có nghĩa là ứng dụng được xuất bản qua App Store về mặt kỹ thuật được ký bởi Apple, không phải nhà phát triển — mặc dù chữ ký gốc của nhà phát triển được xác minh khi tải bản dựng lên App Store Connect.
Đối với phân phối Ad Hoc, hồ sơ đăng ký UDID thiết bị cụ thể mà ứng dụng được phép chạy. Tài khoản Apple Developer Program miễn phí giới hạn kiểm thử ở 100 thiết bị mỗi năm. Hồ sơ Enterprise (dành cho phân phối nội bộ trong tổ chức) không có giới hạn thiết bị nhưng yêu cầu đăng ký Apple Developer Enterprise Program đang hoạt động với chi phí $299 mỗi năm.
Thời hạn hiệu lực của Provisioning Profile là một năm kể từ ngày tạo. 30 ngày trước khi hết hạn, Apple bắt đầu gửi thông báo push đến nhà phát triển qua Xcode và Developer Portal. Nếu hồ sơ hết hạn, ứng dụng đã cài đặt tiếp tục hoạt động, nhưng không thể cài đặt bản dựng mới với hồ sơ đó. Xcode hiển thị lỗi ký mã với mã -402620394 khi cố gắng xây dựng với hồ sơ hết hạn. Apple khuyên nên thiết lập gia hạn tự động hồ sơ qua Xcode Accounts Preferences — khi đó Xcode gia hạn hồ sơ 24 giờ trước khi hết hạn.
Apple cung cấp bốn loại Provisioning Profile chính, mỗi loại được thiết kế cho một giai đoạn cụ thể của vòng đời ứng dụng. Hồ sơ Development cho phép chạy ứng dụng trên các thiết bị vật lý được thêm vào Apple Developer Portal và được sử dụng trong quá trình phát triển và kiểm thử QA. Một tài khoản nhà phát triển Apple miễn phí là đủ để tạo hồ sơ Development.
Hồ sơ Ad Hoc được thiết kế để phân phối ứng dụng cho một nhóm người thử nghiệm giới hạn mà không cần App Store. Hồ sơ đăng ký tối đa 100 thiết bị theo UDID và ứng dụng có thể được cài đặt trực tiếp qua iTunes, Apple Configurator hoặc các giải pháp MDM. Các bản dựng Ad Hoc có thời hạn 12 tháng và không yêu cầu đánh giá của Apple.
Hồ sơ App Store được sử dụng riêng để xuất bản ứng dụng lên App Store và không chứa danh sách thiết bị — tự Apple quản lý phân phối sau khi phê duyệt bản dựng. Khi tải kho lưu trữ lên App Store Connect, Xcode tự động sử dụng hồ sơ App Store nếu nó được cài đặt trong hệ thống. Hồ sơ Enterprise dành cho các tổ chức có Apple Developer Enterprise Program và cho phép phân phối ứng dụng nội bộ mà không giới hạn thiết bị hoặc đánh giá của Apple.
| Loại hồ sơ | Mục đích | Thiết bị | Chi phí đăng ký |
|---|---|---|---|
| Development | Phát triển và kiểm thử | Tối đa 100 UDID | Miễn phí / $99 mỗi năm |
| Ad Hoc | Phân phối cho người thử | Tối đa 100 UDID | $99 mỗi năm |
| App Store | Xuất bản App Store | Bất kỳ (qua Apple) | $99 mỗi năm |
| Enterprise | Phân phối nội bộ | Không giới hạn | $299 mỗi năm |
Provisioning Profile là tệp ở định dạng DER được Apple ký, có thể xem nội dung qua dòng lệnh. Security framework của macOS cho phép giải mã .mobileprovision thành XML plist có thể đọc được. Bên trong hồ sơ bao gồm: UUID hồ sơ, App ID (tiền tố nhóm + Bundle Identifier), danh sách chứng chỉ, danh sách thiết bị được phép (chỉ cho Development và Ad Hoc), entitlements và ngày hết hạn.
App ID là định danh ứng dụng duy nhất bao gồm Team ID (10 ký tự do Apple chỉ định) và Bundle Identifier (ví dụ: com.example.myapp). App ID có thể rõ ràng (khớp chính xác với Bundle Identifier) hoặc wildcard (mẫu *.example.com cho nhiều ứng dụng). Apple không khuyên dùng wildcard cho các ứng dụng sử dụng thông báo Push hoặc iCloud — các dịch vụ này yêu cầu App ID rõ ràng.
Entitlements là khối XML trong hồ sơ xác định quyền truy cập của ứng dụng vào tài nguyên hệ thống. Các entitlements điển hình bao gồm: aps-environment (thông báo Push), com.apple.developer.icloud-services (iCloud), com.apple.security.application-groups (App Groups cho Widget và Share Extension). Apple tự động thêm entitlements vào hồ sơ dựa trên các Capabilities được bật trong Xcode. Bất kỳ sự không khớp nào giữa entitlements trong hồ sơ và các entitlements được yêu cầu trong mã đều dẫn đến lỗi ký.
Việc tạo hồ sơ có thể thực hiện theo hai cách: qua giao diện web Apple Developer Portal hoặc tự động qua Xcode. Đối với dự án điển hình, Xcode quản lý hồ sơ tự động khi bật tùy chọn Automatically manage signing. Xcode tạo chứng chỉ, hồ sơ và App ID trong vài giây, đồng bộ với Apple Developer Portal. Tuy nhiên, các đường ống CI/CD yêu cầu quản lý thủ công.
Để tạo hồ sơ thủ công trong Apple Developer Portal: vào Certificates, Identifiers & Profiles, chọn Profiles và nhấn "+". Sau đó chọn loại hồ sơ (Development, Ad Hoc, App Store hoặc Enterprise), chọn App ID từ danh sách đã đăng ký, chọn chứng chỉ nhà phát triển và (đối với Development và Ad Hoc) chọn thiết bị. Sau khi tạo, hồ sơ được tải xuống ở định dạng .mobileprovision và cài đặt bằng cách nhấp đúp trong Xcode.
Máy chủ CI/CD yêu cầu cách tiếp cận đặc biệt: hồ sơ và chứng chỉ phải được lưu trữ trong kho an toàn (ví dụ: GitHub Actions secrets). Trong quá trình xây dựng, hồ sơ được tải lên tác nhân, được đặt vào thư mục ~/Library/MobileDevice/Provisioning Profiles và chứng chỉ được nhập vào chuỗi khóa. Fastlane — công cụ phổ biến để tự động hóa ký — cung cấp lệnh match, đồng bộ hóa hồ sơ và chứng chỉ giữa các nhà phát triển qua kho git mã hóa.
Để chẩn đoán sự cố ký mã, bạn có thể giải mã .mobileprovision và kiểm tra nội dung của nó. Lệnh dưới đây trích xuất XML plist từ hồ sơ và lưu ở định dạng có thể đọc được:
# Giải mã .mobileprovision thành XML
security cms -D -i "path/to/embedded.mobileprovision" \
-o "profile.plist"
# Kiểm tra ngày hết hạn của hồ sơ
plist -convert xml1 profile.plist -o -
grep -A 1 "ExpirationDate" profile.plist
Tiện ích Security từ macOS Command Line Tools giải mã tệp hồ sơ được ký CMS. Cờ -D có nghĩa là giải mã, -i chỉ định tệp đầu vào. Sau khi giải mã, tiện ích plist chuyển đổi plist nhị phân thành XML và grep trích xuất ngày hết hạn. Phương pháp này hữu ích trong CI/CD để xác minh hồ sơ không hết hạn trước khi xây dựng bản phát hành.
Lỗi phổ biến nhất là "No matching provisioning profiles found" khi xây dựng trong Xcode. Lỗi này xảy ra khi Xcode không thể tìm thấy hồ sơ phù hợp với cấu hình xây dựng: Bundle Identifier không khớp với App ID trong hồ sơ, chứng chỉ không được cài đặt trong chuỗi khóa hoặc hồ sơ đã hết hạn. Giải pháp — kiểm tra cài đặt Signing & Capabilities trong mục tiêu và nếu cần, chuyển sang Automatically manage signing.
Lỗi "Provisioning profile doesn't include the selected device" xuất hiện khi cố gắng chạy bản dựng Development hoặc Ad Hoc trên thiết bị có UDID chưa được thêm vào hồ sơ. Apple Developer Portal cho phép thêm thiết bị vào hồ sơ hiện có — sau đó phải tải lại và cài đặt lại hồ sơ. Xcode với quản lý ký tự động sẽ tự động thêm thiết bị được kết nối vào hồ sơ.
Sự cố với entitlements biểu hiện dưới dạng lỗi "The executable was signed with invalid entitlements" khi tải lên App Store Connect. Nguyên nhân là sự không khớp giữa entitlements trong hồ sơ và trong tệp .entitlements của dự án. Apple yêu cầu tập quyền trong hồ sơ phải là siêu tập của các quyền mà ứng dụng yêu cầu. Giải pháp — kiểm tra Capabilities trong mục tiêu Xcode và đảm bảo tất cả các dịch vụ được bật đều có entitlements tương ứng trong hồ sơ. Fastlane bao gồm lệnh produce, đồng bộ hóa App ID và hồ sơ với các entitlements hiện tại.
Câu hỏi thường gặp
Có, nếu App ID trong hồ sơ sử dụng định danh wildcard dạng com.example.*. Tuy nhiên, hồ sơ wildcard không hỗ trợ thông báo Push, iCloud, Game Center và App Groups. Apple khuyên tạo hồ sơ rõ ràng riêng cho từng ứng dụng sử dụng Capabilities nâng cao.
Ứng dụng được tải lên qua App Store sử dụng hồ sơ Store của Apple, không phụ thuộc vào hồ sơ của nhà phát triển. Người dùng có thể tiếp tục tải và chạy ứng dụng. Hồ sơ hết hạn chỉ ngăn việc tải bản dựng mới lên App Store Connect — Apple yêu cầu hồ sơ Distribution phải còn hiệu lực tại thời điểm gửi lên.
Có thể sao chép hồ sơ vào thư mục ~/Library/MobileDevice/Provisioning Profiles trên máy tính mới. Tuy nhiên, hồ sơ được liên kết với chứng chỉ có khóa riêng trong chuỗi khóa. Bạn cũng cần xuất chứng chỉ với khóa riêng của nó qua Keychain Access và nhập trên thiết bị mới.
Không có giới hạn về số lượng hồ sơ trên máy tính. Các hồ sơ được lưu trữ trong ~/Library/MobileDevice/Provisioning Profiles và được xác định bằng UUID. Xcode tự động chọn hồ sơ phù hợp dựa trên App ID và loại bản dựng. Để đơn giản hóa quản lý, bạn nên xóa các hồ sơ không sử dụng qua Xcode Accounts Preferences.
Chứng chỉ Ký xác nhận danh tính của nhà phát triển — đó là khóa mật mã do Apple cấp. Provisioning Profile là tệp cấu hình xác định ứng dụng nào (App ID) có thể được chạy dưới chứng chỉ nào và trên thiết bị nào. Hồ sơ luôn tham chiếu đến một chứng chỉ cụ thể nhưng không thay thế nó.
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