web-dev-qa-db-fra.com

Quelles # définitions sont configurées par Xcode lors de la compilation pour iPhone

J'écris du code semi-portable et je veux pouvoir détecter quand je compile pour iPhone. Je veux donc quelque chose comme #ifdef IPHONE_SDK....

Vraisemblablement, Xcode définit quelque chose, mais je ne vois rien sous les propriétés du projet, et Google n'est pas d'une grande aide.

64
Airsource Ltd

Il se trouve dans la documentation du SDK sous "Compilation conditionnelle du code source"

Les définitions pertinentes sont TARGET_OS_IPHONE (et il a déprécié TARGET_IPHONE_SIMULATOR), qui sont définies dans /usr/include/TargetConditionals.h dans le cadre iOS. Sur les versions antérieures de la chaîne d'outils, vous deviez écrire:

#include "TargetConditionals.h"

mais cela n'est plus nécessaire sur la chaîne d'outils actuelle (xCode 6/iOS8).

Ainsi, par exemple, si vous souhaitez uniquement compiler un bloc de code si vous construisez pour le périphérique, vous devez faire

#if !(TARGET_OS_SIMULATOR)
...
#endif
113
Airsource Ltd

Pour regarder toutes les macros définies, ajoutez ceci aux "Autres drapeaux C" de votre configuration de build:

-g3 -save-temps -dD

Vous obtiendrez quelques erreurs de construction, mais le compilateur videra toutes les définitions dans des fichiers .mi dans le répertoire racine de votre projet. Vous pouvez utiliser grep pour les consulter, par exemple:

grep define main.mi 

Lorsque vous avez terminé, n'oubliez pas de supprimer ces options du paramètre de génération.

24
lajos

Les réponses à cette question ne sont pas tout à fait correctes. La question de la plateforme et du matériel vs Simulator est orthogonale.

N'utilisez pas l'architecture comme raccourci pour la détection de plate-forme ou de simulateur! Ce genre de réflexion bâclée a causé beaucoup, beaucoup de programmeurs de brûlures d'estomac et de maux de tête au fil des ans.

Voici un graphique ASCII des conditions. Les noms n'ont pas nécessairement de sens pour des raisons historiques:

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

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MAC est vrai pour toutes les plates-formes Apple Apple.


TARGET_OS_OSX n'est vrai que pour macOS

TARGET_OS_IPHONE est vrai pour iOS, watchOS et tvOS (appareils et simulateurs)


TARGET_OS_IOS n'est vrai que pour iOS (appareils et simulateurs)

TARGET_OS_WATCH n'est vrai que pour watchOS (appareils et simulateurs)

TARGET_OS_TV est vrai uniquement pour tvOS (appareils et simulateurs)


TARGET_OS_EMBEDDED est vrai uniquement pour le matériel iOS/watchOS/tvOS

TARGET_OS_SIMULATOR n'est vrai que pour le simulateur.


Je noterai également que vous pouvez conditionner les paramètres dans les fichiers xcconfig par plateforme:

//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*] = ...
1
russbishop