Info.plist: khái niệm, các khóa bắt buộc và cấu hình khởi chạy

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

Info.plist là tập tin cấu hình XML cho các ứng dụng iOS và macOS chứa siêu dữ liệu, quyền và cài đặt khởi chạy. Hệ thống xử lý nó trước khi khởi tạo mã ứng dụng. Theo Apple Developer, 2025, nếu không có Info.plist được cấu hình đúng, ứng dụng sẽ không vượt qua được quy trình xét duyệt App Store. Info.plist xác định định danh gói, số phiên bản build, quyền được yêu cầu và hướng màn hình được hỗ trợ.

Các điểm chính

  • Info.plist là một từ điển XML với các khóa cấu hình ứng dụng iOS/macOS ở định dạng plist
  • Bundle identifier là định danh ứng dụng duy nhất trong hệ sinh thái Apple dùng cho ký và dịch vụ
  • Khóa quyền riêng tư (NSCameraUsageDescription) bắt buộc để truy cập máy ảnh, micrô và vị trí địa lý
  • Custom URL schemes được cấu hình qua khóa CFBundleURLTypes cho các liên kết sâu
  • UIRequiredDeviceCapabilities đặt yêu cầu tối thiểu về thiết bị để cài đặt từ App Store

Info.plist là gì

Info.plist là tập tin định dạng XML với phần tử gốc là dict, chứa các cặp khóa-giá trị dưới dạng property list. Nó nằm bên trong gói ứng dụng và được hệ thống đọc vào mỗi lần khởi chạy trước khi thực thi mã. Định dạng plist hỗ trợ chuỗi, số, mảng, từ điển, ngày tháng và giá trị boolean, cho phép mô tả các cấu hình phức tạp.

Apple sử dụng Info.plist để xác định danh tính, khả năng và yêu cầu của ứng dụng. Việc thay đổi một số khóa yêu cầu xây dựng lại gói, vì chúng ảnh hưởng đến siêu dữ liệu mà App Store kiểm tra khi tải lên bản build. Ví dụ, thay đổi CFBundleVersion hoặc CFBundleIdentifier sau khi phát hành có thể làm hỏng quá trình cập nhật ứng dụng, vì App Store Connect sử dụng các giá trị này để nhận dạng phiên bản.

Các khóa cơ bản được tạo tự động khi tạo dự án trong Xcode, nhưng hầu hết các thiết lập được thêm thủ công khi chức năng của ứng dụng phát triển. Xcode cung cấp trình soạn thảo Info.plist đồ họa với danh sách thả xuống cho các khóa tiêu chuẩn, giảm nguy cơ sai chính tả. Tuy nhiên, đối với các cấu hình phức tạp như Scene Manifest hoặc Background Modes, bạn nên chỉnh sửa trực tiếp XML gốc.

Các khóa Info.plist bắt buộc

Một số khóa Info.plist là bắt buộc để xuất bản trên App Store. Việc thiếu chúng dẫn đến từ chối bản build ở giai đoạn xác thực. Apple tự động kiểm tra các khóa này khi tải lên kho lưu trữ qua Xcode Organizer hoặc Transporter. Nhà phát triển phải đảm bảo tất cả các trường bắt buộc được điền chính xác trước khi gửi đi xét duyệt.

Định danh gói

Khóa CFBundleIdentifier đặt một định danh ứng dụng duy nhất theo ký hiệu tên miền đảo ngược (com.company.appname). Nó được sử dụng cho ký mã, thông báo push, CloudKit, App Groups và nhiều dịch vụ Apple khác. Việc thay đổi định danh sau khi phát hành sẽ bị App Store coi là một ứng dụng mới và người dùng hiện tại sẽ không nhận được bản cập nhật. Do đó, định danh phải không thay đổi trong suốt vòng đời của ứng dụng.

xml
<key>CFBundleIdentifier</key>
<string>com.itsectr.myapp</string>

Phiên bản ứng dụng

