281 votes

Comment puis-je déterminer par programmation si mon application est en cours d'exécution dans le simulateur d'iphone?

Comme la question des états, je voudrais principalement voudrais savoir si mon code est exécuté dans le simulateur, mais serait également intéressé à connaître les version iphone qui est en cours d'exécution ou simulée.

EDIT: j'ai ajouté le mot "par programme" à la question du nom. Le point de ma question est de pouvoir dynamiquement inclure / exclure le code en fonction de la version / simulateur est en cours d'exécution, donc j'aimerais vraiment être à la recherche de quelque chose comme un pré-processeur de la directive qui peut me donner cette info.

362voto

Airsource Ltd Points 14291

Déjà demandé, mais avec un tout autre titre.

http://stackoverflow.com/questions/146986/what-defines-are-setup-by-xcode-when-compiling-for-iphone

Je vais répéter ma réponse à partir de là:

C'est dans le SDK docs sous "la Compilation du code source conditionnellement"

Les définitions pertinentes sont TARGET_OS_IPHONE et TARGET_IPHONE_SIMULATOR, qui seront définies à la condition que vous

#include "TargetConditionals.h"

Depuis que de ne pas exister non sur les plateformes apple, vous pouvez envelopper votre comme ceci

#ifdef __APPLE__
   #include "TargetConditionals.h"
#endif

avant d'inclure ce fichier

Ainsi, par exemple, si vous voulez vous assurer que vous êtes en cours d'exécution sur l'appareil, vous devez le faire

#if !(TARGET_IPHONE_SIMULATOR)

106voto

Pete Points 2065

Ce code va vous dire si vous exécutez dans un simulateur.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif

Qui pourrait être problématique en fonction de si certaines choses sur le changement de plateforme. C'est également censé travailler officiellement.

#if TARGET_IPHONE_SIMULATOR
NSString *hello = @"Hello, iPhone simulator!";
#elif TARGET_OS_IPHONE
NSString *hello = @"Hello, device!";
#else
NSString *hello = @"Hello, unknown target!";
#endif

61voto

Daniel Magnusson Points 2945

Pas de pré-processeur de la directive, mais c'était ce que je cherchais quand je suis venu à cette question;

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}

55voto

Taranfx Points 2690

La meilleure façon de le faire est:

#if TARGET_IPHONE_SIMULATOR

et pas

#ifdef TARGET_IPHONE_SIMULATOR

depuis sa toujours défini: 0 ou 1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X