Hoe kan ik programmatisch bepalen of mijn aanvraag wordt uitgevoerd in de iPhone simulator?

stemmen
242

Naarmate de vraag staten, zou ik vooral graag willen weten of mijn code wordt uitgevoerd in de simulator, maar zou ook geïnteresseerd in het kennen van de specifieke iPhone-versie die wordt uitgevoerd of wordt gesimuleerd zijn.

EDIT: Ik heb het woord 'programmatisch' toegevoegd aan de naam vraag. Het punt van mijn vraag is om in staat om dynamisch code bevatten / uitsluiten afhankelijk van welke versie / simulator actief is, dus ik zou echt op zoek zijn naar iets als een richtlijn van de pre-processor die mij kan bieden deze info.

De vraag is gesteld op 19/01/2009 om 17:55
bron van user
In andere talen...                            


22 antwoorden

stemmen
333

Al gevraagd, maar met een heel andere titel.

Wat #defines worden ingesteld door Xcode bij het opstellen van voor de iPhone

Ik zal mijn antwoord herhalen van daar:

Het is in de SDK docs onder "compileren broncode voorwaardelijk"

De relevante definitie TARGET_OS_SIMULATOR, gedefinieerd in /usr/include/TargetConditionals.h binnen het kader IOS. Bij eerdere versies van de toolchain, moest je om te schrijven:

#include "TargetConditionals.h"

maar dit is niet meer nodig voor de stroom (6 Xcode / iOS8) toolchain.

Dus, bijvoorbeeld, als u wilt controleren die u gebruikt op het apparaat, je moet doen

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

afhankelijk van welke geschikt is voor uw use-case.

antwoordde op 19/01/2009 om 18:17
bron van user

stemmen
106

Bijgewerkt code:

Dit wordt beweerd om officieel te werken.

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

Originele post (sinds verouderd)

Deze code zal u vertellen of u werkt in een simulator.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif
antwoordde op 19/01/2009 om 18:10
bron van user

stemmen
61

Niet pre-processor richtlijn, maar dit was wat ik zocht toen ik kwam op deze vraag;

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
antwoordde op 18/08/2010 om 11:35
bron van user

stemmen
54

De beste manier om dit te doen is:

#if TARGET_IPHONE_SIMULATOR

en niet

#ifdef TARGET_IPHONE_SIMULATOR

Sinds zijn altijd gedefinieerd: 0 of 1

antwoordde op 07/03/2011 om 08:05
bron van user

stemmen
26

In het geval van Swift kunnen we implementeren volgende

We kunnen struct waarmee u een gestructureerde gegevens te creëren

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

Dan Als we willen om te detecteren of app wordt gebouwd voor het apparaat of de simulator in Swift toen.

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}
antwoordde op 25/02/2016 om 04:48
bron van user

stemmen
8

Al die antwoorden zijn goed, maar een of andere manier verwart newbie zoals ik als het niet compileert check en runtime-check te verduidelijken. Preprocessor worden voor het compileren, maar we duidelijker moeten maken

Dit blog artikel toont Hoe de iPhone simulator detecteren? duidelijk

runtime

Allereerst, laten we kort bespreken. UIDevice biedt u al informatie over het apparaat

[[UIDevice currentDevice] model]

gaat u terug “iPhone Simulator” of “iPhone”, aldus waar de app wordt uitgevoerd.

Compileertijd

Maar wat je wilt is om te gebruiken compileren definieert. Waarom? Omdat u uw app compileren strikt moet worden uitgevoerd hetzij binnen de simulator of op het apparaat. Apple maakt een definiëren genoemd TARGET_IPHONE_SIMULATOR. Dus laten we eens kijken naar de code:

#if TARGET_IPHONE_SIMULATOR

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

#endif
antwoordde op 17/06/2014 om 03:57
bron van user

stemmen
7

ER is een betere manier NOW!

Met ingang van Xcode 9.3 beta 4 die u kunt gebruiken #if targetEnvironment(simulator)om te controleren.

#if targetEnvironment(simulator)
//Your simulator code
#endif
antwoordde op 12/03/2018 om 13:50
bron van user

stemmen
6

In swift:

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

