Значение Info.plist как C ++ #define - PullRequest
6 голосов
/ 24 февраля 2011

В проекте C ++ iOS (или любой другой Mac OS) есть простой способ сделать значение доступным как для настроек Info.pList, так и для кода в виде макроса препроцессора?

В идеале я хотел бы иметь что-то вроде этого

C ++ код:

#define MY_VERSION_STRING "1.0"

Info.pList

CFBundleVersion: ${MY_VERSION_STRING}

Или, альтернативно, есть ли способполучить значения из .pList в c ++?(Без ручного анализа .pList как xml.)

Ответы [ 6 ]

2 голосов
/ 14 октября 2011

Я знаю, что на этот вопрос уже дан ответ, но я добавлю свои два цента за потомство. Как упомянул Ричард выше, в Xcode есть несколько опций для предварительной обработки файлов Info.plist - наиболее актуальными для текущего вопроса являются «Preprocess Info.plist» и «Файл префикса Info.plist Preproixor».

Если информация о вашей версии определена, скажем, ver.h, вы можете включить ver.h в качестве файла префикса и обратиться к макросу версии непосредственно из Info.plist.

2 голосов
/ 24 февраля 2011

Возможно, это не лучшее решение, но вы можете использовать утилиту / usr / libexec / PlistBuddy в сценарии сборки, чтобы сгенерировать файл .h, содержащий определение со значением, извлеченным из plist.

Для выводазначение из списка:

/usr/libexec/PlistBuddy -c 'Print :Path:To:Key' filename.plist
1 голос
/ 05 сентября 2012

Все это легко выполнимо, без использования PlistBuddy, полностью используя настройки сборки.

вы создаете пользовательский параметр сборки для вашего проекта / цели либо в пользовательском интерфейсе Xcode, либо, если вы знакомы с файлами xcconfig, вы можете определить его там в полностью текстовой форме.

  1. вы создаете настройку MY_VERSION_STRING со значением 1.0 в качестве настройки сборки либо в Xcode, либо в файле xcconfig.
  2. в вашем Info.plist ваша строка CFBundleVersion будет иметь значение $ {MY_VERSION_STRING}
  3. вы включаете предварительную обработку Info.plist
  4. наконец, используйте переменную сборки GCC_PREPROCESSOR_DEFINITIONS. для этого параметра сборки вы можете указать значение MY_VERSION_STRING = $ {MY_VERSION_STRING}, что приведет к тому, что определение вашего определенного и общего набора параметров сборки будет доступно для вашего кода c / c ++ / obj-c, как если бы вы создали его как # define
0 голосов
/ 02 октября 2012

Если вы используете #define ..., вы должны использовать в ключе .plist MY_VERSION_STRING, а не $ {MY_VERSION_STRING}.Это также работает с «префиксным файлом Info.plist».В обоих случаях не забудьте установить «Preprocess Info.plist File».

0 голосов
/ 25 февраля 2011

Если кто-то захочет сделать то же самое, это сценарий, который я добавил к цели перед этапом компиляции:

VERSION=`/usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' Info.plist`

echo "#define VERSION_STRING L\"$VERSION\"" > Version.h
0 голосов
/ 24 февраля 2011

Список свойств может также хранить массивы или некоторые двоичные данные. Как вы это представляете? Это очень специфично для домена. Так что, если вы точно знаете, как вы хотите, чтобы каждый тип был представлен в C ++, вы должны либо проанализировать plist-файл и сгенерировать код C ++, будь то директивы препроцессора, либо некоторый код, определяющий массивы, перечисления и т. Д. Есть PlistBuddy и * Доступно 1002 * инструмента, но они вряд ли помогут. Для меня проще всего было бы использовать perl, подробности см. Использование Perl для управления файлами Plist .

Удачи!

...