Các khóa CFBundleShortVersionString (phiên bản hiển thị) và CFBundleVersion (số build) được App Store Connect và hệ thống sử dụng để quản lý cập nhật. Phiên bản được chỉ định theo định dạng major.minor.patch. Số build phải tăng lên với mỗi bản build được tải lên App Store Connect, ngay cả khi phiên bản ứng dụng không thay đổi. Apple sử dụng CFBundleVersion để xác định bản build là mới hay trùng với bản đã tải lên trước đó. Nếu số build trùng với bản đã tải lên trước, lỗi ITMS-90161 sẽ được trả về.

xml
<key>CFBundleShortVersionString</key>
<string>1.2.0</string>
<key>CFBundleVersion</key>
<string>42</string>

Hướng giao diện được hỗ trợ

Các khóa UISupportedInterfaceOrientations xác định các hướng màn hình được hỗ trợ cho iPhone. Đối với iPad, một khóa riêng UISupportedInterfaceOrientations~ipad với hậu tố thiết bị được sử dụng. Mỗi hướng được chỉ định dưới dạng chuỗi: UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationPortraitUpsideDown. Nếu ứng dụng chỉ hỗ trợ hướng dọc và không phải chỉ dành cho iPhone, App Store sẽ từ chối bản build nếu chỉ chỉ định hướng dọc cho iPad.

xml
<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
</array>

Quyền và khóa quyền riêng tư

Từ iOS 10, Apple yêu cầu mô tả cho mỗi quyền được yêu cầu thông qua các khóa có tiền tố NS (NeXTStep). Mô tả được hiển thị cho người dùng trong hộp thoại hệ thống khi lần đầu yêu cầu truy cập vào các API riêng tư. Việc thiếu khóa NS tương ứng khi gọi API yêu cầu quyền dẫn đến ứng dụng bị treo ngay lập tức với một ngoại lệ chỉ được ghi trong nhật ký sự cố.

KhóaMục đích
NSCameraUsageDescriptionTruy cập máy ảnh để chụp ảnh và quay video
NSPhotoLibraryUsageDescriptionTruy cập thư viện ảnh
NSLocationWhenInUseUsageDescriptionVị trí địa lý khi đang sử dụng
NSMicrophoneUsageDescriptionTruy cập micrô để ghi âm
NSContactsUsageDescriptionTruy cập danh bạ thiết bị

Mỗi khóa quyền riêng tư phải chứa mô tả người dùng có thể hiểu được về lý do yêu cầu. Các văn bản trống hoặc mẫu, như “Để ứng dụng hoạt động” hoặc “Cần truy cập”, dẫn đến việc bị App Store từ chối. Mô tả phải giải thích chức năng cụ thể: “Cần truy cập máy ảnh để quét mã QR và tạo ảnh hồ sơ.” Nên sử dụng các phiên bản đã bản địa hóa của mô tả thông qua tập tin InfoPlist.strings cho mỗi ngôn ngữ được hỗ trợ.

Việc thiếu khóa NS cần thiết khi gọi API truy cập dữ liệu riêng tư khiến ứng dụng bị treo. Hệ thống kết thúc tiến trình với một ngoại lệ, chỉ có thể thấy trong nhật ký báo cáo sự cố từ Xcode hoặc Firebase Crashlytics. Người dùng chỉ thấy ứng dụng đột ngột đóng mà không có bất kỳ giải thích nào. Do đó, trước khi thêm chức năng mới sử dụng máy ảnh, micrô hoặc vị trí, trước tiên phải thêm khóa quyền riêng tư tương ứng trong Info.plist, sau đó mới triển khai lời gọi API.

Custom URL Schemes và App Links

Khóa CFBundleURLTypes đăng ký các lược đồ URL tùy chỉnh cho các liên kết sâu vào ứng dụng. Điều này cho phép mở ứng dụng từ trình duyệt, email hoặc các ứng dụng khác qua các liên kết như myapp://profile/123. Mỗi lược đồ xác định ứng dụng một cách duy nhất: nếu hai ứng dụng đăng ký cùng một lược đồ, hệ thống sẽ hiển thị hộp thoại cho người dùng chọn ứng dụng nào để sử dụng.

xml
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>com.itsectr.myapp</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>myapp</string>
        </array>
    </dict>
</array>

