Comme l'indique la question, je voudrais principalement savoir si mon code fonctionne ou non dans le simulateur, mais je serais également intéressé à connaître la version spécifique de l'iPhone qui fonctionne ou est simulée.
EDIT: J'ai ajouté le mot «par programme» au nom de la question. Le point de ma question est de pouvoir inclure / exclure dynamiquement du code en fonction de la version / du simulateur en cours d'exécution, donc je chercherais vraiment quelque chose comme une directive de pré-processeur qui peut me fournir ces informations.
ios
objective-c
swift
xcode
ios-simulator
Jeffrey Meyer
la source
la source
Réponses:
Déjà demandé, mais avec un titre très différent.
Quelles # définitions sont configurées par Xcode lors de la compilation pour iPhone
Je vais répéter ma réponse à partir de là:
C'est dans la documentation du SDK sous "Compilation conditionnelle du code source"
La définition pertinente est TARGET_OS_SIMULATOR, qui est définie dans /usr/include/TargetConditionals.h dans le cadre iOS. Sur les versions antérieures de la chaîne d'outils, vous deviez écrire:
mais cela n'est plus nécessaire sur la chaîne d'outils actuelle (Xcode 6 / iOS8).
Ainsi, par exemple, si vous souhaitez vérifier que vous exécutez sur l'appareil, vous devez faire
selon ce qui est approprié pour votre cas d'utilisation.
la source
Code mis à jour:
Il est censé fonctionner officiellement.
Message d'origine (déconseillé depuis)
Ce code vous indiquera si vous utilisez un simulateur.
la source
Pas de directive pré-processeur, mais c'est ce que je cherchais quand je suis arrivé à cette question;
la source
[model compare:iPhoneSimulator] == NSOrderedSame
devrait être écrit comme[model isEqualToString:iPhoneSimulator]
[model hasSuffix:@"Simulator"]
si vous ne vous souciez que du "simulateur" en général, pas de l' iPhone ou de l' iPad en particulier. Cette réponse ne fonctionnera pas pour le simulateur iPad :)name
au lieu demodel
Simulator
mot dans le nom de son appareilLa meilleure façon de procéder est:
et pas
puisque son toujours défini: 0 ou 1
la source
IL Y A UNE MEILLEURE FAÇON MAINTENANT!
À partir de Xcode 9.3 beta 4, vous pouvez utiliser
#if targetEnvironment(simulator)
pour vérifier.UPDATE
Xcode 10 et iOS 12 SDK le prennent également en charge.
la source
Dans le cas de Swift, nous pouvons implémenter ce qui suit
Nous pouvons créer une structure qui vous permet de créer une donnée structurée
Ensuite, si nous voulions détecter si l'application est en cours de création pour un appareil ou un simulateur dans Swift, alors.
la source
#if #else #endif
sera mieux.Fonctionne pour
Swift 5
etXcode 11.3.1
Utilisez ce code:
la source
Toutes ces réponses sont bonnes, mais cela dérange en quelque sorte les débutants comme moi car cela ne clarifie pas le contrôle de compilation et le contrôle d'exécution. Le préprocesseur est avant le moment de la compilation, mais nous devons le rendre plus clair
Cet article de blog montre comment détecter le simulateur iPhone? clairement
Durée
Tout d'abord, discutons brièvement. UIDevice vous fournit déjà des informations sur l'appareil
vous renverra "iPhone Simulator" ou "iPhone" selon l'endroit où l'application est en cours d'exécution.
Compiler le temps
Cependant, ce que vous voulez, c'est utiliser le temps de compilation définit. Pourquoi? Parce que vous compilez votre application strictement pour qu'elle soit exécutée à l'intérieur du simulateur ou sur l'appareil. Apple fait un définir appelé
TARGET_IPHONE_SIMULATOR
. Regardons donc le code:la source
[[UIDevice currentDevice] model]
revientiPhone
également à la place deiPhone Simulator
. Donc, je pense que ce n'est pas la meilleure approche.Les réponses précédentes sont un peu datées. J'ai trouvé que tout ce que vous devez faire est d'interroger la
TARGET_IPHONE_SIMULATOR
macro ( pas besoin d'inclure d'autres fichiers d'en-tête [en supposant que vous codez pour iOS]).J'ai essayé
TARGET_OS_IPHONE
mais il a retourné la même valeur (1) lors de l'exécution sur un appareil et un simulateur réels, c'est pourquoi je recommande d'utiliser à laTARGET_IPHONE_SIMULATOR
place.la source
En bref:
Depuis Détecter si l'application est en cours de création pour l'appareil ou le simulateur dans Swift
la source
J'ai eu le même problème, les deux
TARGET_IPHONE_SIMULATOR
etTARGET_OS_IPHONE
sont toujours définis, et sont définis sur 1. La solution de Pete fonctionne, bien sûr, mais s'il vous arrive de construire sur autre chose qu'Intel (peu probable, mais qui sait), voici quelque chose qui est sûr comme tant que le matériel de l'iphone ne change pas (donc votre code fonctionnera toujours pour les iphones actuellement disponibles):Mettez cela dans un endroit pratique, puis faites comme si le
TARGET_*
constantes étaient correctement définies.la source
Quelqu'un at-il considéré la réponse fournie ici ?
Je suppose que l'équivalent objectif c serait
la source
Pour Swift 4.2 / xCode 10
J'ai créé une extension sur UIDevice, donc je peux facilement demander si le simulateur fonctionne.
Dans mon AppDelegate par exemple, j'utilise cette méthode pour décider si l'enregistrement pour une notification à distance est nécessaire, ce qui n'est pas possible pour le simulateur.
la source
Pour inclure tous les types de "simulateurs"
la source
-[NSString containsString]
?Avec Swift 4.2 (Xcode 10), nous pouvons le faire
la source
Ma réponse est basée sur la réponse de @Daniel Magnusson et les commentaires de @Nuthatch et @ n.Drake. et je l'écris pour gagner du temps pour les utilisateurs rapides travaillant sur iOS9 et versions ultérieures.
C'est ce qui a fonctionné pour moi:
la source
Simulator
mot dans le nom de son appareilUIDevice.current.name
, le nom de la machine sur laquelle le simulateur est exécuté (généralement quelque chose comme "MacBook Pro de Simon" maintenant) indique que le test n'est plus fiable. Je cherche toujours un moyen propre de le réparer./// Renvoie vrai si son simulateur et non un appareil
la source
Apple a ajouté un support pour vérifier que l'application est ciblée pour le simulateur avec les éléments suivants:
la source
si rien ne fonctionne, essayez ceci
la source
À mon avis, la réponse (présentée ci-dessus et répétée ci-dessous):
est la meilleure réponse car elle est évidemment exécutée au RUNTIME par rapport à une DIRECTIVE DE COMPILATION.
la source
Cela a fonctionné le mieux pour moi
la source
"iPhone"
.