Запускаємо ios додатки з консолі на девайсі і симуляторі

Запускаємо 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. Користуватися їй досить просто.

Отримуємо список доступних симуляторів:


Запускаємо ios додатки з консолі на девайсі і симуляторі

Із запропонованого списку я вибрав 'iPhone-6-Plus'. Запускаємо програму на ньому:


Якщо все правильно зробили, то повинен запуститися симулятор з додатком (для входу в режим введення в консолі використовуйте ctrl + C).

Запускаємо ios додатки з консолі на девайсі і симуляторі

Створення 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-ками), вищеописаний процес без напилка працювати не буде.

Ви можете допомогти і перевести трохи коштів на розвиток сайту

Схожі статті