Frage

Wie die Frage Staaten, würde ich vor allem gerne wissen, ob mein Code im Simulator läuft, aber es würde auch interessiert die spezifische iphone-Version in dem Wissen, dass simuliert läuft oder wird.

EDIT: Ich habe das Wort ‚programmatisch‘ auf die Frage Namen. Der Punkt meiner Frage ist in der Lage sein, Code dynamisch / Ausschluss je nachdem, welche Version / Simulator läuft, so würde ich wirklich für so etwas wie ein Pre-Prozessor-Direktive suchen, die mir diese Informationen zur Verfügung stellen können.

War es hilfreich?

Lösung

Bereits gefragt, aber mit einem ganz anderen Titeln.

Welche #defines werden von Xcode eingerichtet, wenn Kompilieren für iPhone

Ich werde meine Antwort wiederholen von dort:

Es ist in der SDK-Dokumentation unter „Quellcode kompilieren bedingt“

Die entsprechende Definition ist TARGET_OS_SIMULATOR, die in /usr/include/TargetConditionals.h im iOS Rahmen definiert ist. Bei früheren Versionen des Werkzeugkette, mußte man schreiben:

#include "TargetConditionals.h"

, aber das ist nicht mehr notwendig, auf dem aktuellen (Xcode 6 / iOS8) Toolchain.

So zum Beispiel, wenn Sie überprüfen möchten, dass Sie auf dem Gerät ausgeführt werden, sollten Sie tun,

#if TARGET_OS_SIMULATOR
    // Simulator-specific code
#else
    // Device-specific code
#endif

je nachdem, welche für Ihren Anwendungsfall geeignet ist.

Andere Tipps

Aktualisiert Code:

Dies ist angeblich offiziell zu arbeiten.

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

Original-Beitrag (seit deprecated)

Dieser Code wird Ihnen sagen, wenn Sie in einem Simulator ausgeführt werden.

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

Nicht Pre-Prozessor-Direktive, aber das war, was ich gesucht habe, als ich auf diese Frage kam;

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

Der beste Weg, dies zu tun ist:

#if TARGET_IPHONE_SIMULATOR

und nicht

#ifdef TARGET_IPHONE_SIMULATOR

seit seinem immer definiert: 0 oder 1

Es gibt eine bessere WAY NOW!

Wie von Xcode 9.3 Beta 4 Sie können #if targetEnvironment(simulator) verwenden zu überprüfen.

#if targetEnvironment(simulator)
//Your simulator code
#endif

UPDATE
10 Xcode und iOS 12 SDK unterstützt dies auch.

Bei Swift können wir implementieren

Wir können Struktur erstellen, die Sie ein strukturierten Daten erstellen kann

struct Platform {
    static let isSimulator: Bool = {
        #if arch(i386) || arch(x86_64)
            return true
        #endif
        return false
    }()
}

Dann Wenn wir erkennen wollen, wenn App wird dann für Gerät oder Simulator in Swift gebaut.

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}

Alle, Antwort ist gut, aber es verwirrt irgendwie Neuling wie ich, da es nicht die Kompilierung Kontrolle und Laufzeitprüfung nicht klären. Preprocessor werden, bevor die Zeit kompilieren, aber wir sollten es deutlicher machen

Dieser Blog Artikel zeigt Wie zu erkennen, das iPhone Simulator? klar

Runtime

Zunächst einmal wollen wir kurz besprechen. UIDevice liefert Ihnen bereits Informationen über das Gerät

[[UIDevice currentDevice] model]

kehren Sie „iPhone Simulator“ oder „iPhone“ je nachdem, wo die App ausgeführt wird.

Übersetzen Zeit

Doch was wollen Sie ist an der Zeit definiert zu verwenden, kompilieren. Warum? Da Sie Ihre App streng kompilieren, um entweder im Simulator oder auf dem Gerät ausgeführt werden. Apple macht ein genannt TARGET_IPHONE_SIMULATOR definieren. Also lassen Sie sich auf dem Code aussehen:

#if TARGET_IPHONE_SIMULATOR

NSLog(@"Running in Simulator - no app store or giro");

#endif

Werke für Swift 4 und Xcode 9.4.1

Mit diesem Code:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif

