Pregunta

Estoy escribiendo algunos códigos semi-portátiles y quiero poder detectarlos cuando compilo para iPhone. Así que quiero algo como #ifdef IPHONE_SDK ... .

Presumiblemente, Xcode define algo, pero no puedo ver nada en las propiedades del proyecto, y Google no es de mucha ayuda.

¿Fue útil?

Solución

Está en los documentos del SDK en " Compilando el código fuente de forma condicional "

Las definiciones relevantes son TARGET_OS_IPHONE (y él está en desuso TARGET_IPHONE_SIMULATOR), que se definen en /usr/include/TargetConditionals.h dentro del marco de iOS. En versiones anteriores de la cadena de herramientas, tenía que escribir:

#include "TargetConditionals.h"

pero esto ya no es necesario en la cadena de herramientas actual (xCode 6 / iOS8).

Entonces, por ejemplo, si solo desea compilar un bloque de código si está construyendo para el dispositivo, debería hacerlo

#if !(TARGET_OS_SIMULATOR)
...
#endif

Otros consejos

Para ver todas las macros definidas, agregue esto a las " Otras banderas C " de su configuración de construcción:

-g3 -save-temps -dD

Obtendrá algunos errores de compilación, pero el compilador volcará todas las definiciones en archivos .mi en el directorio raíz de su proyecto. Puedes usar grep para mirarlos, por ejemplo:

grep define main.mi 

Cuando hayas terminado, no olvides eliminar estas opciones de la configuración de compilación.

Las respuestas a esta pregunta no son del todo correctas. La cuestión de la plataforma y el hardware vs Simulator es ortogonal.

¡No use la arquitectura como acceso directo para la detección de plataformas o simuladores! Este tipo de pensamiento descuidado ha causado a muchos programadores una gran cantidad de acidez estomacal y dolor de cabeza a lo largo de los años.

Aquí hay una tabla ASCII de los condicionales. Los nombres no necesariamente tienen sentido por razones históricas:

+--------------------------------------+
|             TARGET_OS_MAC            |
| +---+  +---------------------------+ |
| |   |  |      TARGET_OS_IPHONE     | |
| |OSX|  | +-----+ +----+ +-------+  | |
| |   |  | | IOS | | TV | | WATCH |  | |
| |   |  | +-----+ +----+ +-------+  | |
| +---+  +---------------------------+ |
+--------------------------------------+

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MAC es válido para todas las plataformas de Apple.


TARGET_OS_OSX es verdadero solo para macOS

TARGET_OS_IPHONE es válido para iOS, watchOS y tvOS (dispositivos y simuladores)


TARGET_OS_IOS solo es válido para iOS (dispositivos y simuladores)

TARGET_OS_WATCH solo es válido para watchOS (dispositivos y simuladores)

TARGET_OS_TV es válido solo para tvOS (dispositivos y simuladores)


TARGET_OS_EMBEDDED se cumple solo para el hardware de iOS / watchOS / tvOS

TARGET_OS_SIMULATOR solo es válido para el simulador.


También veré que puedes condicionalizar la configuración en los archivos xcconfig por plataforma:

//macOS only
SOME_SETTING[sdk=macosx] = ...

//iOS (device & simulator)
SOME_SETTING[sdk=iphone*] = ...
//iOS (device)
SOME_SETTING[sdk=iphoneos*] = ...
//iOS (simulator)
SOME_SETTING[sdk=iphonesimulator*] = ...

//watchOS (device & simulator)
SOME_SETTING[sdk=watch*] = ...
//watchOS (device)
SOME_SETTING[sdk=watchos*] = ...
//watchOS (simulator)
SOME_SETTING[sdk=watchsimulator*] = ...

//tvOS (device & simulator)
SOME_SETTING[sdk=appletv*] = ...
//tvOS (device)
SOME_SETTING[sdk=appletvos*] = ...
//tvOS (simulator)
SOME_SETTING[sdk=appletvsimulator*] = ...

// iOS, tvOS, or watchOS Simulator
SOME_SETTING[sdk=embeddedsimulator*] = ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top