Jak lze programově zjistit, jestli moje aplikace je spuštěna v iPhone simulátoru?

hlasů
242

Jak totiž upřesňuje, bych především chtěl vědět, zda můj kód běží v simulátoru, ale také by měl zájem znát konkrétní iPhone verzi, která běží nebo je simulován.

EDIT: jsem přidal slovo ‚programově‘ k názvu otázky. Smyslem mé otázky je, aby bylo možné dynamicky zahrnout / vyloučit kód v závislosti na verzi / simulátor běží, takže bych se opravdu hledají něco jako směrnice o pre-procesor, který mi může poskytnout tyto informace.

Položena 19/01/2009 v 17:55
zdroj uživatelem
V jiných jazycích...                            


22 odpovědí

hlasů
333

Již dříve žádal, ale s velmi odlišným názvem.

Co #DEFINEs zřizuje Xcode při kompilaci pro iPhone

Zopakuji svou odpověď odtamtud:

Je to v SDK dokumentů v rámci „Kompilace zdrojového kódu podmíněně“

Příslušná definice je TARGET_OS_SIMULATOR, který je definován v /usr/include/TargetConditionals.h rámci IOS. Na starších verzích toolchain bylo nutné psát:

#include "TargetConditionals.h"

ale to již není nutné na aktuálním (Xcode 6 / iOS8) toolchain.

Tak například, pokud chcete zjistit, zda jste běží na zařízení, byste měli udělat

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

podle toho, která je vhodná pro danou use-case.

Odpovězeno 19/01/2009 v 18:17
zdroj uživatelem

hlasů
106

Aktualizováno kód:

To je domnělý pracovat oficiálně.

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

Původní příspěvek (od zastaralé)

Tento kód vám řekne, pokud je spuštěn v simulátoru.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif
Odpovězeno 19/01/2009 v 18:10
zdroj uživatelem

hlasů
61

Není směrnice pre-procesor, ale to bylo to, co jsem hledal, když jsem přišel na tuto otázku;

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
Odpovězeno 18/08/2010 v 11:35
zdroj uživatelem

hlasů
54

Nejlepší způsob, jak to udělat, je:

#if TARGET_IPHONE_SIMULATOR

a nikoli

#ifdef TARGET_IPHONE_SIMULATOR

Od svého vždy definovány: 0 nebo 1,

Odpovězeno 07/03/2011 v 08:05
zdroj uživatelem

hlasů
26

V případě Swift můžeme realizovat následující

Můžeme vytvořit struct, který vám umožní vytvořit strukturovaných dat

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

Potom Pokud bychom chtěli zjistit, zda aplikace je postavena na zařízení nebo simulátoru v Swift poté.

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}
Odpovězeno 25/02/2016 v 04:48
zdroj uživatelem

hlasů
8

Všichni ti, odpověď je dobrá, ale to nějak plete nováček, jako jsem já, protože nevyjasňuje šek kompilace a kontrola běhu. Preprocesor jsou před kompilaci, ale měli bychom, aby bylo jasnější

Tento blog článek ukazuje, jak rozpoznat iPhone simulátor? jasně

Runtime

Za prvé, pojďme se krátce diskutovat. UIDevice vám poskytuje již informace o zařízení

[[UIDevice currentDevice] model]

Vrátíš „iPhone simulátoru“ nebo „iPhone“ podle toho, kde je spuštěna aplikace.

kompilaci

Avšak to, co chcete, je použít sestavit časové definuje. Proč? Vzhledem k tomu, kompilaci aplikace striktně být provozován buď uvnitř simulátoru nebo na zařízení. Apple dělá definují volal TARGET_IPHONE_SIMULATOR. Takže pojďme se podívat na kód:

#if TARGET_IPHONE_SIMULATOR

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

#endif
Odpovězeno 17/06/2014 v 03:57
zdroj uživatelem

hlasů
7

Existuje lepší WAY TEĎ!

Jak Xcode 9.3 beta 4 můžete použít #if targetEnvironment(simulator)ke kontrole.

#if targetEnvironment(simulator)
//Your simulator code
#endif
Odpovězeno 12/03/2018 v 13:50
zdroj uživatelem

hlasů
6

SWIFT:

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

