Hvordan kan jeg programma avgjøre om min app kjører i iphone simulator?

stemmer
246

Som spørsmålet statene, ville jeg først og fremst lyst til å vite om min kode kjøres i simulatoren, men vil også være interessert i å vite den spesifikke iPhone-versjonen som kjører eller blir simulert.

EDIT: Jeg har lagt ordet programmatisk på spørsmålet navn. Poenget med spørsmålet mitt er å kunne inkludere dynamisk / ekskludere kode avhengig av hvilken versjon / simulator er i gang, så jeg vil virkelig være på utkikk etter noe som en pre-prosessor direktiv som kan gi meg denne informasjonen.

Publisert på 19/01/2009 klokken 16:55
kilden bruker
På andre språk...                            


22 svar

stemmer
339

Allerede spurt, men med en helt annen tittel.

Hva #defines er satt opp av Xcode når kompilering for iPhone

Jeg vil gjenta mitt svar derfra:

Det er i SDK-docs under "Kompilering kildekode betinget"

Den relevante definisjon er TARGET_OS_SIMULATOR, som er definert i /usr/include/TargetConditionals.h innenfor iOS rammeverket. På tidligere versjoner av verktøysett, måtte du skrive:

#include "TargetConditionals.h"

men dette er ikke lenger nødvendig på strømmen (X-kode 6 / iOS8) verktøysett.

Så, for eksempel, hvis du ønsker å sjekke at du kjører på enheten, bør du gjøre

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

avhengig av hva som er riktig for din bruk-saken.

Svarte 19/01/2009 kl. 17:17
kilden bruker

stemmer
106

Oppdatert kode:

Dette er påstått å jobbe offisielt.

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

Opprinnelige innlegget (siden foreldet)

Denne koden vil fortelle deg om du kjører i en simulator.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif
Svarte 19/01/2009 kl. 17:10
kilden bruker

stemmer
61

Ikke pre-prosessor direktiv, men dette var det jeg var ute etter når jeg kom til dette spørsmålet;

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
Svarte 18/08/2010 kl. 10:35
kilden bruker

stemmer
54

Den beste måten å gjøre dette på er:

#if TARGET_IPHONE_SIMULATOR

og ikke

#ifdef TARGET_IPHONE_SIMULATOR

siden det alltid definert: 0 eller 1

Svarte 07/03/2011 kl. 07:05
kilden bruker

stemmer
27

Ved Swift kan vi gjennomføre følgende

Vi kan lage struct som lar deg lage en strukturert data

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

Så hvis vi ønsket å oppdage hvis app bygges for enheten eller simulator i Swift da.

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}
Svarte 25/02/2016 kl. 04:48
kilden bruker

stemmer
15

DET er en bedre måte nå!

Per Xcode 9.3 beta 4 kan du bruke #if targetEnvironment(simulator)til å sjekke.

#if targetEnvironment(simulator)
//Your simulator code
#endif
Svarte 12/03/2018 kl. 13:50
kilden bruker

stemmer
8

Alle de svar er bra, men det liksom forvirrer nybegynner som meg som det ikke avklare kompilere sjekk og runtime sjekk. Preprocessor er før kompilering, men vi skal gjøre det klarere

Denne bloggen artikkelen viser hvordan du registrerer iPhone simulator? helt klart

Runtime

Først av alt, la oss kort tid diskutere. UIDevice gir du allerede informasjon om enheten

[[UIDevice currentDevice] model]

vil returnere deg “iPhone Simulator” eller “iPhone” etter hvor appen kjører.

kompilering

Men det du ønsker er å bruke kompilering definerer. Hvorfor? Fordi du kompilere programmet strengt skal kjøres enten inne i Simulator eller på enheten. Apple gjør en definerer som heter TARGET_IPHONE_SIMULATOR. Så la oss se på koden:

#if TARGET_IPHONE_SIMULATOR

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

#endif
Svarte 17/06/2014 kl. 02:57
kilden bruker

