Wie in der Frage angegeben, möchte ich hauptsächlich wissen, ob mein Code im Simulator ausgeführt wird oder nicht, wäre aber auch daran interessiert, die spezifische iPhone-Version zu kennen, die ausgeführt wird oder simuliert wird.
EDIT: Ich habe das Wort 'programmatisch' zum Fragennamen hinzugefügt. Der Punkt meiner Frage ist, in der Lage zu sein, Code dynamisch einzuschließen / auszuschließen, abhängig davon, welche Version / welcher Simulator ausgeführt wird. Daher würde ich wirklich nach einer Vorprozessor-Direktive suchen, die mir diese Informationen liefern kann.
ios
objective-c
swift
xcode
ios-simulator
Jeffrey Meyer
quelle
quelle
Antworten:
Bereits gefragt, aber mit einem ganz anderen Titel.
Welche #defines werden von Xcode beim Kompilieren für das iPhone eingerichtet?
Ich werde meine Antwort von dort wiederholen:
Es befindet sich in den SDK-Dokumenten unter "Quellcode bedingt kompilieren".
Die relevante Definition ist TARGET_OS_SIMULATOR, die in /usr/include/TargetConditionals.h innerhalb des iOS-Frameworks definiert ist. In früheren Versionen der Toolchain mussten Sie schreiben:
Dies ist jedoch in der aktuellen Toolchain (Xcode 6 / iOS8) nicht mehr erforderlich.
Wenn Sie beispielsweise überprüfen möchten, ob Sie auf einem Gerät ausgeführt werden, sollten Sie dies tun
je nachdem, was für Ihren Anwendungsfall geeignet ist.
quelle
Aktualisierter Code:
Dies soll offiziell funktionieren.
Ursprünglicher Beitrag (da veraltet)
Dieser Code zeigt an, ob Sie in einem Simulator ausgeführt werden.
quelle
Keine Vorprozessor-Direktive, aber das war es, wonach ich gesucht habe, als ich zu dieser Frage kam.
quelle
[model compare:iPhoneSimulator] == NSOrderedSame
sollte geschrieben werden als[model isEqualToString:iPhoneSimulator]
[model hasSuffix:@"Simulator"]
wenn Sie sich nur für "Simulator" im Allgemeinen interessieren, nicht für iPhone oder iPad im Besonderen. Diese Antwort funktioniert nicht für iPad Simulator :)name
anstelle vonmodel
Simulator
seinem Gerätenamen ein Wort hinzufügtDer beste Weg, dies zu tun, ist:
und nicht
da es immer definiert ist: 0 oder 1
quelle
ES GIBT JETZT EINEN BESSEREN WEG!
Ab Xcode 9.3 Beta 4 können Sie dies
#if targetEnvironment(simulator)
überprüfen.UPDATE
Xcode 10 und iOS 12 SDK unterstützen dies ebenfalls.
quelle
Im Falle von Swift können wir Folgendes implementieren
Wir können eine Struktur erstellen, mit der Sie strukturierte Daten erstellen können
Dann, wenn wir erkennen wollten, ob eine App für ein Gerät oder einen Simulator in Swift erstellt wird.
quelle
#if #else #endif
wird besser.Funktioniert für
Swift 5
undXcode 11.3.1
Verwenden Sie diesen Code:
quelle
Alle diese Antworten sind gut, aber es verwirrt Neulinge wie mich irgendwie, da es die Kompilierungsprüfung und die Laufzeitprüfung nicht klarstellt. Präprozessor sind vor der Kompilierungszeit, aber wir sollten es klarer machen
Dieser Blog-Artikel zeigt, wie man den iPhone-Simulator erkennt. deutlich
Laufzeit
Lassen Sie uns zunächst kurz diskutieren. UIDevice bietet Ihnen bereits Informationen zum Gerät
Sie erhalten "iPhone Simulator" oder "iPhone" zurück, je nachdem, wo die App ausgeführt wird.
Kompilierzeit
Sie möchten jedoch die Kompilierungszeit definieren. Warum? Weil Sie Ihre App ausschließlich so kompilieren, dass sie entweder im Simulator oder auf dem Gerät ausgeführt wird. Apple macht eine Definition namens
TARGET_IPHONE_SIMULATOR
. Schauen wir uns also den Code an:quelle
[[UIDevice currentDevice] model]
kehrtiPhone
auch stattiPhone Simulator
. Ich denke, dies ist nicht der beste Ansatz.Die vorherigen Antworten sind etwas veraltet. Ich habe festgestellt, dass Sie nur das
TARGET_IPHONE_SIMULATOR
Makro abfragen müssen (Sie müssen keine anderen Header-Dateien einfügen [vorausgesetzt, Sie codieren für iOS]).Ich habe es versucht,
TARGET_OS_IPHONE
aber es hat den gleichen Wert (1) zurückgegeben, wenn es auf einem tatsächlichen Gerät und Simulator ausgeführt wird. Deshalb empfehle ich,TARGET_IPHONE_SIMULATOR
stattdessen zu verwenden.quelle
In Kürze:
Von Erkennen, ob in Swift eine App für ein Gerät oder einen Simulator erstellt wird
quelle
Ich hatte das gleiche Problem, beide
TARGET_IPHONE_SIMULATOR
undTARGET_OS_IPHONE
sind immer definiert und auf 1 gesetzt. Petes Lösung funktioniert natürlich, aber wenn Sie jemals auf etwas anderem als Intel aufbauen (unwahrscheinlich, aber wer weiß), ist hier etwas, das sicher ist Solange sich die iPhone-Hardware nicht ändert (Ihr Code funktioniert also immer für die derzeit verfügbaren iPhones):Stellen Sie das an einen geeigneten Ort und tun Sie dann so, als wären die
TARGET_*
Konstanten korrekt definiert.quelle
Hat jemand die hier gegebene Antwort berücksichtigt ?
Ich nehme an, das Ziel-c-Äquivalent wäre
quelle
Für Swift 4.2 / xCode 10
Ich habe eine Erweiterung für UIDevice erstellt, damit ich leicht fragen kann, ob der Simulator ausgeführt wird.
In meinem AppDelegate verwende ich diese Methode zum Beispiel, um zu entscheiden, ob eine Registrierung für eine Remote-Benachrichtigung erforderlich ist, was für den Simulator nicht möglich ist.
quelle
Um alle Arten von "Simulatoren" einzuschließen
quelle
-[NSString containsString]
?Mit Swift 4.2 (Xcode 10) können wir dies tun
quelle
Meine Antwort basiert auf der Antwort von @Daniel Magnusson und den Kommentaren von @Nuthatch und @ n.Drake. und ich schreibe es, um Zeit für schnelle Benutzer zu sparen, die an iOS9 und höher arbeiten.
Das hat bei mir funktioniert:
quelle
Simulator
seinem Gerätenamen ein Wort hinzufügtUIDevice.current.name
meldet XCode 8 den Namen des Computers, auf dem der Simulator ausgeführt wird (normalerweise so etwas wie "Simons MacBook Pro"), sodass der Test unzuverlässig geworden ist. Ich bin immer noch auf der Suche nach einem sauberen Weg, um das Problem zu beheben./// Gibt true zurück, wenn der Simulator und kein Gerät vorhanden sind
quelle
Apple hat folgende Unterstützung für die Überprüfung der App für den Simulator hinzugefügt:
quelle
Wenn nichts funktioniert hat, versuchen Sie dies
quelle
Meiner Meinung nach die Antwort (oben dargestellt und unten wiederholt):
ist die beste Antwort, da sie offensichtlich bei RUNTIME ausgeführt wird und keine COMPILE DIRECTIVE ist.
quelle
Das hat bei mir am besten funktioniert
quelle
"iPhone"
.