App Bundle ID — là một định danh ứng dụng duy nhất được sử dụng trong hệ sinh thái Apple và Google để đăng ký, ký và phân phối sản phẩm phần mềm. Mỗi ứng dụng nhận được Bundle ID khi tạo dự án và định danh này không thay đổi trong suốt vòng đời. Theo Tài liệu nhà phát triển Apple, Bundle ID được sử dụng để liên kết các dịch vụ, chứng chỉ và hồ sơ cấp quyền.
Điểm chính
Bundle Identifier là một chuỗi xác định duy nhất một ứng dụng trong hệ điều hành và cửa hàng ứng dụng. Trên iOS và macOS, nó được gọi là Bundle ID, trên Android — Package Name, mặc dù về chức năng cả hai đều thực hiện cùng một vai trò: đảm bảo tính duy nhất của ứng dụng trên thiết bị và trong cửa hàng.
Hệ điều hành sử dụng Bundle ID để phân biệt các ứng dụng trên thiết bị. Hai ứng dụng có cùng định danh không thể được cài đặt đồng thời — hệ thống coi chúng là cùng một sản phẩm. Các cửa hàng ứng dụng cũng kiểm tra tính duy nhất của Bundle ID khi xuất bản.
Apple đã giới thiệu Bundle ID khi phát hành iOS SDK vào năm 2008. Định dạng ký hiệu tên miền ngược được vay mượn từ Java (quy ước đặt tên gói), nơi nó được sử dụng để ngăn chặn xung đột tên lớp. Google đã áp dụng thực hành này cho Android, đảm bảo tính nhất quán trên cả hai hệ sinh thái di động.
| Nền tảng | Tên trường | Ví dụ |
|---|---|---|
| iOS/macOS | Bundle Identifier | com.example.myapp |
| Android | Package Name | com.example.myapp |
| watchOS | Bundle Identifier | com.example.myapp.watchkit |
| tvOS | Bundle Identifier | com.example.myapp.tvos |
Bundle ID bao gồm nhiều đoạn được phân cách bằng dấu chấm. Phần đầu tiên là định danh nhà phát triển hoặc công ty (com, org, net). Phần thứ hai là tên miền công ty (example, google, apple). Các đoạn tiếp theo chỉ định tên ứng dụng và nền tảng.
Một Bundle ID điển hình trông giống như com.company.appname. Apple khuyên dùng ký hiệu tên miền ngược để đảm bảo tính duy nhất toàn cầu. Nếu công ty không có tên miền, việc sử dụng email được cho phép: com.example.myapp hoặc org.example.myapp.
Apple hỗ trợ Wildcard Bundle ID — một mẫu định danh có dấu hoa thị: com.example.*. Mẫu này cho phép sử dụng một App ID cho nhiều ứng dụng của cùng một công ty. Wildcard ID thuận tiện trong quá trình phát triển nhưng không được khuyên dùng cho sản xuất vì nó hạn chế việc sử dụng một số dịch vụ của Apple.
Giới hạn wildcard: Thông báo Push, CloudKit, Mua hàng trong ứng dụng (In-App Purchase) và Game Center yêu cầu Bundle ID rõ ràng (explicit). Khi sử dụng mẫu com.example.*, các dịch vụ này không khả dụng. Đối với ứng dụng sản xuất, luôn sử dụng Bundle ID rõ ràng để đảm bảo đầy đủ chức năng của tất cả các dịch vụ Apple.
Ngoài wildcard, Apple còn hỗ trợ định danh tiền tố được gán cho nhóm phát triển khi đăng ký Chương trình nhà phát triển Apple. Tiền tố (Team ID) được tự động thêm vào tất cả App ID và hồ sơ cấp quyền. Hai Team ID khác nhau có thể tạo cùng một Bundle ID, nhưng trên thiết bị chúng được coi là các ứng dụng khác nhau.
Đăng ký Bundle ID là một bước bắt buộc trước khi xuất bản ứng dụng. Trong hệ sinh thái Apple, đăng ký được thực hiện trên Cổng thông tin nhà phát triển Apple qua phần Certificates, Identifiers & Profiles. Trong Google Play, Bundle ID được chỉ định khi tạo ứng dụng trong bảng điều khiển nhà phát triển.
Trên cổng thông tin Apple Developer, chọn phần Identifiers, nhấp vào nút Register và chỉ định loại App ID. Nhập tên Bundle ID chính xác và chọn các khả năng cần thiết: Push Notifications, CloudKit, Sign in with Apple. Sau khi đăng ký, định danh có sẵn để tạo hồ sơ cấp quyền.
// Kiểm tra Bundle ID trong mã ứng dụng
let bundleID = Bundle.main.bundleIdentifier
print("Current Bundle ID: \(bundleID ?? "unknown")")
// Kiểm tra Bundle ID cho điều kiện xây dựng
if bundleID == "com.example.app.production" {
// Cấu hình sản xuất
Analytics.shared.configure(.production)
}
Google Play Console không yêu cầu đăng ký Bundle ID trước. Định danh được chỉ định trong tệp build.gradle của mô-đun ứng dụng và phải là duy nhất trong toàn bộ Google Play. Sau khi tạo ứng dụng, không thể thay đổi Package Name, vì vậy hãy chọn định danh một cách cẩn thận và kiểm tra tính duy nhất của nó thông qua tìm kiếm trên Google Play. Google không giải phóng định danh của các ứng dụng đã bị xóa, vì vậy một Bundle ID đã được sử dụng vẫn không khả dụng cho các nhà phát triển khác.
Khi đăng ký trong App Store Connect, bạn phải chỉ định Bundle ID từ tập hợp các định danh đã đăng ký hiện có. Nếu định danh chưa được đăng ký trên cổng thông tin Apple Developer, hệ thống sẽ đề nghị tạo tự động. Sau khi đăng ký, Bundle ID được liên kết với nhóm và không thể được chuyển sang tài khoản nhà phát triển khác nếu không liên hệ với bộ phận hỗ trợ của Apple. Mỗi Bundle ID có thể có nhiều hồ sơ cấp quyền cho các môi trường khác nhau: Development, Ad Hoc, App Store.
Khi đăng ký Bundle ID cho ứng dụng iOS có tiện ích mở rộng, mỗi thành phần phải được đăng ký riêng biệt. Tiện ích mở rộng widget, bàn phím, Notification Service và Watch App có định danh riêng của chúng bắt nguồn từ định danh chính. App Store Connect nhóm chúng lại khi tạo App Record, cho phép xuất bản tất cả các thành phần dưới dạng một ứng dụng duy nhất.
Cấu hình Bundle ID trong Xcode được thực hiện ở một số nơi: Info.plist, Build Settings và Signing & Capabilities. Trường trung tâm là Bundle Identifier trong mục tiêu ứng dụng. Tất cả các dịch vụ Apple, từ thông báo Push đến CloudKit, đều được liên kết với định danh này. Bundle ID được chỉ định không chính xác sẽ dẫn đến lỗi ký và không thể xuất bản lên App Store.
<!-- Info.plist — Bundle ID cơ sở của dự án -->
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<!-- Build Settings — biến PRODUCT_BUNDLE_IDENTIFIER -->
<!-- Debug: com.example.app.dev -->
<!-- Release: com.example.app -->
Xcode sử dụng biến PRODUCT_BUNDLE_IDENTIFIER trong Build Settings. Các giá trị khác nhau có thể được đặt cho các cấu hình xây dựng khác nhau: com.example.app.dev cho Debug và com.example.app cho Release. Điều này thuận tiện cho việc cài đặt phiên bản phát triển cùng với phiên bản sản xuất trên cùng một thiết bị để thử nghiệm.
Nếu ứng dụng có tiện ích mở rộng (Notification Service, Widget, Watch App), mỗi tiện ích mở rộng sẽ nhận được Bundle ID riêng với hậu tố. Ứng dụng chính: com.example.app. Tiện ích mở rộng widget: com.example.app.widget. Watch App: com.example.app.watchkit. Mỗi định danh được đăng ký riêng biệt trên Cổng thông tin nhà phát triển Apple và nhận hồ sơ cấp quyền riêng. Xcode tự động quản lý các phụ thuộc này trong quá trình xây dựng.
App Bundle ID (Apple) và Package Name (Google) là các thực thể tương tự với cùng mục đích nhưng quy tắc sử dụng khác nhau trong hệ sinh thái iOS và Android. Cả hai định danh đều sử dụng ký hiệu tên miền ngược và không thể thay đổi sau khi xuất bản trong các cửa hàng ứng dụng chính thức.
Trong hệ sinh thái Apple, Bundle ID được liên kết với hồ sơ cấp quyền và chứng chỉ. Khi thay đổi nhóm phát triển, Bundle ID có thể được chuyển giữa các tài khoản thông qua App Store Connect. Trong Android, Package Name được liên kết chặt chẽ với ứng dụng trong Google Play và không thể được chuyển giữa các tài khoản nhà phát triển.
| Đặc điểm | iOS Bundle ID | Android Package Name |
|---|---|---|
| Độ dài tối đa | Không giới hạn | 150 ký tự |
| Dấu phân cách đoạn | Dấu chấm (.) | Dấu chấm (.) |
| Ký tự được phép | A-Z, a-z, 0-9, dấu chấm, dấu gạch nối | A-Z, a-z, 0-9, dấu chấm, dấu gạch dưới |
| Wildcard | Được hỗ trợ (*) | Không được hỗ trợ |
| Sử dụng trong mã | Bundle.main.bundleIdentifier | BuildConfig.APPLICATION_ID |
Mặc dù có sự khác biệt, cả hai định danh đều đóng vai trò quan trọng: nếu không có chúng, không thể xuất bản ứng dụng trong cửa hàng chính thức. Khuyến nghị cho các dự án đa nền tảng — sử dụng cùng một định danh trong phiên bản iOS và Android để đơn giản hóa tích hợp với Firebase, Analytics và các dịch vụ khác. Điều này cũng đơn giản hóa việc điều hướng cho nhóm phát triển: một định danh cho cả hai dự án giảm nhầm lẫn khi thiết lập CI/CD và cấu hình môi trường.
Khi phát triển với Flutter hoặc React Native, một định danh duy nhất đặc biệt quan trọng vì cơ sở mã được chia sẻ và nhiều công cụ xây dựng tự động mong đợi cùng một tên gói cho cả hai nền tảng. Một dự án Firebase cũng được liên kết với một định danh duy nhất cho iOS và Android, đơn giản hóa việc thiết lập phân tích và báo cáo sự cố.
Câu hỏi thường gặp
Thay đổi Bundle ID sau khi xuất bản trên App Store hoặc Google Play là không thể. Hệ thống sẽ coi định danh mới là một ứng dụng hoàn toàn khác. Để cập nhật sản phẩm hiện có, Bundle ID phải không thay đổi trong suốt vòng đời ứng dụng.
Thiết bị iOS hoặc Android sẽ không cho phép cài đặt ứng dụng thứ hai có cùng định danh lên trên ứng dụng thứ nhất. Hệ thống sẽ hiển thị lỗi và đề nghị xóa ứng dụng hiện tại. Trong các cửa hàng, việc xuất bản với Bundle ID trùng lặp cũng sẽ bị chặn.
Sử dụng ký hiệu tên miền ngược của công ty bạn: com.companyname.appname. Tránh dấu gạch nối và các ký tự đặc biệt. Nếu ứng dụng có tiện ích mở rộng, hãy thêm hậu tố được phân cách bằng dấu chấm. Đảm bảo định danh là duy nhất và không bị nhà phát triển khác sử dụng.
Có, mỗi tiện ích mở rộng — widget, Watch App, Notification Service — yêu cầu Bundle ID riêng. Các định danh tạo thành một hệ phân cấp: com.example.app là cơ sở, com.example.app.widget cho widget, com.example.app.watchkit cho Watch. Tất cả được đăng ký riêng biệt trên Cổng thông tin nhà phát triển Apple và chia sẻ App ID chung với ứng dụng cha.
Bundle ID là một chuỗi định danh trong mã ứng dụng. App ID là một đối tượng trong Cổng thông tin nhà phát triển Apple kết hợp Bundle ID với một tập hợp các dịch vụ được kích hoạt (capabilities). App ID được tạo dựa trên Bundle ID và được sử dụng để tạo hồ sơ cấp quyền.
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