Налаштування макросів препроцесора в 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
- Додати потрібне налаштування

Вказати макрос для 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 - ні