Las respuestas a esta pregunta no son del todo correctas. La cuestión de la plataforma y el hardware frente a Simulator es ortogonal.
¡No utilice la arquitectura como atajo para la detección de plataforma o simulador! Este tipo de pensamiento descuidado ha causado muchos, muchos programadores una gran cantidad de acidez estomacal y dolor de cabeza en los últimos años.
Aquí hay un gráfico 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 cierto para todas las plataformas de Apple.
TARGET_OS_OSX es cierto sólo para MacOS
TARGET_OS_IPHONE es cierto para iOS, watchos, y TVOS (dispositivos & simuladores)
TARGET_OS_IOS es cierto sólo para iOS (dispositivos & simuladores)
TARGET_OS_WATCH es cierto solo para watchOS (dispositivos & simuladores)
TARGET_OS_TV es cierto sólo para TVOS (dispositivos & simuladores)
TARGET_OS_EMBEDDED es cierto sólo para hardware IOS/watchos/TVOS
TARGET_OS_SIMULATOR es cierto sólo para el simulador.
También voy en cuenta que puede condicionar la configuración en xcconfig
archivos de la 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*] = ...
incluyendo condicionales objetivo es exactamente lo correcto, a continuación, utilizar #ifdef TARGET_OS_IPHONE – kritzikratzi
@kritzikratzi: #ifdef es incorrecto; debes usar #if. (El símbolo normalmente se define como 0 cuando no está en el simulador; #ifdef seguirá siendo verdadero.) – Andrew
Para aquellos de ustedes que también pensaron que TARGET_OS_IPHONE es una forma de detectar dispositivos, no lo es. Significa que estás en iOS, puede ser simulador o iphone. TARGET_IPHONE_SIMULATOR es la forma de detectar dispositivo vs. simulador. (Sé que no está implícito en la respuesta, pero ver IPHONE conduce a mi error) –