Van detecteren of app gebouwd voor toestel of simulator Swift

antwoordde op 16/06/2016 om 14:10
bron van user

stemmen
6

De eerdere antwoorden zijn een beetje gedateerd. Ik vond dat alles wat je hoeft te doen is vraag de TARGET_IPHONE_SIMULATORmacro ( geen behoefte aan een andere header-bestanden bevatten [ervan uitgaande dat je die coderen voor iOS]).

Ik heb geprobeerd TARGET_OS_IPHONEmaar het keerde dezelfde waarde (1) bij het rijden op een echt apparaat en simulator, dat is waarom ik raden u aan TARGET_IPHONE_SIMULATORin plaats daarvan.

antwoordde op 21/05/2013 om 08:10
bron van user

stemmen
4

Ik had hetzelfde probleem, zowel TARGET_IPHONE_SIMULATORen TARGET_OS_IPHONEzijn altijd gedefinieerd en zijn ingesteld op 1. Pete's oplossing werken, natuurlijk, maar als je ooit toevallig bouwen op iets anders dan intel (onwaarschijnlijk, maar wie weet), hier is iets dat veilig zolang de iPhone hardware niet verandert (zodat uw code zal altijd werken voor de iphones dit moment die er zijn):

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

Zet dat ergens handig, en dan doen alsof de TARGET_*constanten correct zijn gedefinieerd.

antwoordde op 16/06/2009 om 18:48
bron van user

stemmen
2

Voor Swift 4.2 / xCode 10

Ik maakte een uitbreiding op UIDevice, dus ik kan gemakkelijk vragen om, indien de simulator wordt uitgevoerd.

// 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 mijn AppDelegate bijvoorbeeld gebruik ik deze methode om te beslissen Of registreren voor externe notificatie is noodzakelijk, wat niet mogelijk is voor de simulator.

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

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}
antwoordde op 25/11/2018 om 13:29
bron van user

stemmen
1

Werkt voor Swift 4enXcode 9.4.1

Gebruik deze code:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif
antwoordde op 18/07/2018 om 19:06
bron van user

stemmen
1

Met Swift 4.2 (Xcode 10), kunnen we dit doen

#if hasTargetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif
antwoordde op 11/06/2018 om 08:33
bron van user

stemmen
1

Heeft iemand beschouwd als het antwoord hier ?

Ik veronderstel dat de Objective-C gelijkwaardig zou zijn

+ (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);
    }
}
antwoordde op 26/07/2017 om 13:59
bron van user

stemmen
1

Om alle soorten van "simulatoren" omvatten

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
antwoordde op 12/06/2015 om 18:51
bron van user

stemmen
0

als er niets werkt, probeer dan deze

public struct Platform {

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

}
antwoordde op 17/09/2018 om 13:33
bron van user

stemmen
0

Apple heeft ondersteuning toegevoegd voor het controleren van de app is gericht op de simulator met het volgende:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
antwoordde op 11/07/2018 om 22:43
bron van user

stemmen
0

SWIFT 4 Solution

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

TARGET_OS_SIMULATORbevindt zich in Darwin.TargetConditionals.swifthet bestand.

antwoordde op 11/04/2018 om 07:09
bron van user

stemmen
0

/// Geeft waar als de simulator en niet een apparaat

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}
antwoordde op 28/02/2018 om 13:39
bron van user

stemmen
0

Mijn antwoord is gebaseerd op @Daniel Magnusson antwoord en commentaar van @Nuthatch en @ n.Drake. en ik schrijf het om wat tijd te sparen voor een snelle gebruikers die werken op iOS9 en daarna.

Dit is wat werkte voor mij:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
antwoordde op 23/12/2015 om 12:30
bron van user

stemmen
-3

Dit werkte voor mij beste

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


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

}
antwoordde op 11/05/2016 om 06:40
bron van user

stemmen
-3

Naar mijn mening is het antwoord (boven gepresenteerd en hieronder herhaald):

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

is het beste antwoord, omdat het duidelijk wordt uitgevoerd tijdens de uitvoering ten opzichte van het zijn een COMPILE RICHTLIJN.

antwoordde op 09/09/2013 om 15:45
bron van user

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