Hogyan algoritmikusan meghatározza, ha a app fut az iPhone-szimulátor?

szavazat
242

Mivel a szóban forgó államok, azt elsősorban szeretném tudni, hogy vagy nem az én kódot fut a szimulátorban, de arra is érdekelte, a konkrét iphone verziót futtató vagy szimulált.

EDIT: Én hozzá a „programozott” a kérdés neve. A lényeg a kérdés az, hogy képes legyen dinamikusan / kizárása kód attól függően, melyik változat / szimulátor fut, úgyhogy tényleg keres valamit, mint egy pre-processzor irányelv, amely tud nyújtani nekem ezt az infót.

A kérdést 19/01/2009 17:55
a forrás felhasználó
Más nyelveken...                            


22 válasz

szavazat
333

Már kérdeztem, de nagyon más címmel.

Mi #define hozzák létre Xcode összeállításakor iPhone

Majd ismételje meg a válasz onnan:

Ez az SDK docs alatt „fordítása forráskód feltételesen”

A vonatkozó meghatározás TARGET_OS_SIMULATOR, amely meghatározott /usr/include/TargetConditionals.h belül iOS keretet. A korábbi verziókban a toolchain, meg kellett írni:

#include "TargetConditionals.h"

de ez már nem szükséges a jelenlegi (Xcode 6 / iOS 8 rendszeren) toolchain.

Így például, ha azt szeretnénk, hogy ellenőrizze, hogy fut a készüléken, meg kell tennie

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

attól függően, melyik a megfelelő az use-case.

Válaszolt 19/01/2009 18:17
a forrás felhasználó

szavazat
106

Frissítve kód:

Ez állítólag működik hivatalosan.

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

Eredeti bejegyzés (mivel elavult)

Ez a kód megmondja, ha fut egy szimulátor.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif
Válaszolt 19/01/2009 18:10
a forrás felhasználó

szavazat
61

Nem pre-processzor irányelv, de ez volt az, amit kerestem, mikor jött ez a kérdés;

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
Válaszolt 18/08/2010 11:35
a forrás felhasználó

szavazat
54

A legjobb módja ennek a következő:

#if TARGET_IPHONE_SIMULATOR

és nem

#ifdef TARGET_IPHONE_SIMULATOR

mivel mindig is meghatározta: 0 vagy 1

Válaszolt 07/03/2011 08:05
a forrás felhasználó

szavazat
26

Abban az esetben, Swift tudjuk végrehajtani a következő

Mi is létrehozhatunk struct amely lehetővé teszi, hogy hozzon létre egy strukturált adatok

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

Akkor, ha azt akartuk, hogy érzékeli, ha az alkalmazás épül eszköz vagy szimulátor Swift majd.

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}
Válaszolt 25/02/2016 04:48
a forrás felhasználó

szavazat
8

Mindazok válasz jó, de valahogy összekeveri kezdő, mint én, mert nem tisztázza fordításkor ellenőrzése és futásidejű ellenőrzés. Előfeldolgozó vannak előtt fordításkor, de meg kell, hogy az világosabb

Ez a blog a cikk bemutatja, hogyan lehet felismerni az iPhone-szimulátor? tisztán

Runtime

Először is, nézzük röviden beszélni. UIDevice nyújt már az eszközre vonatkozó információk

[[UIDevice currentDevice] model]

visszaadja „iPhone Simulator” vagy „iPhone” szerint, ha az alkalmazás fut.

A fordítási időben

Azonban mit szeretne használni fordításkor határozza meg. Miért? Mert fordítod a app szigorúan kell futtatni belül egyaránt a szimulátor, vagy a készüléken. Az Apple a define nevezett TARGET_IPHONE_SIMULATOR. Tehát nézzük meg a kódot:

#if TARGET_IPHONE_SIMULATOR

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

#endif
Válaszolt 17/06/2014 03:57
a forrás felhasználó

szavazat
7

Van egy jobb módon most!

Mivel Xcode 9.3 beta 4 használhatja #if targetEnvironment(simulator), hogy ellenőrizze.

#if targetEnvironment(simulator)
//Your simulator code
#endif
Válaszolt 12/03/2018 13:50
a forrás felhasználó

