Введение и проблематика
Bundle ID и Team — два ключевых понятия для идентификации и подписи iOS-приложений. Без правильной настройки невозможно запустить приложение на устройстве, использовать системные возможности (Push, iCloud) и опубликовать в App Store.
Bundle ID выбирается один раз и не может быть изменён после публикации в App Store. Выбирайте его обдуманно!
Bundle ID (Bundle Identifier)
Что это
Уникальный идентификатор приложения в формате обратного DNS:
com.companyname.appname
Где используется
- App Store — идентификация приложения
- Provisioning Profiles — привязка к конкретному приложению
- Capabilities (Push, iCloud) — настройка для Bundle ID
- URL Schemes — deep linking
- App Groups — shared containers
Правила именования
| Правило | Пример |
|---|
| Обратный DNS | com.apple.calculator |
| Только буквы, цифры, точки, дефисы | com.my-company.app-name |
| Регистр важен | com.Company.App ≠ com.company.app |
| Глобальная уникальность | Нельзя использовать чужой Bundle ID |
⚠️
Wildcard Bundle ID (com.company.*) можно использовать для разработки, но не для публикации в App Store.
Team
Что это
Организация разработчиков, связанная с Apple Developer Account. Каждая Team имеет уникальный Team ID (10 символов).
Типы Team
| Тип | Описание | Пример Team ID |
|---|
| Individual | Личный аккаунт | A1B2C3D4E5 |
| Company | Компания с D-U-N-S | F6G7H8I9J0 |
| Enterprise | Внутренняя дистрибуция | K1L2M3N4O5 |
Где найти Team ID
- App Store Connect → Users and Access → Team ID
- Xcode → Preferences → Accounts → View Details
- В Provisioning Profile или сертификате
Настройка в Xcode
Шаг 1: Открыть настройки проекта
Выберите проект в Navigator → выберите Target → вкладка Signing & Capabilities.
Шаг 2: Выбрать Team
В выпадающем списке Team выберите вашу команду. Если нет — добавьте аккаунт в Xcode → Preferences → Accounts.
Шаг 3: Настроить Bundle ID
Введите уникальный Bundle Identifier. Формат: com.yourcompany.appname
Шаг 4: Включить Automatically manage signing
Xcode автоматически создаст Provisioning Profile и сертификаты.
Связь Bundle ID, Team и Signing
graph TD
A[Apple Developer Account] --> B[Team]
B --> C[Certificates]
B --> D[Bundle ID / App ID]
D --> E[Provisioning Profile]
C --> E
E --> F[Signed App]
Provisioning Profile содержит
- App ID — Bundle ID или wildcard
- Certificates — кто может подписывать
- Device UDIDs — на каких устройствах можно запускать (для Development)
- Capabilities — какие возможности доступны
Практический пример
❓
Code Example 1: Как выглядит Bundle ID в Info.plist?
<!-- Info.plist -->
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<!-- Значение берётся из Build Settings -->
<!-- PRODUCT_BUNDLE_IDENTIFIER = com.mycompany.myapp -->
Bundle ID в коде
// Получить Bundle ID программно
let bundleId = Bundle.main.bundleIdentifier
print(bundleId) // "com.mycompany.myapp"
Capabilities и Bundle ID
Capabilities привязаны к конкретному Bundle ID в Developer Portal.
| Capability | Требует настройки |
|---|
| Push Notifications | Сертификат APNs для Bundle ID |
| iCloud | Container ID |
| App Groups | Group ID |
| Sign in with Apple | Service ID |
| Apple Pay | Merchant ID |
🚫
При смене Bundle ID все Capabilities нужно настраивать заново!
Пограничные кейсы
Несколько приложений
Если у вас несколько приложений (основное + watch + widget):
com.company.app — основное приложение
com.company.app.watchkitapp — Watch app
com.company.app.widget — Widget extension
Development vs Distribution
| Тип | Bundle ID | Использование |
|---|
| Development | Wildcard OK | Тестирование на устройствах |
| App Store | Точный | Публикация |
| Ad Hoc | Точный | Внешнее тестирование |
| Enterprise | Точный | Внутренняя дистрибуция |
Плюсы и минусы
| Аспект | Automatic Signing | Manual Signing |
|---|
| Простота | ✅ Xcode всё делает | ❌ Ручная настройка |
| Контроль | ❌ Ограниченный | ✅ Полный |
| CI/CD | ⚠️ Требует настройки | ✅ Предсказуемый |
| Enterprise | ❌ Не подходит | ✅ Требуется |
Вопросы интервьюера
Q: Можно ли изменить Bundle ID после публикации?
Нельзя. Придётся создать новое приложение в App Store Connect с новым Bundle ID.
Q: Что такое Team ID и где он используется?
10-символьный идентификатор команды. Используется в Provisioning Profiles, App Groups, сертификатах.
Q: Чем Bundle ID отличается от App Name?
Bundle ID — техническая строка для идентификации (com.company.app). App Name — название, видимое пользователям.
Q: Можно ли использовать один Bundle ID для разных команд?
Нет, Bundle ID глобально уникален. Разные команды не могут использовать одинаковый Bundle ID.
Источники