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.
En veloz
#if (arch(i386) || arch(x86_64))
...
#endif
Detecta si la aplicación se está construyendo para un dispositivo o simulador en Swift
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
}
}