Để hỗ trợ Universal Links, cần có khóa com.apple.developer.associated-domains trong tập tin Entitlements, không phải trong Info.plist. Universal Links chỉ hoạt động nếu có tập tin apple-app-site-association được cấu hình trên máy chủ, liên kết miền với ứng dụng. Không giống như các lược đồ URL tùy chỉnh, Universal Links không hiển thị hộp thoại xác nhận và không xung đột với các ứng dụng khác, vì chúng sử dụng liên kết HTTPS thay vì lược đồ tùy chỉnh. Tuy nhiên, chúng yêu cầu một miền có chứng chỉ SSL hợp lệ.

Các lược đồ tùy chỉnh có thể xung đột với các lược đồ tiêu chuẩn của iOS. Nên sử dụng các lược đồ có độ dài ít nhất 4 ký tự để giảm thiểu xung đột với các ứng dụng khác. Ví dụ, lược đồ “fb” quá ngắn và có thể gây xung đột. Tốt hơn nên sử dụng ký hiệu đảo ngược: myapp:// thay vì app://. Cũng lưu ý rằng nếu ứng dụng bị xóa nhưng một ứng dụng khác đã đăng ký cùng lược đồ, người dùng có thể gặp hành vi không mong đợi khi điều hướng qua liên kết.

Cấu hình khởi chạy và chế độ nền

Khóa UIBackgroundModes khai báo các khả năng nền của ứng dụng. Mỗi chế độ yêu cầu mô tả tương ứng trong Info.plist và xác nhận trong khả năng của dự án Xcode. Nếu không chỉ định chế độ, hệ thống có thể buộc kết thúc tác vụ nền sau 30 giây hoặc khi thiếu tài nguyên.

xml
<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
    <string>remote-notification</string>
    <string>location</string>
    <string>processing</string>
</array>

Khóa UIApplicationSupportsMultipleScenes bật hỗ trợ đa nhiệm trên iPad và Mac Catalyst. Nếu không có khóa này, ứng dụng không thể sử dụng SwiftUI ScenePhase hoặc UIKit UISceneDelegate để quản lý nhiều cửa sổ. Trên iPadOS, người dùng có thể mở nhiều cửa sổ của cùng một ứng dụng, kéo nội dung giữa chúng và sử dụng Split View. Nếu ứng dụng không hỗ trợ chế độ đa cửa sổ, đặt khóa này thành false sẽ vô hiệu hóa chức năng tương ứng.

Khóa LSRequiresIPhoneOS ngăn cài đặt ứng dụng trên iPad. Nó được sử dụng cho các ứng dụng chỉ dành cho iPhone không hỗ trợ giao diện iPad hoặc chưa được thích nghi với màn hình lớn. Tuy nhiên, Apple không khuyến nghí sử dụng khóa này một cách không cần thiết, vì người dùng mong đợi các ứng dụng hoạt động trên tất cả các thiết bị chạy iOS và iPadOS. Nếu ứng dụng vẫn bị giới hạn ở iPhone, hãy đảm bảo yêu cầu này được biện minh về mặt kỹ thuật và được nêu trong mô tả App Store.

Khóa UIViewControllerBasedStatusBarAppearance kiểm soát kiểu thanh trạng thái. Nếu được đặt thành NO, kiểu thanh trạng thái được đặt toàn cục thông qua khóa Info.plist UIStatusBarStyle. Nếu YES (mặc định từ iOS 7), mỗi ViewController có thể quản lý thanh trạng thái riêng bằng cách ghi đè preferredStatusBarStyle. Đối với các ứng dụng hiện đại, nên giữ YES để có các kiểu thanh trạng thái khác nhau trên các màn hình khác nhau, ví dụ sáng trên nền tối và tối trên nền sáng.

Khóa UIApplicationExitsOnSuspend buộc ứng dụng kết thúc hoàn toàn khi chuyển sang chế độ nền thay vì tạm dừng. Nó hiếm khi được sử dụng, chỉ dành cho các ứng dụng có yêu cầu bảo mật cao: ứng dụng ngân hàng hoặc ứng dụng xử lý dữ liệu bảo mật. Trong trường hợp này, người dùng mất khả năng quay lại ứng dụng nhanh chóng và mỗi lần khởi chạy bắt đầu từ trạng thái sạch. App Store có thể yêu cầu biện minh cho việc sử dụng khóa này trong quá trình xét duyệt.

