Какие бывают типы сертификатов для iOS-разработки и распространения приложений (Development, Ad Hoc, Production, APNS)?

«Какие бывают типы сертификатов для iOS-разработки и распространения приложений (Development, Ad Hoc, Production, APNS)?» — вопрос из категории DevOps, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сертификаты обеспечивают цифровую подпись и безопасность на разных этапах жизненного цикла приложения.

1. Сертификаты для подписи кода (Code Signing)

Тип Назначение Ограничения
Development Подпись приложений для запуска на устройствах разработчика через Xcode. Привязан к конкретному Apple ID. Работает только с устройствами, добавленными в dev portal.
Ad Hoc Распространение билдов для тестирования на ограниченном наборе устройств (до 100) без App Store. Требует явного указания UDID каждого тестового устройства в Provisioning Profile.
Production (App Store) Подпись финальных билдов для публикации в App Store и TestFlight. Не привязан к конкретным устройствам.

2. Сертификаты для APNS (Apple Push Notification Service)

Тип Назначение
Apple Push Services (Development) Отправка push-уведомлений в development-среде (сборки, подписанные Development-сертификатом).
Apple Push Services (Production) Отправка push-уведомлений в production-среде (сборки, подписанные Ad Hoc или App Store-сертификатами).

Ключевые различия и практика:

  • Development vs Production (код): Нельзя использовать Development-сертификат для сборки в App Store, и наоборот.
  • APNS-сертификаты отдельны: Для отправки пушей ваш backend должен использовать соответствующий (Development/Production) APNS-сертификат или ключ (Auth Key).
  • Provisioning Profile — связующее звено: Профиль содержит сертификат, разрешенные устройства (для Development/Ad Hoc) и App ID, связывая всё вместе.

Пример создания CSR (запроса на сертификат):

# Стандартная команда для создания пары ключей и CSR
openssl req -new -newkey rsa:2048 -nodes -keyout "MyPrivateKey.key" -out "CertificateSigningRequest.certSigningRequest" -subj "/emailAddress=your.email@example.com, CN=Your Name, C=US"

Важно: Private Key (.key) храните в безопасности. Без него нельзя перевыпустить или использовать сертификат.