stemmer
6

I swift:

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

Fra oppdage om app bygges for enheten eller simulator i Swift

Svarte 16/06/2016 kl. 14:10
kilden bruker

stemmer
6

Den forrige svar er litt utdatert. Jeg fant ut at alt du trenger å gjøre er å søke i TARGET_IPHONE_SIMULATORmakro ( ikke nødvendig å inkludere andre header filer [forutsatt at du er koding for iOS]).

Jeg forsøkte TARGET_OS_IPHONE, men det kom tilbake samme verdi (1) når du kjører på en faktisk enhet og simulator, det er derfor jeg anbefaler å bruke TARGET_IPHONE_SIMULATORi stedet.

Svarte 21/05/2013 kl. 07:10
kilden bruker

stemmer
4

Jeg hadde det samme problemet, både TARGET_IPHONE_SIMULATORog TARGET_OS_IPHONEer alltid definert, og er satt til 1. Pete løsningen fungerer, selvfølgelig, men hvis du tilfeldigvis å bygge på noe annet enn intel (usannsynlig, men hvem vet), her er noe som er trygge som lenge iphone maskinvare ikke endres (slik at koden vil alltid jobbe for iPhone for tiden ute):

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

Sett at et sted praktisk, og deretter late som de TARGET_*konstanter ble definert på riktig måte.

Svarte 16/06/2009 kl. 17:48
kilden bruker

stemmer
2

For Swift 4.2 / Xcode 10

Jeg laget en forlengelse på UIDevice, så jeg kan lett be om simulatoren kjører.

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

I min AppDelegate for eksempel bruker jeg denne metoden for å bestemme været registrering for ekstern varsling er nødvendig, noe som ikke er mulig for simulatoren.

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

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}
Svarte 25/11/2018 kl. 13:29
kilden bruker

stemmer
2

Har noen regnet svaret gitt her ?

Jeg antar at Objective-C tilsvarende ville være

+ (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);
    }
}
Svarte 26/07/2017 kl. 13:59
kilden bruker

stemmer
1

Arbeider for Swift 4ogXcode 9.4.1

Bruk denne koden:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif
Svarte 18/07/2018 kl. 19:06
kilden bruker

stemmer
1

Med Swift 4.2 (Xcode 10), kan vi gjøre dette

#if hasTargetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif
Svarte 11/06/2018 kl. 08:33
kilden bruker

stemmer
1

Til å omfatte alle typer "simulatorer"

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
Svarte 12/06/2015 kl. 18:51
kilden bruker

stemmer
0

hvis ingenting fungerte, prøv dette

public struct Platform {

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

}
Svarte 17/09/2018 kl. 13:33
kilden bruker

stemmer
0

Apple har lagt til støtte for å sjekke app er målrettet for simulator med følgende:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
Svarte 11/07/2018 kl. 22:43
kilden bruker

stemmer
0

SWIFT 4 Solution

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

TARGET_OS_SIMULATORligger i Darwin.TargetConditionals.swiftfilen.

Svarte 11/04/2018 kl. 07:09
kilden bruker

stemmer
0

/// Returnerer sann hvis simulator og ikke en enhet

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}
Svarte 28/02/2018 kl. 13:39
kilden bruker

stemmer
0

Mitt svar er basert på @Daniel Magnusson svar og kommentarer av @Nuthatch og @ n.Drake. og jeg skriver det for å spare litt tid for raske brukere som arbeider på iOS9 og utover.

Dette er hva som fungerte for meg:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
Svarte 23/12/2015 kl. 12:30
kilden bruker

stemmer
-3

Dette fungerte for meg beste

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


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

}
Svarte 11/05/2016 kl. 06:40
kilden bruker

stemmer
-3

Etter min mening er svaret (vist ovenfor og gjentatt under):

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

er det beste svaret, fordi det er åpenbart utført under kjøring versus å være en kompilere direktiv.

Svarte 09/09/2013 kl. 14:45
kilden bruker

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