Z detekce, zda aplikace je postavena na zařízení nebo simulátoru v Swift

Odpovězeno 16/06/2016 v 14:10
zdroj uživatelem

hlasů
6

Předchozí odpovědi jsou trochu zastaralý. Zjistil jsem, že vše, co potřebujete udělat, je dotaz na TARGET_IPHONE_SIMULATORmakro ( není třeba přidávat žádné jiné hlavičkové soubory [za předpokladu, že jsou kódování pro iOS]).

Pokusil jsem TARGET_OS_IPHONEale vrátil stejnou hodnotu (1), když běží na skutečném zařízení a simulátoru, to je důvod, proč doporučuji používat TARGET_IPHONE_SIMULATORmísto.

Odpovězeno 21/05/2013 v 08:10
zdroj uživatelem

hlasů
4

Měl jsem stejný problém, jak TARGET_IPHONE_SIMULATORa TARGET_OS_IPHONEjsou vždy definovány, a jsou nastaveny na 1. Pete řešení funguje, samozřejmě, ale pokud jste někdy stalo, že stavět na něco jiného než intel (nepravděpodobný, ale kdo ví), tady je něco, co je v bezpečí, dokud iphone hardware nemění (takže váš kód bude vždy pracovat pro iPhony v současné době tam venku):

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

Dej tu někde pohodlné, a pak předstírat, že TARGET_*konstanty byly správně definovány.

Odpovězeno 16/06/2009 v 18:48
zdroj uživatelem

hlasů
2

Pro Swift 4.2 / Xcode 10

Vytvořil jsem prodloužení o UIDevice, takže můžu snadno požádat, pokud je spuštěna simulátor.

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

V mém AppDelegate například I použití této metody se rozhodnout wether registraci dálkového hlášení je nutné, což není možné, aby na simulátoru.

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

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}
Odpovězeno 25/11/2018 v 13:29
zdroj uživatelem

hlasů
1

Pracuje pro Swift 4aXcode 9.4.1

Pomocí tohoto kódu:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif
Odpovězeno 18/07/2018 v 19:06
zdroj uživatelem

hlasů
1

S Swift 4.2 (Xcode 10), můžeme to udělat

#if hasTargetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif
Odpovězeno 11/06/2018 v 08:33
zdroj uživatelem

hlasů
1

Má někdo považovat za odpověď poskytované tady ?

Myslím, že cíl-c ekvivalent bude

+ (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);
    }
}
Odpovězeno 26/07/2017 v 13:59
zdroj uživatelem

hlasů
1

Chcete-li zahrnout všechny druhy „simulátory“

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
Odpovězeno 12/06/2015 v 18:51
zdroj uživatelem

hlasů
0

pokud nic nefungovalo, zkuste to

public struct Platform {

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

}
Odpovězeno 17/09/2018 v 13:33
zdroj uživatelem

hlasů
0

Apple přidal podporu pro kontrolu aplikace je zaměřena na simulátoru s těmito kritérii:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
Odpovězeno 11/07/2018 v 22:43
zdroj uživatelem

hlasů
0

SWIFT 4 Řešení

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

TARGET_OS_SIMULATORse nachází v Darwin.TargetConditionals.swiftsouboru.

Odpovězeno 11/04/2018 v 07:09
zdroj uživatelem

hlasů
0

/// Vrací hodnotu true, pokud její simulátor a ne přístroj

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}
Odpovězeno 28/02/2018 v 13:39
zdroj uživatelem

hlasů
0

Moje odpověď je založena na @Daniel Magnusson odpověď a připomínky @Nuthatch a @ n.Drake. a píšu to ušetřit čas rychlými uživatele pracující na iOS9 a dále.

To je to, co pracoval pro mě:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
Odpovězeno 23/12/2015 v 12:30
zdroj uživatelem

hlasů
-3

Tato pracoval pro mě nejlepší

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


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

}
Odpovězeno 11/05/2016 v 06:40
zdroj uživatelem

hlasů
-3

Podle mého názoru je odpověď (je uvedeno výše, a zopakoval níže):

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

je nejlepší odpověď, protože to je samozřejmě provedeny za běhu ve srovnání s bytí Směrnice COMPILE.

Odpovězeno 09/09/2013 v 15:45
zdroj uživatelem

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