Настройка підписи iOS-додатків (Certificates, Provisioning Profiles)
Система підписи Apple—один з найчастіших джерел втраченого часу в iOS-розробці. Xcode вміє автоматично керувати підписью, але у CI/CD-середовищі, при роботі в команді або при наявності кількох entitlements це автоматичне управління ломається непередбачливо. Сборка падає з No signing certificate found, а Xcode при цьому мовчить про реальну причину.
Що саме ломається та чому
Частіше за все проблеми виникають у трьох ситуаціях.
Істекший сертифікат у keychain. Apple Developer Certificate дійсний один рік. Коли він істікає, старі Provisioning Profiles, привязані до нього, стають невалідними автоматично. Xcode іноді не повідомляє про істечення явно—просто не знаходить потрібну підпись. Перевірити актуальний статус: Keychain Access → My Certificates → шукати iPhone Distribution або Apple Distribution з коректною датою.
Mismatch між Bundle ID та Provisioning Profile. Profile створюється під конкретний App ID. Wildcard-профіль (com.example.*) зручний для швидкої розробки, але не підтримує більшість entitlements: Push Notifications, Associated Domains, App Groups, HealthKit—все це вимагає explicit App ID. Проект з Push включеним, але wildcard-профілем—сборка пройде, але entitlements не застосуються, та APNS не запрацює.
CI/CD без доступу до keychain. На чистому CI-агенті немає ні сертифікатів, ні профілів. Стандартний підхід—match (Fastlane): зашифрований репозиторій з сертифікатами, які match скачує та імпортує перед сборкою. Альтернатива—Xcode Cloud з автоматичним управлінням, але він не гнучкий для кастомних кроків.
Повний процес настройки
Apple Developer Portal
- Створити App ID (Identifiers → App IDs) з явним Bundle ID та потрібними Capabilities
- Створити Certificate Signing Request через Keychain Access: Certificate Assistant → Request a Certificate
- Загрузити CSR в Apple Developer Portal, скачати сертифікат, встановити в Keychain
- Створити Provisioning Profile, привязавши App ID + Certificate + потрібні пристрої (для Development) або без пристроїв (для Distribution)
Xcode настройка
У Signing & Capabilities вибрати Manual signing. Вказати Team, Bundle Identifier, та вибрати профіль явно. Для кількох таргетів (основне додаток + Extension)—кожен таргет вимагає своєї Provisioning Profile.
<!-- Приклад entitlements файлу для додатку з Push + App Groups -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ...>
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>production</string>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example.app</string>
</array>
</dict>
</plist>
Entitlements у .entitlements файлі повинні точно збігатися з тим, що включено в App ID на Portal. Розхідність → reject при архівуванні з помилкою Provisioning profile doesn't support the ... entitlement.
Fastlane match для команди
# Matchfile
git_url("https://github.com/your-org/ios-certificates")
storage_mode("git")
type("appstore") # або "development", "adhoc"
app_identifier(["com.example.app", "com.example.app.notification-extension"])
username("[email protected]")
fastlane match appstore --readonly # на CI, тільки читання
fastlane match development # на локальній машині, оновлення
--readonly на CI—важливо: запобігає випадковій регенерації профілів в середині сборки.
Кількох Extension-таргетів
Notification Service Extension, Share Extension, Widget—кожен вимагає окремого App ID (наприклад com.example.app.widget) та окремого Provisioning Profile. App Groups дозволяють їм ділити дані через UserDefaults(suiteName:) або загальний файловий контейнер. App Group повинен бути включен в App ID кожного таргета.
Типові помилки
- Скачати Provisioning Profile вручну та положити в ~/Library/MobileDevice/Provisioning Profiles—працює локально, ломається на CI та у інших розробників
- Забути оновити профіль після додавання нового пристрою в Portal (для Development)
- Один сертифікат на всю команду замість Certificate per developer—при відзиві одного сертифіката сборки у всіх падають
Робочий процес
Аудит поточного стану: сертифікати у Keychain, профіли в Portal, entitlements у проекті.
Приведення App ID, Capabilities та Provisioning Profiles у відповідність.
Настройка Fastlane match або Xcode Cloud для командної роботи та CI/CD.
Тестова сборка на симуляторі та реальному пристрої, архівування та перевірка через Altool або Transporter.
Часова шкала
Одноразова настройка підписи для одного таргета—2–4 години. При наявності кількох Extensions, App Groups та настройки CI/CD через Fastlane match—1–2 дні.







