Сертифікат розробника iOS: provisioning profile і Expo
Автор: Mehdi Azizi
Опубліковано , 9 хв
Сертифікат доводить, хто підписав твій застосунок, а provisioning profile визначає, який саме і на яких iPhone. З Expo обидва створює й поновлює EAS.
Сертифікат розробника iOS доводить, хто підписав твій застосунок. Provisioning profile, або профіль забезпечення, пов'язує цей сертифікат із конкретним застосунком і визначає, де йому дозволено працювати. З Expo тобі майже ніколи не доведеться створювати їх вручну: EAS створює їх, зберігає й поновлює, коли ти запускаєш збірку.
Але розуміти, що робить кожен файл, усе одно корисно. Коли збірка не встановлюється або відправлення застрягає, саме ці знання зекономлять тобі день. У цьому гайді я розбираю чотири елементи, термін їхньої дії, ліміти Apple і типові помилки, з рішенням для кожної.
Я публікую свої iOS-застосунки з Expo та EAS, зокрема Solys і TradaZen. Повний шлях описано в статті як опублікувати iOS-застосунок без Mac. А тут ми зазирнемо під капот підпису.
Навіщо Apple вимагає підпис
iOS-застосунок має бути підписаний, щоб встановитися на iPhone або вирушити в App Store Connect. Підпис гарантує, що застосунок походить від розробника, відомого Apple, і що відтоді його ніхто не змінював.
Щодо App Store є одна заспокійлива деталь. Згідно з технічною нотаткою Apple TN3161, App Store перевіряє, що твій сертифікат дистрибуції дійсний на момент відправлення, а потім перепідписує застосунок, і він більше не залежить від дати закінчення дії твого сертифіката. Отже, твої сертифікати мають бути дійсними в момент відправлення, а не протягом усього життя застосунку.
Чотири елементи, які треба знати
Документація Expo про облікові дані називає три для iOS: сертифікат дистрибуції, профілі та ключ push-сповіщень. Я додаю ще ідентифікатор застосунку, без якого жоден профіль не існує.
Сертифікат дистрибуції
Це твій підпис розробника. Довідка Apple про сертифікати розрізняє дві родини:
- Apple Development потрібен, щоб запускати застосунок на своїх пристроях під час розробки. Він належить конкретній людині.
- Apple Distribution потрібен для дистрибуції на визначені тестові пристрої або для відправлення в App Store Connect. Він належить команді, і створити його можуть лише власник акаунта або адміністратор.
Сертифікат дистрибуції не прив'язаний до якогось конкретного застосунку: той самий підписує всі твої застосунки. До нього додається приватний ключ, і саме він дає змогу підписувати. Згідно з TN3161, сертифікат Apple зазвичай дійсний один рік від моменту створення.
Ідентифікатор застосунку (App ID)
App ID ідентифікує твій застосунок у профілі. Він повторює твій bundle identifier, наприклад com.example.myapp (вигаданий приклад). Згідно з довідкою Apple, він також містить перелік дозволених можливостей: push-сповіщення, App Groups, Sign in with Apple…
В Expo це поле ios.bundleIdentifier у твоїй конфігурації. Обери його раз і назавжди: він має бути однаковим усюди, і в конфігурації, і в App Store Connect. App ID не має терміну дії. А згідно з документацією Expo про можливості iOS, EAS синхронізує його можливості з твоєю конфігурацією під час кожної збірки.
Профіль забезпечення
Профіль усе поєднує. Він містить App ID, сертифікат і, залежно від типу, список дозволених пристроїв. Тебе стосуються три типи:
- Development: тестовий застосунок на твоїх зареєстрованих пристроях.
- Ad hoc: збірка, яку можна встановити на точно визначений список пристроїв, кожен з яких ідентифікується своїм UDID. Це «внутрішня дистрибуція» в EAS.
- App Store: для App Store Connect і TestFlight. Він не містить жодного списку пристроїв, пояснює нотатка TN3125.
Кожен профіль має дату закінчення дії: зазвичай не більше року за Apple, 12 місяців за Expo.
Ключ push-сповіщень (APNs)
Ключ APNs дозволяє твоєму серверу або серверу Expo надсилати сповіщення в твій застосунок. Це файл .p8, який можна завантажити лише один раз: Apple не зберігає його у твоєму акаунті. Один ключ підходить для всіх твоїх застосунків, і термін його дії ніколи не спливає.
Підсумкова таблиця
| Елемент | Для чого | Термін дії | Хто керує з Expo |
|---|---|---|---|
| Сертифікат дистрибуції | Підписувати збірки | Зазвичай один рік | EAS, після входу |
| App ID | Ідентифікувати застосунок | Безстроково | Ти, потім EAS |
| Профіль App Store | Надсилати в Apple | До 12 місяців | EAS |
| Профіль ad hoc | Встановлювати на свої iPhone | До 12 місяців | EAS і твої пристрої |
| Ключ push APNs | Надсилати сповіщення | Безстроково | EAS або ти |
| Профіль безкоштовного акаунта | Тестувати через Xcode | 7 днів | Xcode, не EAS |
«Ти, потім EAS»: ти обираєш bundle identifier, EAS займається можливостями. «EAS і твої пристрої»: ти реєструєш кожен тестовий iPhone, EAS створює профіль. Останній рядок стосується безкоштовного акаунта Apple: згідно з довідкою Apple про акаунти, його профілі спливають через 7 днів після створення.
Ліміти Apple, які треба знати
- Сертифікати дистрибуції: дуже мало на акаунт. Довідка Apple говорить про один на тип дистрибуції й на команду, таблиця Expo про ліміт 2. Запам'ятай правило: не створюй новий сертифікат для кожної збірки чи на кожному комп'ютері.
- Ключі APNs: максимум 2 на акаунт, за даними Expo.
- Профілі: без ліміту, за даними Expo.
- Пристрої: до 100 на родину продуктів і на рік членства, згідно з довідкою Apple про пристрої. Деактивація пристрою не звільняє місце. Лічильник повертається до 100 на початку наступного року членства, якщо ти видалиш пристрої.
Що EAS робить за тебе
Згідно з сторінкою Expo про керовані облікові дані, твоя перша iOS-збірка пропонує згенерувати все, чого бракує. Ти входиш в акаунт Apple Developer, EAS створює сертифікат дистрибуції, профіль і push-ключ, а потім зберігає їх на своїх серверах. Наступні збірки використовують їх повторно.
Три корисні моменти:
- Твій пароль Apple залишається на твоєму комп'ютері. Сторінка Expo про безпеку уточнює, що він не надсилається на їхні сервери, а збережені облікові дані зашифровані.
eas credentialsпоказує все: сертифікат, профілі, push-ключ. Ця команда також дає змогу їх замінити або видалити.- Видалення в EAS не видаляє в Apple. Щоб звільнити місце, треба відкликати сертифікат у порталі Apple.
Також можна тримати все під контролем через локальні облікові дані: файл credentials.json вказує на твій сертифікат (.p12) і профіль (.mobileprovision). Expo просить додати ці файли в .gitignore. Це те саме правило, що й для API-ключів у застосунку Expo: секрет ніколи не потрапляє в репозиторій.
Типові помилки та як їх виправити
Профіль прострочено
Збірка ad hoc містить свій профіль: коли він спливає, застосунок більше не відкривається на твоїх тестових iPhone. А от в App Store, як підтверджує Expo, закінчення дії профілю ніяк не впливає на застосунок у продакшені. Рішення: запусти нову збірку. EAS згенерує новий профіль, або зроби це сам через eas credentials. Потім заново встанови нову збірку на свої пристрої.
Не плутай із TestFlight: збірка TestFlight спливає через 90 днів, незалежно від твого сертифіката. Деталі в статті TestFlight для тестування застосунку на iPhone.
Сертифікат прострочено або відкликано
Apple висловлюється чітко: якщо твоє членство дійсне, застосунків, які вже є в App Store, це не стосується. Однак ти більше не можеш надсилати збірки, підписані цим сертифікатом. Збірку, яку надіслано, але ще не подано на перевірку, можуть позначити як Invalid Binary, якщо її сертифікат відкликано. А профілі, що містять відкликаний сертифікат, стають недійсними.
Рішення: створи новий сертифікат через eas credentials або під час наступної збірки, а потім дай EAS перестворити профілі. І ніколи не відкликай робочий сертифікат за звичкою.
Пристрою немає в профілі ad hoc
Посилання на встановлення працює в тебе, але не на iPhone тестувальника. Причина: документація Expo про внутрішню дистрибуцію пояснює, що встановити застосунок можуть лише пристрої, які були в профілі на момент збірки.
Рішення:
- Зареєструй пристрій командою
eas device:create. - Запусти нову збірку в інтерактивному режимі, увійшовши в акаунт Apple, щоб EAS оновив профіль. Або перепідпиши наявну збірку через
eas build:resign, без повної перекомпіляції. - У безперервній інтеграції неінтерактивний режим повторно використовує профіль, не оновлюючи його список. Додай опцію
--refresh-ad-hoc-provisioning-profile.
На новому або щойно поновленому акаунті Apple може обробляти новий пристрій від 24 до 72 годин. Тож перша збірка, яка його включає, може впасти: зачекай і запусти знову.
Досягнуто ліміту сертифікатів
Apple відмовляється створювати новий сертифікат дистрибуції. Часто десь лежать старі сертифікати: створені в Xcode на іншому Mac або іншим сервісом збірки. Використай наявний сертифікат, якщо в тебе є його файл .p12. Якщо ні, відклич той, що більше не потрібен, у порталі Apple. Відкликання не впливає на твої застосунки, які вже опубліковані, але робить недійсними профілі, що його містили.
«Provisioning profile doesn't include signing certificate»
Це повідомлення Xcode означає, що профіль не містить сертифіката, приватний ключ якого є на твоєму комп'ютері. Типова причина: змішування автоматичного підпису Xcode та облікових даних EAS. Обери одне джерело істини: збірки EAS із керованими обліковими даними або локальні облікові дані, але не обидва варіанти.
Сповіщення зникли після відкликання ключа
Якщо ти відкличеш ключ APNs, Expo попереджає, що всі застосунки, які його використовують, перестануть отримувати сповіщення. Створи новий ключ і завантаж його через eas credentials. Токени Expo Push твоїх користувачів не змінюються.
Додано можливість, профіль недійсний
Увімкнення сервісу на кшталт push-сповіщень або App Groups робить профіль недійсним: його треба перегенерувати. З EAS можливості синхронізуються під час кожної збірки. Якщо профіль усе одно відхиляється, eas credentials дає змогу згенерувати новий.
Що далі після підпису
Підписана збірка лише один із етапів. Сторінка застосунку, скріншоти, конфіденційність і подання на перевірку зібрані в статті як опублікувати застосунок в App Store. Якщо в тебе ще немає членства, почни з акаунта розробника Apple. А щоб зрозуміти, чому я раджу Expo новачкам, почитай React Native і Expo для мобільного застосунку.
Якщо ти готуєш першу публікацію
Перед першим відправленням пройди безкоштовну діагностику: вона покаже, що насправді гальмує твій проєкт, і надішле тобі мій чекліст проти відмов Apple.
Щоб створити застосунок, підключити підписки й опублікувати його без боротьби з підписом, iOS & Android Kit проведе тебе шляхом із чотирьох етапів зі стартовим кодом моїх застосунків, у твоєму темпі.
Поширені запитання
Що таке provisioning profile?
Це файл, який дозволяє твоєму застосунку працювати або вирушити в Apple. Він пов'язує ідентифікатор застосунку, сертифікат і, залежно від типу, список пристроїв. Профіль App Store не містить жодного пристрою, профіль ad hoc містить кілька.
Чи безкоштовний сертифікат розробника iOS?
Окремо за нього не платять: сертифікат дистрибуції входить в Apple Developer Program за 99 $ на рік. З безкоштовним акаунтом Apple Xcode дозволяє тестувати максимум на 3 пристроях, але профілі спливають через 7 днів, а публікація неможлива.
Скільки діє сертифікат дистрибуції Apple?
Зазвичай один рік від моменту створення, за даними Apple. Профілі забезпечення теж діють не більше 12 місяців. А от ключ push-сповіщень ніколи не спливає.
Що станеться, якщо мій сертифікат дистрибуції спливе?
Для твоїх застосунків, які вже є в App Store, нічого, поки твоє членство дійсне. Ти просто більше не зможеш надсилати нові збірки, підписані цим сертифікатом. З EAS новий сертифікат створюється під час наступної збірки або через eas credentials.
Чи потрібен Mac, щоб створити сертифікат iOS?
Ні, якщо ти користуєшся EAS. Ти входиш в акаунт Apple з командного рядка, а EAS генерує сертифікат і профіль, хоч на Windows, хоч на Linux. Без EAS класичний спосіб передбачає Xcode або «Зв'язку ключів» на Mac.
Скільки пристроїв може містити профіль ad hoc?
Твій акаунт може зареєструвати до 100 iPhone на рік членства і стільки ж для кожної іншої родини пристроїв. Деактивований пристрій однаково враховується. Щоб тестувати з більшою кількістю людей, використовуй TestFlight.

