Налаштування макросів препроцесора в Xcode

Рідкісна програма обходиться без конфігураційних параметрів. Проекти для iOS не є винятком. То URL-сервера потрібно вказати, то режим налагодження або демонстраційний параметр. Зазвичай їх вказують через макроси препроцесора у налаштуваннях проекту.

Далі ми додамо свій параметр і подивимося, як ним керувати через xcodebuild.

Пару слів про препроцесори, директиви та макроси

Препроцесор С/С++(англ.pre processor, передобробник) - програма, що готує код мовою C/C++ до компіляції.

Директивоюпрепроцесора називається рядок у вихідному коді, що має наступний формат:#ключове_слово параметри

Напевно, зустрічали в коді такі директиви:

  • #include - вставка (включення) вмісту довільного файлу;
  • #define - макропідстановки;
  • #if, #ifdef, #elif, #else, #endif - умовна компіляція;

Макрос - фрагмент код, якому дали ім'я. Де ім'я не використовувалося, воно замінюється на вміст макросу. Є два типи макросів: object-like та function-like. Відмінність переважно у тому формі. Одні схожі об'єкти, інші функції.

Приклад object-like макросу

Приклад function-like макросу

Макрос препроцесора в налаштуваннях проекту Xcode

Щоб оголосити свій макрос препроцесора в налаштуваннях Xcode для цього потрібно:

Оголосити User-Defined параметр

  • Якщо для всіх target'ів одразу — то в project setting, якщо для певного target'a то до нього.
  • Вибрати вкладкуBuild Settings
  • Знайти ЗаголовокUser Defined
  • Додати потрібне налаштування

xcode

Вказати макрос для Apple LLVM 7.0 -Preprocessing

  • Шукаємо Apple LLVM 7.0-Preprocessing
  • У рядку з Processor Macros додаємо ім'я макросу та присвоюємо йому значення параметра API_URL=$. У разі ім'я макросу збігається з ім'ям параметра(User-Defined).

налаштування

У вікні відразу підхопиться зазначене налаштування для макросу

Для Debug та Release вказуйте окремо.

Тепер у коді ми можемо використовувати цей макрос

Але цей код не скомпілюється т.к. Значення макросу не є NSString.

Preprocessor macros string

Тут два рішення:

  • Модифікувати значення макросу (привести до NSString)
  • Використовувати макрос для перекладу значення в NSString

Для першого рішення необхідно «забікслішити» значення макросу —\@\»https://firebaseio.com»

Для другого написати ще один макрос:

Але для другого варіанта знову не все гладко. Подвійний слєш (\\) в URL не розпізнається і виходить рядок виду "http:" - урізаний.

З подвійним слешем боротися не так просто. Пропонують різні варіанти ескейпу:

Але в мене жоден не заробив

Можна доопрацювати макрос перекладу

Але цей код якось «пахне».

Прокидання макросів через xcodebuild

Якщо у вас є CI сервер (TeamCity або інший), то ви, можливо, стикалися з консольною збіркою проекту. Типове складання виглядає так:

У черговому збиранні ми хочемо змінити API_URL, як це зробити?

Існує кілька параметрів для макросів згідно XCODE BUILD SETTING REFERENCE

Ось нам і потрібні GCC_PREPROCESSOR_DEFINITIONS. Тепер команда збірки виглядатиме так:

Список макросів вказується через пропуск.

Налаштування info.plist?

Якщо ви вирішили змінити номер складання, ім'я програми та багато іншого, щовказується в info.plist, це все можна зробити через USER-DEFINED settings. Прописуєте свій параметр і додаєте його під час збирання

І додаєте його в info.plist - $

ВідрізниGCC_PREPROCESSOR_DEFINITIONS від USER_DEFINED settings?

GCC_PREPROCESSOR_DEFINITIONS доступні в коді, а USER_DEFINED settings - ні