Pergunta

Estou a escrever algum código semi-portáteis e quer ser capaz de detectar quando estou compilando para iPhone. Então eu quero algo como #ifdef IPHONE_SDK....

Presumivelmente Xcode define alguma coisa, mas eu não posso ver qualquer coisa sob propriedades do projeto, e Google não é de muita ajuda.

Foi útil?

Solução

É na documentação SDK em "compilar o código fonte condicionalmente"

As definições relevantes são TARGET_OS_IPHONE (e ele obsoleta TARGET_IPHONE_SIMULATOR), que são definidos em /usr/include/TargetConditionals.h no âmbito iOS. Em versões anteriores do conjunto de ferramentas, você tinha que escrever:

#include "TargetConditionals.h"

mas isso não é mais necessário no atual (xCode 6 / iOS8) toolchain.

Assim, por exemplo, se você quiser compilar apenas um bloco de código se você está construindo para o dispositivo, então você deve fazer

#if !(TARGET_OS_SIMULATOR)
...
#endif

Outras dicas

Para olhar para todas as macros definidos, adicione aos "Outros Flags C" de sua configuração construção:

-g3 -save-temps -dD

Você vai ter alguns erros de compilação, mas o compilador vai despejar todas as define em arquivos .MI no diretório raiz do seu projeto. Você pode usar o grep para olhar para eles, por exemplo:

grep define main.mi 

Quando estiver pronto, não se esqueça de remover estas opções a partir da configuração de compilação.

As respostas a esta pergunta não é totalmente correcta. A questão da plataforma e hardware vs Simulator é ortogonal.

Não use a arquitetura como um atalho para a detecção de plataforma ou simulador! Este tipo de pensamento desleixado tem causado muitos, muitos programadores muita azia e dor de cabeça ao longo dos anos.

Aqui está um gráfico ASCII dos condicionais. Os nomes não necessariamente faz sentido por razões históricas:

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

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MAC é verdade para todas as plataformas da Apple.


TARGET_OS_OSX é verdade apenas para MacOS

TARGET_OS_IPHONE é verdade para iOS, watchOS e tvOS (dispositivos e simuladores)


TARGET_OS_IOS é verdade apenas para iOS (dispositivos e simuladores)

TARGET_OS_WATCH é verdade apenas para watchOS (dispositivos e simuladores)

TARGET_OS_TV é verdade apenas para tvOS (dispositivos e simuladores)


TARGET_OS_EMBEDDED é verdade apenas para iOS / watchOS / hardware tvOS

TARGET_OS_SIMULATOR é verdade apenas para o Simulator.


Eu também vai notar que você pode conditionalize configurações em arquivos 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top