Cum pot determina în mod programatic dacă aplicația mea se execută în simulatorul iPhone?

voturi
242

Ca statele întrebare, aș dori în principal să știu dacă este sau nu codul meu se execută în simulator, dar ar fi, de asemenea, interesat în a cunoaște versiunea specifică iPhone care rulează sau simulat.

EDIT: Am adăugat cuvântul „programatic“ cu numele respectiv. Punctul de întrebarea mea este de a fi în măsură să includă în mod dinamic / exclude codul în funcție de versiunea / simulator se execută, așa că mi-ar fi într-adevăr în căutarea pentru ceva ca o directivă de pre-procesor care mă poate oferi aceste informații.

Întrebat 19/01/2009 la 17:55
sursa de către utilizator
În alte limbi...                            


22 răspunsuri

voturi
333

Deja întrebat, dar cu un titlu foarte diferit.

Ce #defines sunt stabilite prin Xcode atunci când compilarea pentru iPhone

Voi repeta răspunsul meu de acolo:

Este în docs SDK sub „Alcătuirea codul sursă condiționat“

Definiția relevantă este TARGET_OS_SIMULATOR, care este definit în /usr/include/TargetConditionals.h în cadrul iOS. Pe versiunile anterioare ale toolchain, a trebuit să scrie:

#include "TargetConditionals.h"

dar acest lucru nu mai este necesar pe curent (Xcode 6 / iOS8) toolchain este.

Deci, de exemplu, dacă doriți să verificați dacă rulează pe dispozitiv, ar trebui să faceți

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

în funcție de care este potrivit pentru dumneavoastră caz ​​de utilizare.

Publicat 19/01/2009 la 18:17
sursa de către utilizator

voturi
106

Cod Actualizat:

Acest lucru este de a lucra în mod oficial purported.

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

Original post (din depreciată)

Acest cod vă va spune dacă se execută într-un simulator.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif
Publicat 19/01/2009 la 18:10
sursa de către utilizator

voturi
61

Nu directiva de pre-procesor, dar acest lucru a fost ceea ce am fost căutat când am venit la această întrebare;

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
Publicat 18/08/2010 la 11:35
sursa de către utilizator

voturi
54

Cel mai bun mod de a face acest lucru este:

#if TARGET_IPHONE_SIMULATOR

si nu

#ifdef TARGET_IPHONE_SIMULATOR

din moment ce sa definit întotdeauna: 0 sau 1

Publicat 07/03/2011 la 08:05
sursa de către utilizator

voturi
26

In cazul Swift putem pune în aplicare în urma

Putem crea struct care vă permite să creați o transmisie de date structurate

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

Apoi, dacă ne-am dorit pentru a detecta dacă aplicația este construit pentru dispozitiv sau simulator în Swift atunci.

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}
Publicat 25/02/2016 la 04:48
sursa de către utilizator

voturi
8

Toți cei de răspuns sunt bune, dar într-un fel confundă newbie ca mine, deoarece nu clarifică verificare de compilare și verificare a rulării. Preprocessor sunt înainte de compilare de timp, dar ar trebui să facem mai clară

Acest articol blog - ul prezinta Cum de a detecta simulatorul iPhone? clar

Runtime

În primul rând, să discutăm în scurt timp. UIDevice vă oferă deja informații despre dispozitiv

[[UIDevice currentDevice] model]

te vei întoarce „iPhone Simulator“ sau „iPhone“, în funcție de cazul în care aplicația se execută.

Compile timp

Cu toate acestea ceea ce doriți este să utilizați compila timp definește. De ce? Pentru că compila aplicația strict pentru a fi rulat fie în interiorul Simulatorul sau pe dispozitiv. Apple a face o definești numit TARGET_IPHONE_SIMULATOR. Deci , să ne uităm la codul:

#if TARGET_IPHONE_SIMULATOR

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

#endif
Publicat 17/06/2014 la 03:57
sursa de către utilizator

voturi
7

Există o cale mai bine acum!

Ca de Xcode 9.3 beta 4 puteți utiliza #if targetEnvironment(simulator)pentru a verifica.

#if targetEnvironment(simulator)
//Your simulator code
#endif
Publicat 12/03/2018 la 13:50
sursa de către utilizator

voturi
6

