Come faccio a livello di programmazione determinare se la mia applicazione è in esecuzione nel simulatore iPhone?

voti
242

Come afferma questione, vorrei soprattutto per sapere se il mio codice è in esecuzione nel simulatore, ma vorrei anche essere interessati a conoscere la versione specifica per iPhone che è in esecuzione o in simulazione.

EDIT: ho aggiunto la parola 'programmazione' per il nome della domanda. Il punto della mia domanda è quello di essere in grado di includere dinamicamente / escludere il codice a seconda della versione / simulatore è in esecuzione, quindi mi piacerebbe davvero essere alla ricerca di qualcosa di simile a una direttiva di pre-processore che mi può fornire queste informazioni.

È pubblicato 19/01/2009 alle 17:55
fonte dall'utente
In altre lingue...                            


22 risposte

voti
333

Già chiesto, ma con un titolo molto diverso.

Cosa #defines sono istituiti da Xcode durante la compilazione per iPhone

Ripeto la mia risposta da lì:

E 'nella documentazione SDK in "compilazione del codice sorgente condizionale"

La definizione rilevante è TARGET_OS_SIMULATOR, che è definito nella /usr/include/TargetConditionals.h nel quadro iOS. Nelle versioni precedenti della toolchain, si doveva scrivere:

#include "TargetConditionals.h"

ma questo non è più necessario in corrente (Xcode 6 / iOS 8) toolchain è.

Così, per esempio, se si desidera verificare che si esegue sul dispositivo, si dovrebbe fare

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

a seconda di quale è appropriato per il caso d'uso.

Risposto il 19/01/2009 a 18:17
fonte dall'utente

voti
106

codice aggiornato:

Questo è preteso di lavorare ufficialmente.

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

Post originale (dal deprecato)

Questo codice vi dirà se si esegue in un simulatore.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif
Risposto il 19/01/2009 a 18:10
fonte dall'utente

voti
61

Non pre-processore direttiva, ma questo era quello che cercavo quando sono venuto a questa domanda;

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
Risposto il 18/08/2010 a 11:35
fonte dall'utente

voti
54

Il modo migliore per farlo è:

#if TARGET_IPHONE_SIMULATOR

e non

#ifdef TARGET_IPHONE_SIMULATOR

poiché la sua sempre definito: 0 o 1

Risposto il 07/03/2011 a 08:05
fonte dall'utente

voti
26

In caso di Swift possiamo implementare seguente

Possiamo creare struct che permette di creare un dati strutturati

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

Poi Se volessimo Rilevare se un'applicazione è in costruzione per il dispositivo o un simulatore a Swift poi.

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}
Risposto il 25/02/2016 a 04:48
fonte dall'utente

voti
8

Tutti coloro risposta sono buone, ma confonde in qualche modo novizio come me, in quanto non chiarisce controllo compilazione e verifica della fase di esecuzione. Preprocessore sono Prima di compilare il tempo, ma ci dovrebbe rendere più chiaro

Questo articolo del blog mostra Come rilevare il simulatore di iPhone? chiaramente

Runtime

Prima di tutto, cerchiamo di discutere a breve. UIDevice fornisce già informazioni sul dispositivo

[[UIDevice currentDevice] model]

si tornerà “iPhone Simulator” o “iPhone”, secondo cui l'applicazione è in esecuzione.

tempo di compilazione

Tuttavia ciò che si vuole è quella di utilizzare la compilazione definisce il tempo. Perché? Perché si compila la vostra applicazione rigorosamente da eseguire sia all'interno del simulatore o sul dispositivo. Apple fa un define chiamata TARGET_IPHONE_SIMULATOR. Quindi diamo un'occhiata al codice:

#if TARGET_IPHONE_SIMULATOR

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

#endif
Risposto il 17/06/2014 a 03:57
fonte dall'utente

voti
7

C'è un modo meglio ora!

Come di Xcode 9.3 beta 4 è possibile utilizzare #if targetEnvironment(simulator)per controllare.

#if targetEnvironment(simulator)
//Your simulator code
#endif
Risposto il 12/03/2018 a 13:50
fonte dall'utente

voti
6

In rapida:

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

