Настройване на макроси на препроцесор в Xcode

Рядко приложение се справя без конфигурационни параметри. iOS проектите не са изключение. Трябва да се посочи или URL адресът на сървъра, или параметърът за режим на отстраняване на грешки или демонстрация. Обикновено те се задават чрез макроси на предпроцесора в настройките на проекта.

След това ще добавим наш собствен параметър и ще видим как да го управляваме чрез xcodebuild.

Няколко думи за препроцесорите, директивите и макросите

C/C++препроцесор (pre processor, preprocessor) е програма, която подготвя C/C++ код за компилация.

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

Трябва да сте виждали следните директиви във вашия код:

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

Макро е част от код, на която е дадено име. Където и да се използва името, то се заменя със съдържанието на макроса. Има два типа макроси: обектни и функционални. Разликата е основно във формата им. Някои са като обекти, други са като функции.

Пример за обектоподобен макрос

Пример за макрос, подобен на функция

Макрос на препроцесора в настройките на проекта на Xcode

За да декларирате своя макрос на предпроцесора в настройките на Xcode, трябва да:

Декларирайте дефиниран от потребителя параметър

  • Ако за всички цели наведнъж, тогава в настройката на проекта, ако за конкретна цел, тогава в нея.
  • Изберете разделНастройки на компилация
  • Намерете заглавкаДефинирана от потребителя
  • Добавете желаната настройка

макроси

Посочете макрос за Apple LLVM 7.0 - Предварителна обработка

  • Търся Apple LLVM 7.0-Предварителна обработка
  • В реда с процесорни макроси добавете името на макроса и му присвоете стойността на параметъра API_URL=$. В този случай името на макроса е същото като името на параметъра (дефинирано от потребителя).

макроси

Прозорецът веднага ще избере определената настройка за макроса

Посочете отделно за Debug и Release.

Сега в кода можем да използваме този макрос

Но този код няма да се компилира. стойността на макроса не е NSString.

низ от макроси на препроцесора

Тук има две решения:

  • Промяна на макро стойности (прехвърляне към NSString)
  • Използвайте макрос за преобразуване на стойност в NSString

За първото решение трябва да "обратна наклонена черта" стойността на макроса -\@\"https://firebaseio.com\"

За втория напишете друг макрос:

Но за втория вариант отново не всичко върви гладко. Двойната наклонена черта (\\) в URL адреса не се разпознава и резултатът е низ като "http:" - съкратен.

Двойната наклонена черта не е толкова лесна за справяне. Те предлагат различни възможности за бягство:

Но нито един от тях не ми помогна

Можете да промените макроса за превод

Но този код някак "намирисва".

Препращане на макроси чрез xcodebuild

Ако имате CI сървър (TeamCity или друг), тогава може да сте попаднали на конзолна компилация на проекта. Типичната конструкция изглежда така:

В следващата компилация искаме да променим API_URL, как да го направим?

Има няколко опции за макроси според РЕФЕРЕНЦИЯТА ЗА НАСТРОЙКА НА XCODE BUILD

Ето GCC_PREPROCESSOR_DEFINITIONS, от които се нуждаем. Сега командата за изграждане ще изглежда така:

Списъкът с макроси е обозначен с интервал.

Задаване на info.plist?

Ако решите да промените номера на компилация, името на приложението и други, каквопосочени в info.plist, тогава всичко това може да се направи чрез ДЕФИНИРАНИ от ПОТРЕБИТЕЛЯ настройки. Напишете вашия параметър и го добавете по време на асемблирането

И го добавете към info.plist - $

РазликаGCC_PREPROCESSOR_DEFINITIONS от USER_DEFINED настройки?

GCC_PREPROCESSOR_DEFINITIONS са налични в код, но настройките USER_DEFINED не са