szavazat
6

A gyors:

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

Tól észlelése esetén az alkalmazás épül eszköz vagy szimulátor Swift

Válaszolt 16/06/2016 14:10
a forrás felhasználó

szavazat
6

A korábbi válaszokat egy kicsit elavultak. Azt találták, hogy csak annyit kell tennie, hogy kérdezni a TARGET_IPHONE_SIMULATORmakro ( nincs szükség arra, hogy bármely más header fájlokat [feltételezve, hogy kódoló iOS]).

Megpróbáltam TARGET_OS_IPHONE, de visszatért az azonos értékű (1) ha fut egy valós eszközön és szimulátor, ezért azt javasoljuk, TARGET_IPHONE_SIMULATORhelyette.

Válaszolt 21/05/2013 08:10
a forrás felhasználó

szavazat
4

Ugyanez volt a probléma, mind TARGET_IPHONE_SIMULATORés TARGET_OS_IPHONEmindig meghatározottak, és beállítása 1. Pete megoldás működik, persze, de ha valaha is megtörténhet, hogy építeni valami más, mint az Intel (nem valószínű, de ki tudja), itt van valami, ami biztonságos, mint a amíg az iPhone hardver nem változik (tehát a kód mindig működik az iPhone jelenleg ott):

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

Tedd, hogy valahol kényelmesebb, majd úgy, mintha az TARGET_*állandók meghatározása helyesen.

Válaszolt 16/06/2009 18:48
a forrás felhasználó

szavazat
2

Swift 4.2 / 10 XCode

Csináltam egy kiterjesztést UIDevice, úgyhogy könnyen kérni, amennyiben a szimulátor fut.

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

Az én AppDelegate például én ezt a módszert használja annak eldöntésére, ürü regisztráció távoli értesítés szükséges, ami nem lehetséges, hogy a szimulátor.

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

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}
Válaszolt 25/11/2018 13:29
a forrás felhasználó

szavazat
1

Működik Swift 4ésXcode 9.4.1

Használja ezt a kódot:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif
Válaszolt 18/07/2018 19:06
a forrás felhasználó

szavazat
1

A Swift 4,2 (Xcode 10), meg tudjuk csinálni

#if hasTargetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif
Válaszolt 11/06/2018 08:33
a forrás felhasználó

szavazat
1

Van valaki venni a választ, feltéve itt ?

Gondolom, a cél-c egyenértékű lenne

+ (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);
    }
}
Válaszolt 26/07/2017 13:59
a forrás felhasználó

szavazat
1

Ha az összes fajta „szimulátorok”

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
Válaszolt 12/06/2015 18:51
a forrás felhasználó

szavazat
0

Ha semmi nem működött, próbáld ezt

public struct Platform {

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

}
Válaszolt 17/09/2018 13:33
a forrás felhasználó

szavazat
0

Apple hozzáadott ellenőrzését is támogatja az alkalmazás célzott a szimulátor a következő:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
Válaszolt 11/07/2018 22:43
a forrás felhasználó

szavazat
0

SWIFT 4 Solution

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

TARGET_OS_SIMULATORtalálható Darwin.TargetConditionals.swiftfájlt.

Válaszolt 11/04/2018 07:09
a forrás felhasználó

szavazat
0

/// true értékkel tér vissza, ha a szimulátor, és nem egy eszköz

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}
Válaszolt 28/02/2018 13:39
a forrás felhasználó

szavazat
0

A válaszom alapul @Daniel Magnusson választ, és hozzászólások @Nuthatch és @ n.Drake. és írok, hogy mentse egy ideig gyors dolgozó felhasználók iOS9 kezdődően.

Ez az, ami nekem dolgozott:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
Válaszolt 23/12/2015 12:30
a forrás felhasználó

szavazat
-3

Ez működött számomra a legjobb

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


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

}
Válaszolt 11/05/2016 06:40
a forrás felhasználó

szavazat
-3

Véleményem szerint a válasz (a fent bemutatott és az alább megismételt):

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

a legjobb válasz, mert ez nyilvánvalóan végrehajtásra RUNTIME szemben, hogy egy COMPILE irányelve.

Válaszolt 09/09/2013 15:45
a forrás felhasználó

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