iOS Mobile Инженер

iOS Mobile Инженер

Роадмап навыков для прокачки

Bundle ID и Team: основы

iOS Tooling and DeliveryXcodeProject Settings

Основная идея

Bundle ID — уникальный идентификатор приложения в экосистеме Apple. Team — это команда разработчиков, связанная с Apple Developer Account. Вместе они определяют, кто может подписывать и публиковать приложение.

Ключевые аспекты

  • Bundle ID — строка вида com.company.appname, уникальная в App Store
  • Team — организация с Apple Developer Account (Team ID)
  • Signing — процесс подписи приложения сертификатом команды
  • Capabilities — возможности, привязанные к Bundle ID (Push, iCloud и др.)

Плюсы правильной настройки

  • Автоматический signing через Xcode
  • Доступ к Push Notifications, iCloud, App Groups
  • Возможность публикации в App Store

Минусы

  • Bundle ID нельзя изменить после публикации
  • Смена Team требует перенастройки signing
  • Capabilities привязаны к конкретному Bundle ID

Частые ошибки на собеседованиях

  • Путают Bundle ID и App Name — это разные вещи
  • Не понимают связь Bundle ID с Provisioning Profile
  • Забывают про уникальность Bundle ID глобально в App Store

Введение и проблематика

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

Правила именования

ПравилоПример
Обратный DNScom.apple.calculator
Только буквы, цифры, точки, дефисыcom.my-company.app-name
Регистр важенcom.Company.Appcom.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-SF6G7H8I9J0
EnterpriseВнутренняя дистрибуцияK1L2M3N4O5

Где найти Team ID

  1. App Store Connect → Users and Access → Team ID
  2. Xcode → Preferences → Accounts → View Details
  3. В 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?

xml
<!-- Info.plist -->
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
 
<!-- Значение берётся из Build Settings -->
<!-- PRODUCT_BUNDLE_IDENTIFIER = com.mycompany.myapp -->

Bundle ID в коде

swift
// Получить 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
iCloudContainer ID
App GroupsGroup ID
Sign in with AppleService ID
Apple PayMerchant 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Использование
DevelopmentWildcard OKТестирование на устройствах
App StoreТочныйПубликация
Ad HocТочныйВнешнее тестирование
EnterpriseТочныйВнутренняя дистрибуция

Плюсы и минусы

АспектAutomatic SigningManual 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.


Источники

Code Example 1: Bundle ID в Info.plist

❓ Как Bundle ID определяется в iOS проекте?

xml
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
swift
let bundleId = Bundle.main.bundleIdentifier
print(bundleId)