În rapidă:

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

Din Detect dacă aplicația este construit pentru dispozitiv sau simulator în Swift

Publicat 16/06/2016 la 14:10
sursa de către utilizator

voturi
6

Răspunsurile anterioare sunt un pic datat. Am constatat că tot ce trebuie să faceți este interoga TARGET_IPHONE_SIMULATORmacro ( nu este nevoie să includă orice alte fișiere antet [presupunând că vă sunt de codificare pentru iOS]).

Am încercat , TARGET_OS_IPHONEdar a revenit la aceeași valoare (1) , atunci când rulează pe un dispozitiv real și simulator, de aceea recomandăm să utilizați în TARGET_IPHONE_SIMULATORschimb.

Publicat 21/05/2013 la 08:10
sursa de către utilizator

voturi
4

Am avut aceeași problemă, ambele TARGET_IPHONE_SIMULATORși TARGET_OS_IPHONEsunt întotdeauna definite, și sunt setate la 1. Lucrări de soluții Pete, desigur, dar dacă se întâmplă vreodată să se bazeze pe altceva decât Intel (puțin probabil, dar cine stie), aici e ceva care e sigur ca atâta timp cât hardware - ul iPhone - ul nu se schimba (astfel încât codul va funcționa întotdeauna pentru iPhone - uri în prezent acolo):

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

Pune - o undeva convenabil, și apoi pretind că TARGET_*constantele au fost definite corect.

Publicat 16/06/2009 la 18:48
sursa de către utilizator

voturi
2

Pentru Swift 4.2 / Xcode 10

Am creat o extensie pe UIDevice, așa că am putea cere mai în cazul în care se execută simulator.

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

În meu AppDelegate , de exemplu , eu folosesc această metodă pentru a decide batal înregistrarea pentru notificarea la distanță este necesară, ceea ce nu este posibil pentru simulator.

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

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}
Publicat 25/11/2018 la 13:29
sursa de către utilizator

voturi
1

Lucrări de Swift 4șiXcode 9.4.1

Utilizați acest cod:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif
Publicat 18/07/2018 la 19:06
sursa de către utilizator

voturi
1

Cu Swift 4.2 (Xcode 10), putem face acest lucru

#if hasTargetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif
Publicat 11/06/2018 la 08:33
sursa de către utilizator

voturi
1

Are cineva a considerat răspunsul oferit aici ?

Presupun că obiectivul-c echivalent ar fi

+ (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);
    }
}
Publicat 26/07/2017 la 13:59
sursa de către utilizator

voturi
1

Pentru a include toate tipurile de „simulatoare“

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
Publicat 12/06/2015 la 18:51
sursa de către utilizator

voturi
0

în cazul în care nimic nu a funcționat, încercați acest lucru

public struct Platform {

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

}
Publicat 17/09/2018 la 13:33
sursa de către utilizator

voturi
0

Apple a adăugat suport pentru verificarea aplicației este orientată pentru simulator cu următorul text:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
Publicat 11/07/2018 la 22:43
sursa de către utilizator

voturi
0

SWIFT 4 Soluție

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

TARGET_OS_SIMULATOReste situat în Darwin.TargetConditionals.swiftfișier.

Publicat 11/04/2018 la 07:09
sursa de către utilizator

voturi
0

/// Returnează true dacă simulatorul și nu un dispozitiv

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}
Publicat 28/02/2018 la 13:39
sursa de către utilizator

voturi
0

Răspunsul meu se bazează pe @Daniel răspuns Magnusson și comentarii de @Nuthatch și @ n.Drake. și scrie-l pentru a economisi ceva timp pentru utilizatorii rapide care lucrează la iOS9 și în continuare.

Aceasta este ceea ce a lucrat pentru mine:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
Publicat 23/12/2015 la 12:30
sursa de către utilizator

voturi
-3

Acest lucru a lucrat pentru mine cel mai bun

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


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

}
Publicat 11/05/2016 la 06:40
sursa de către utilizator

voturi
-3

În opinia mea, răspunsul (prezentat mai sus și repetate de mai jos):

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

este cel mai bun răspuns, pentru că este evident, executat în timpul rulării, față de a fi o directivă compilării.

Publicat 09/09/2013 la 15:45
sursa de către utilizator

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