Khóa NSAppTransportSecurity quản lý các kết nối mạng của ứng dụng. Từ iOS 9, App Transport Security (ATS) chặn tất cả các kết nối HTTP theo mặc định, yêu cầu HTTPS. Để tạm thời cho phép các yêu cầu HTTP đến các miền cụ thể, từ điển NSExceptionDomains trong NSAppTransportSecurity được sử dụng. Đối với phát triển, việc vô hiệu hóa hoàn toàn ATS thông qua NSAllowsArbitraryLoads = true được cho phép, nhưng Apple yêu cầu biện minh và không cho phép các bản build như vậy mà không có lý do chính đáng. Trong các bản build sản xuất, ATS phải được bật cho tất cả các miền xử lý dữ liệu người dùng.

Câu hỏi thường gặp

Tìm Info.plist trong dự án Xcode ở đâu?

Tập tin Info.plist nằm trong thư mục dự án với tên trùng với tên ứng dụng. Trong Xcode, nó được hiển thị trong trình điều hướng dự án trong nhóm Supporting Files với biểu tượng cuốn sách màu xanh. Nó cũng có thể được tìm thấy qua tìm kiếm Spotlight trong dự án.

Có thể chỉnh sửa Info.plist thủ công không?

, Info.plist có thể được chỉnh sửa trong bất kỳ trình soạn thảo văn bản nào hoặc thông qua giao diện đồ họa Xcode. Chỉnh sửa thủ công cho phép kiểm soát hoàn toàn nội dung nhưng yêu cầu chú ý đến cú pháp XML: mỗi chỉ thị mở <key> phải có </key> tương ứng và các kiểu dữ liệu phải khớp với những gì Apple mong đợi.

Info.plist trong dự án SwiftUI là gì?

Trong các dự án SwiftUI, Info.plist hoạt động giống hệt như trong các dự án UIKit. Ngoài ra, khóa UIApplicationSceneManifest có thể cần thiết cho cấu hình Scene nếu dự án không sử dụng giao thức App để quản lý scene. Giao thức App của SwiftUI tự động tạo cấu hình scene, nhưng việc tùy chỉnh yêu cầu thêm khóa thủ công.

Làm thế nào để thêm khóa tùy chỉnh trong Info.plist?

Mở Info.plist trong Xcode, nhấp vào nút cộng và nhập tên khóa. Đối với các khóa tùy chỉnh, hãy sử dụng tiền tố công ty để tránh xung đột với các khóa hệ thống của Apple, ví dụ ITSCustomKey thay vì chỉ CustomKey. Kiểu giá trị (String, Number, Array, Dictionary) được chọn dựa trên định dạng dữ liệu mong đợi.

Tại sao App Store từ chối bản build của tôi vì Info.plist?

Lý do điển hình: thiếu khóa quyền riêng tư cho các quyền được yêu cầu, CFBundleIdentifier không chính xác, không khớp phiên bản giữa Info.plist và App Store Connect, giá trị trống trong các khóa NS. Kiểm tra tất cả các khóa NS cho các API được sử dụng và đảm bảo mỗi mô tả chứa lời giải thích có ý nghĩa bằng ngôn ngữ bản địa hóa của ứng dụng.

Tổng kết

  • Info.plist là cấu hình XML cho ứng dụng iOS/macOS với siêu dữ liệu, quyền và cài đặt khởi chạy
  • CFBundleIdentifier và CFBundleVersion là các khóa bắt buộc để nhận dạng và xuất bản App Store
  • Khóa quyền riêng tư (NSCameraUsageDescription) bắt buộc để truy cập máy ảnh, micrô và các API riêng tư khác
  • Custom URL schemes được cấu hình qua CFBundleURLTypes, Universal Links qua Entitlements và apple-app-site-association
  • UIBackgroundModes khai báo khả năng nền để hoạt động nền chính xác
  • Thiếu các khóa bắt buộc dẫn đến treo ứng dụng hoặc từ chối bản build App Store
  • Chỉnh sửa Info.plist có sẵn qua giao diện Xcode hoặc trình soạn thảo văn bản có kiểm soát cú pháp XML

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