Valor Info.plist como C ++ #define

En un proyecto C ++ iOS (o cualquier otro sistema operativo Mac), ¿hay una forma sencilla de hacer que un valor esté disponible tanto para la configuration de Info.pList como para el código en forma de una macro de preprocesador?

Idealmente, me gustaría tener algo como esto

Código C ++:

#define MY_VERSION_STRING "1.0" 

Info.pList

 CFBundleVersion: ${MY_VERSION_STRING} 

O bien, ¿hay alguna forma de get valores de .pList en c ++? (Sin analizar manualmente el .pList como xml).

Probablemente no sea la mejor solución, pero podría usar la utilidad / usr / libexec / PlistBuddy en un script de compilation para generar un file .h que contenga un valor definido con un valor extraído del plist.

Para generar un valor de un plist:

 /usr/libexec/PlistBuddy -c 'Print :Path:To:Key' filename.plist 

Sé que esto ya ha sido respondido, pero voy a agregar mis dos centavos para la posteridad. Como Richard mencionó anteriormente, Xcode tiene un par de opciones para el preprocesamiento de files Info.plist: los más relevantes para la pregunta actual son "Preprocess Info.plist" e "Archivo de prefijos Preprocesador Info.plist".

Si la información de su versión se define en, digamos ver.h , puede include ver.h como el file de prefijo y consultar la macro de la versión directamente desde Info.plist.

Todo esto es factible sin involucrar a PlistBuddy en absoluto, utilizando por completo la configuration de compilation.

usted crea una configuration de compilation definida por el usuario para su proyecto / destino en la interfaz de usuario de Xcode o si está familiarizado con los files de xcconfig, puede definirlo allí en un formatting completamente textual.

  1. usted crea su configuration MY_VERSION_STRING con un valor de 1.0 como su configuration de compilation en Xcode o en un file xcconfig.
  2. en su Info.plist su línea CFBundleVersion tendría un valor de $ {MY_VERSION_STRING}
  3. enciende el preprocesamiento Info.plist
  4. Por último, utilice la variable de compilation GCC_PREPROCESSOR_DEFINITIONS. para esa configuration de compilation, puede especificar un valor de MY_VERSION_STRING = $ {MY_VERSION_STRING} que dará como resultado que la definición de configuration de compilation definida y compartida esté disponible en su código c / c ++ / obj-c como si lo hubiera creado como un #define

La list de properties también puede almacenar matrices o algunos datos binarys. Como representas eso Es muy específico del dominio. Por lo tanto, si sabe exactamente cómo desea que cada tipo se represente en C ++, debe analizar el file Plist y generar el código C ++, las directivas del preprocesador o algún código que defina matrices, enumeraciones, etc. Existen herramientas PlistBuddy y plutil disponibles , pero probablemente no serán de mucha ayuda. La forma más fácil para mí sería usar perl , vea Uso de Perl para administrar files de Plist para más detalles.

¡Buena suerte!

En caso de que alguien quiera hacer lo mismo, este es el script que agregué al objective antes de la fase de compilation:

 VERSION=`/usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' Info.plist` echo "#define VERSION_STRING L\"$VERSION\"" > Version.h 

Si utiliza #define …, debe usar en la key .plist, MY_VERSION_STRING, y no $ {MY_VERSION_STRING}. Esto también funciona con el "Archivo de prefijos del Preprocesador Info.plist". En ambos casos, no olvide configurar "Preprocess Info.plist File".