Die bisherigen Antworten sind ein wenig veraltet. Ich fand, dass alles, was Sie tun müssen, ist die TARGET_IPHONE_SIMULATOR Makro abfragen ( keine Notwendigkeit, alle anderen Header-Dateien enthalten [vorausgesetzt, Sie Codierung für iOS]).

Ich versuchte TARGET_OS_IPHONE aber es gab den gleichen Wert (1), wenn auf einem Gerät und Simulator läuft, deshalb habe ich mit TARGET_IPHONE_SIMULATOR empfehlen statt.

In swift:

#if (arch(i386) || arch(x86_64))
...            
#endif

erkennen, ob App wobei für Gerät oder Simulator in Swift gebaut

Ich hatte das gleiche Problem, beide TARGET_IPHONE_SIMULATOR und TARGET_OS_IPHONE sind immer definiert und auf 1 gesetzt Petes Lösung funktioniert, natürlich, aber wenn Sie jemals auf etwas anderes als Intel passieren zu bauen (unwahrscheinlich, aber wer weiß), hier ist etwas, das so lange sicher ist wie das iPhone Hardware nicht ändert (so wird Ihr Code immer für die iphones arbeitet zur Zeit da draußen):

#if defined __arm__ || defined __thumb__
#undef TARGET_IPHONE_SIMULATOR
#define TARGET_OS_IPHONE
#else
#define TARGET_IPHONE_SIMULATOR 1
#undef TARGET_OS_IPHONE
#endif

Setzen Sie das irgendwo bequem, und dann so tun, dass der TARGET_* Konstanten korrekt definiert wurde.

Für Swift 4.2 / xCode 10

Ich habe eine Erweiterung auf UIDevice, so kann ich für leicht fragen, ob der Simulator ausgeführt wird.

// UIDevice+CheckSimulator.swift

import UIKit

extension UIDevice {

    /// Checks if the current device that runs the app is xCode's simulator
    static func isSimulator() -> Bool {        
        #if targetEnvironment(simulator)
            return true
        #else
            return false
        #endif
    }
}

In meinem AppDelegate zum Beispiel ich diese Methode verwenden, um zu entscheiden, ob für die Fernbenachrichtigung Registrierung erforderlich, die für den Simulator nicht möglich ist.

// CHECK FOR REAL DEVICE / OR SIMULATOR
if UIDevice.isSimulator() == false {

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}

Hat jemand die Antwort zur Verfügung gestellt hier ?

Ich nehme an, das Objective-C entsprechen würde

+ (BOOL)isSimulator {
    NSOperatingSystemVersion ios9 = {9, 0, 0};
    NSProcessInfo *processInfo = [NSProcessInfo processInfo];
    if ([processInfo isOperatingSystemAtLeastVersion:ios9]) {
        NSDictionary<NSString *, NSString *> *environment = [processInfo environment];
        NSString *simulator = [environment objectForKey:@"SIMULATOR_DEVICE_NAME"];
        return simulator != nil;
    } else {
        UIDevice *currentDevice = [UIDevice currentDevice];
        return ([currentDevice.model rangeOfString:@"Simulator"].location != NSNotFound);
    }
}

Um alle Arten von "Simulatoren" enthalten

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}

Mit Swift 4.2 (Xcode 10), wir können dies tun,

#if targetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif

Meine Antwort basiert auf @ Daniel Magnusson Antwort und Kommentare von @Nuthatch und @ n.Drake. und ich schreibe es einige Zeit für eine schnellen Benutzer sparen auf iOS9 arbeiten und weiter.

Das ist was für mich gearbeitet:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}

/// true zurück, wenn sein Simulator und kein Gerät

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}

Apple hat Unterstützung für die App Überprüfung für den Simulator mit folgenden ausgerichtet ist:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif

, wenn nichts funktioniert, versuchen Sie dies

public struct Platform {

    public static var isSimulator: Bool {
        return TARGET_OS_SIMULATOR != 0 // Use this line in Xcode 7 or newer
    }

}

Das funktionierte gut für mich

NSString *name = [[UIDevice currentDevice] name];


if ([name isEqualToString:@"iPhone Simulator"]) {

}

Meiner Meinung nach ist die Antwort (oben dargestellte und wiederholte unten):

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

ist die beste Antwort, weil es offensichtlich bei RUNTIME gegen seine eine KOMPILIEREN RICHTLINIE ausgeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top