como cerrar aplicaciones ios objective-c swift xcode ios-simulator

ios - como cerrar aplicaciones en iphone 7



¿Cómo puedo determinar mediante programación si mi aplicación se está ejecutando en el simulador de iphone? (21)

Código actualizado:

Se supone que esto funciona oficialmente.

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

Post original (desde desaprobado)

Este código le dirá si está ejecutando en un simulador.

#ifdef __i386__ NSLog(@"Running in the simulator"); #else NSLog(@"Running on a device"); #endif

Como dice la pregunta, principalmente me gustaría saber si mi código se está ejecutando en el simulador o no, pero también estaría interesado en saber la versión específica del iPhone que se está ejecutando o está simulando.

EDITAR: Agregué la palabra ''programáticamente'' al nombre de la pregunta. El punto de mi pregunta es poder incluir / excluir dinámicamente el código dependiendo de qué versión / simulador se esté ejecutando, por lo que realmente estaría buscando algo como una directiva de preprocesador que pueda brindarme esta información.


¡HAY UNA MANERA MEJOR AHORA!

A partir de Xcode 9.3 beta 4 puede usar #if targetEnvironment(simulator) para verificar.

#if targetEnvironment(simulator) //Your simulator code #endif

ACTUALIZAR
Xcode 10 y iOS 12 SDK también son compatibles con esto.


¿Alguien ha considerado la respuesta proporcionada here ?

Supongo que el objetivo-c equivalente sería

+ (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); } }


/// Devuelve true si su simulador y no un dispositivo

public static var isSimulator: Bool { #if (arch(i386) || arch(x86_64)) && os(iOS) return true #else return false #endif }


Apple ha agregado soporte para verificar que la aplicación está dirigida al simulador con lo siguiente:

#if targetEnvironment(simulator) let DEVICE_IS_SIMULATOR = true #else let DEVICE_IS_SIMULATOR = false #endif


Con Swift 4.2 (Xcode 10), podemos hacer esto

#if targetEnvironment(simulator) //simulator code #else #warning("Not compiling for simulator") #endif


En mi opinión, la respuesta (presentada arriba y repetida abajo):

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

es la mejor respuesta porque obviamente se ejecuta en RUNTIME en lugar de ser un DIRECTIVO COMPILAR.



Esto me funcionó mejor

NSString *name = [[UIDevice currentDevice] name]; if ([name isEqualToString:@"iPhone Simulator"]) { }


Incluir todo tipo de "simuladores".

NSString *model = [[UIDevice currentDevice] model]; if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound) { // we are running in a simulator }


La mejor manera de hacer esto es:

#if TARGET_IPHONE_SIMULATOR

y no

#ifdef TARGET_IPHONE_SIMULATOR

ya que siempre está definido: 0 o 1


Las respuestas anteriores son un poco anticuadas. Descubrí que todo lo que necesita hacer es consultar la macro TARGET_IPHONE_SIMULATOR ( no es necesario incluir ningún otro archivo de encabezado [suponiendo que esté codificando para iOS]).

TARGET_OS_IPHONE pero devolvió el mismo valor (1) cuando se TARGET_OS_IPHONE en un dispositivo y simulador reales, por eso recomiendo usar TARGET_IPHONE_SIMULATOR .


Mi respuesta se basa en la respuesta de @Daniel Magnusson y en los comentarios de @Nuthatch y @ n.Drake. y lo escribo para ahorrar tiempo a los usuarios rápidos que trabajan en iOS9 y en adelante.

Esto es lo que funcionó para mí:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){ //Code executing on Simulator } else{ //Code executing on Device }


No era una directiva de preprocesador, pero esto era lo que estaba buscando cuando llegué a esta pregunta;

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


Todas esas respuestas son buenas, pero de alguna manera confunden a un novato como yo, ya que no aclara la compilación y el tiempo de ejecución. El preprocesador está antes del tiempo de compilación, pero deberíamos hacerlo más claro

Este artículo del blog muestra ¿Cómo detectar el simulador de iPhone? claramente

Tiempo de ejecución

En primer lugar, vamos a discutir en breve. UIDevice ya le proporciona información sobre el dispositivo

[[UIDevice currentDevice] model]

le devolverá el "Simulador de iPhone" o "iPhone" según el lugar donde se ejecuta la aplicación.

Tiempo de compilación

Sin embargo lo que se quiere es usar el tiempo de compilación definido. ¿Por qué? Debido a que compila su aplicación estrictamente para ejecutarse ya sea dentro del simulador o en el dispositivo. Apple realiza una definición llamada TARGET_IPHONE_SIMULATOR . Así que echemos un vistazo al código:

#if TARGET_IPHONE_SIMULATOR NSLog(@"Running in Simulator - no app store or giro"); #endif


Trabaja para Swift 4 y Xcode 9.4.1

Usa este código:

#if targetEnvironment(simulator) // Simulator #else // Device #endif


Tuve el mismo problema, tanto TARGET_IPHONE_SIMULATOR como TARGET_OS_IPHONE siempre están definidos, y están configurados en 1. La solución de Pete funciona, por supuesto, pero si alguna vez construyes algo diferente a Intel (poco probable, pero quién sabe), aquí hay algo seguro siempre y cuando el hardware del iPhone no cambie (por lo que su código siempre funcionará para los iphones actualmente disponibles):

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

Colóquelo en un lugar conveniente y luego pretenda que las constantes TARGET_* se definieron correctamente.


Ya lo pedí, pero con un título muy diferente.

Qué #defines están configurados por Xcode al compilar para iPhone

Repetiré mi respuesta desde allí:

Se encuentra en los documentos del SDK en "Compilación del código fuente de forma condicional"

La definición relevante es TARGET_OS_SIMULATOR, que se define en /usr/include/TargetConditionals.h dentro del marco de trabajo de iOS. En versiones anteriores de la cadena de herramientas, tenías que escribir:

#include "TargetConditionals.h"

pero esto ya no es necesario en la cadena de herramientas actual (Xcode 6 / iOS8).

Así, por ejemplo, si desea comprobar que está ejecutando en un dispositivo, debe hacer

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

Dependiendo de lo que sea apropiado para su caso de uso.


En caso de Swift podemos implementar los siguientes.

Podemos crear estructuras que le permiten crear datos estructurados.

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

Entonces, si quisiéramos detectar si la aplicación se está construyendo para un dispositivo o simulador en Swift entonces.

if Platform.isSimulator { // Do one thing } else { // Do the other }


Solución SWIFT 4

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

TARGET_OS_SIMULATOR se encuentra en el archivo Darwin.TargetConditionals.swift .


si nada funciono, prueba esto

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