Da rilevare se l'applicazione è in fase di costruzione per il dispositivo o un simulatore a Swift

Risposto il 16/06/2016 a 14:10
fonte dall'utente

voti
6

Le risposte precedenti sono un po 'datato. Ho scoperto che tutto quello che dovete fare è interrogare il TARGET_IPHONE_SIMULATORmacro ( non c'è bisogno di includere altri file di intestazione [supponendo che si esegue la codifica per iOS]).

Ho tentato TARGET_OS_IPHONEma è tornato lo stesso valore (1) durante l'esecuzione su un dispositivo reale e simulatore, è per questo che mi consiglia di utilizzare TARGET_IPHONE_SIMULATORinvece.

Risposto il 21/05/2013 a 08:10
fonte dall'utente

voti
4

Ho avuto lo stesso problema, sia TARGET_IPHONE_SIMULATORe TARGET_OS_IPHONEsono sempre definite, e sono impostati a 1. opere di soluzioni di Pete, naturalmente, ma se mai capita di costruire qualcosa di diverso da Intel (improbabile, ma chi lo sa), ecco qualcosa che è sicuro finché l'hardware iPhone non cambia (in modo che il codice funzionerà sempre per gli iPhone attualmente là fuori):

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

Metti che un posto comodo, e poi far finta che le TARGET_*costanti sono state definite in modo corretto.

Risposto il 16/06/2009 a 18:48
fonte dall'utente

voti
2

Per Swift 4.2 / 10 xCode

Ho creato un'estensione su UIDevice, in modo da poter facilmente chiedere se il simulatore è in esecuzione.

// 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
    }
}

Nel mio AppDelegate per esempio io uso questo metodo per decidere wether registrazione per la notifica remota è necessario, che non è possibile per il simulatore.

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

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}
Risposto il 25/11/2018 a 13:29
fonte dall'utente

voti
1

Opere per Swift 4eXcode 9.4.1

Utilizzare questo codice:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif
Risposto il 18/07/2018 a 19:06
fonte dall'utente

voti
1

Con Swift 4.2 (Xcode 10), siamo in grado di fare questo

#if hasTargetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif
Risposto il 11/06/2018 a 08:33
fonte dall'utente

voti
1

Qualcuno ha considerato la risposta fornita qui ?

Suppongo che l'Objective-C equivalente sarebbe

+ (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);
    }
}
Risposto il 26/07/2017 a 13:59
fonte dall'utente

voti
1

Per includere tutti i tipi di "simulatori"

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
Risposto il 12/06/2015 a 18:51
fonte dall'utente

voti
0

se niente ha funzionato, provare questo

public struct Platform {

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

}
Risposto il 17/09/2018 a 13:33
fonte dall'utente

voti
0

Apple ha aggiunto il supporto per il controllo della APP è mirato per il simulatore con il seguente:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
Risposto il 11/07/2018 a 22:43
fonte dall'utente

voti
0

SWIFT 4 Soluzione

static let isSimulator: Bool = {
    return TARGET_OS_SIMULATOR == 1
}()

TARGET_OS_SIMULATORsi trova nel Darwin.TargetConditionals.swiftfile.

Risposto il 11/04/2018 a 07:09
fonte dall'utente

voti
0

/// Restituisce vero se il suo simulatore e non un dispositivo

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}
Risposto il 28/02/2018 a 13:39
fonte dall'utente

voti
0

La mia risposta si basa su @ Daniel Magnusson risposte e commenti di @Nuthatch e @ n.Drake. e scrivo a risparmiare un po 'di tempo per gli utenti che lavorano su veloci iOS9 in poi.

Questo è ciò che ha funzionato per me:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
Risposto il 23/12/2015 a 12:30
fonte dall'utente

voti
-3

Questo ha funzionato per me migliore

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


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

}
Risposto il 11/05/2016 a 06:40
fonte dall'utente

voti
-3

A mio parere, la risposta (presentata sopra e ripetuto di seguito):

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

è la risposta migliore, perché è ovviamente eseguito in fase di esecuzione contro essere DIRETTIVA compilazione.

Risposto il 09/09/2013 a 15:45
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more