Запускаємо iOS додатки з консолі на девайсі і симуляторі +12
- такий же як Forbes, тільки краще.
У статті буде коротко описано, як зібрати додаток консольними командами і запустити на реальному девайсе і симуляторі без будь-якої потреби відкривати xcode для цього.
Загалом, варто почати з того, що в моїй компанії є відділ ios розробки в складі> 10 осіб, які працюють над пачкою додатків. Для автоматизації рутинної роботи нам довелося розгорнути CI сервер (поки самопісний, з огляду на особливі історичних причин (ну як у всіх), планується міграція на jenkins). До рутинним речам я відношу - збірку проектів, запуск тестів (якщо, звичайно, ви їх пишете), створення іпашек для тестерів і для викладки в app store. Загалом, хотілося щоб після натискання кнопочки або по хуку в гіті все це починало працювати. Поки у нас все працює після натискання кнопки розробником, про гіт поки тільки в планах. У даній статті я тільки торкнуся тему компіляції проекту і упаковку його в ipa файлу. Функціонал запуску проектів на девайсах на стороні CI сервера ще знаходиться в стадії розробки, а ось сам процес упаковки вже давно в «бою», може кому стати в нагоді.
- зберемо додаток і запустимо на симуляторі
- зберемо ipa і запустимо на реальному девайсе
- зберемо ipa для викладки на маркет
- трохи подебажім помилки збірки
маємо:
- OS X 10.10.5
- Xcode 7.1
Для частоти експерименту будемо використовувати стороннє додаток, щоб шановні читачі могли повторити, що описано в статті. Використовуємо тестове додаток для опенсорсний apple-івського framework-а ResearchKit.
Перед компіляцією проекту необхідно встановити apple doc generator github.com/tomaz/appledoc (там є опис як встановити).
Переходимо до скачані проекту. Кореневої проект являє собою сам ResearchKit framework, саме тестове додаток знаходиться в іншому місці, переходимо туди:
Пробуємо компілювати додаток. Збираємо під симулятор, так як для збірки проекту під симулятор не потрібні сертифікати / провіжен файли.
Білд падає, так як немає схеми ORKCatalog. Так як схема в оригінальному проекті не була позначена як shared, то після "зливу" з гіта, xcode ще нічого не знає про цю схему, щоб він її снігурі, потрібно просто відкрити проект. Тому просто відкриваємо проект:
І відразу ж закриваємо, після наша схема з'явиться, перевірити схеми можна через xcodebuild -list. Пробуємо зібрати знову:
Після бачимо довгоочікуване ** BUILD SUCCEEDED **. Відмінно, все працює.
Запускаємо проект на симуляторі
Компілюємо під симулятор, архітектури можуть бути i386 / x86_64. Через SYMROOT задаємо шлях результату збірки:
(Думки вголос: коли писав статтю, компіляція в режимі Release працювала, перед публікацією статті ще раз перевірив всі кроки і компіляція в цьому режимі перестала працювати, тому збираємо в Debug, якісь з останніх коммітов це зламали.)
Після успішної збірки ми отримали ORKCatalog.app файл в build / Debug-iphonesimulator /. Залишилося запустити це на симуляторі. Для цього будемо використовувати ios-sim утиліту github.com/phonegap/ios-sim. Користуватися їй досить просто.
Отримуємо список доступних симуляторів:
Із запропонованого списку я вибрав 'iPhone-6-Plus'. Запускаємо програму на ньому:
Якщо все правильно зробили, то повинен запуститися симулятор з додатком (для входу в режим введення в консолі використовуйте ctrl + C).
Створення ipa файлу і запуск на реальному девайсе
Збираємо архів під девайс (це архітектури arm64 / armv7):
Компіляція впаде, так як ми ще не прописали в додатку свій bundle id і не прілінкованние mobileprovision, помилка буде такого виду:
Будемо передавати bundle id з консолі + потрібно прописати його в Info.plist файлі. Також через консоль будемо передавати лінк на наш mobileprovision. Plist файл знаходимо по шляху ORKCatalog / Supporting Files / Info.plist, в якому для ключа CFBundleIdentifier виставляємо значення ru.habrahabr.test. Bundle id передаємо через ключ із значенням нашого ід PRODUCT_BUNDLE_IDENTIFIER = ru.habrahabr.test. Лінк на mobileprovision передаємо через ключ PROVISIONIG_PROFILE, зі значніє UUID, який прописаний в mobileprovision.
Значення буде подібно 87b0df89-793a-4a0f-92bf-c5f9c35f1405. Знову збираємо:
Пробуємо збирати ipa:
Збірка падає, по логам можна зрозуміти, що щось з entitlements:
Помилково ясно, що додаток підписуємо entitlements, значення в якому не відповідають значенням в нашому mobileprovision, а саме com.apple.developer.healthkit. Шукаємо причину. Дивимося яким entitlements підписано додаток:
Бачимо, що все ок, за винятком цього:
У нас в mobileprovision немає цієї опції, потрібно з'ясувати, звідки це взялося:
Пошук нам видав ORKCatalog / Supporitng Files / ORKCatalog.entitlements. Дивимося що всередині:
Там тільки одне значення:
За логікою потрібно перезаводіть mobileprovision, в який потрібно додати це значення, але ми ліниві і для тесту це не обов'язково, нам потрібно просто переподпісать додаток з entitlements без цього значення.
У нас є як мінімум два варіанти:
1. Просто редагуємо існуючий entitlements (ORKCatalog / Supporitng Files / ORKCatalog.entitlements) і знову збирати заново (через archive).
2. Без пересборки, самі переподпішем ORKCatalog.app з потрібним entitlements.
Виберемо перший варіант як більш простий. Тому з файлу ORKCatalog / Supporitng Files / ORKCatalog.entitlements просто видаляємо рядки:
і знову збирати заново архів:
Після створюємо ipa:
Бачимо довгоочікуване повідомлення ** EXPORT SUCCEEDED **. Під build / dev-ipa / з'явитися ipa файл, який будемо встановлювати на девайс. Встановлювати на девайс будемо за допомогою ios-deploy github.com/phonegap/ios-deploy. Чіпляємо девайс до машини, отримуємо id девайса через:
Деплоім на девайс:
Збираємо ipa файл для маркету
Все те ж саме як для develop версії, тільки міняємо лінк на релізний mobileprovision, в options.plist замість development проставляем app-store (які ще options можна додати дивіться в хелпе xcodebuild -help).
Без використання xcode змогли зібрати ipa файли для тестів і на викладку в app store. Все це можна легко автоматизувати на CI сервері щоб полегшити життя розробникам.
P.S. Варто зазначити, що для процесу компіляції / підписання додатків зі складною структурою, коли кілька Таргет і кожен вимагає свого окремого mobileprovision файлу (додатки з extension, годинами, embedded framework-ками), вищеописаний процес без напилка працювати не буде.
Ви можете допомогти і перевести трохи коштів на розвиток сайту