Reaccionar Nativo: ¿Cómo puedo detectar si mi código se está ejecutando en el Simulador?
En una aplicación Obj-C iOS puedo usar #if (TARGET_IPHONE_SIMULATOR)
para escribir código solo para el simulador.
En reacción nativa puedo utilizar:
- Ignorar el certificado SSL Comprobar en Android React Native
- React-native Android: Error al llamar AppRegistry.runApplication
- ACCESS_FINE_LOCATION no funciona
- ¿Cómo puedo mostrar el mapa de ruta de CurrentLocation a algún destino (algunos dirección) Ubicación
- ¿Existe una manera de pre-empaquetar la base de datos Realm (default.Realm) a través de React-Native (JS)
if (__DEV__) { .. do something special }
.. para detectar el modo de desarrollo.
Podemos usar Platform.OS === 'ios'
para detectar la plataforma (Android / iOS). Vea aquí para más información
Pero ¿cómo podemos detectar si la aplicación se está ejecutando en el simulador?
La razón por la que pregunto es que mi aplicación utiliza la cámara para escanear códigos de barras, y esto no es compatible con el iOS Simulator.
- Com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: No se pudo instalar todo
- Reaccionar-nativo con Android Studio
- React Native Android - No se pudo encontrar ni cargar la clase principal org.gradle.wrapper.GradleWrapperMain
- Reaccionar nativo + Actividad de Android OnPause / onResume
- Reaccionar datos de almacenamiento nativos entre sesiones
- Reaccione imágenes locales nativas con URI en Android
- React Native & okhttp en Android - Establecer User-Agent
- Cómo configurar canOverrideExistingModule = true
La solución más fácil que puedo pensar, que no requiere la creación de un módulo nativo (o modificar uno existente), sería pasar este parámetro como una propiedad de componente de reacción.
En tu AppDelegate
donde se inicializa el RCTRootView
, comprueba si es el simulador como lo harías en una aplicación de iOS regular; a continuación, pasar esta información a la vista de la raíz de reacción como su initialProperties
:
BOOL isSimulator = NO; #if TARGET_IPHONE_SIMULATOR isSimulator = YES; #endif RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName:@"ReactDemo" initialProperties:@{@"isSimulator": @(isSimulator)} launchOptions:launchOptions];
Ahora puedes acceder a ella en el JavaScript a través de los accesorios de tu componente reactivo:
this.props.isSimulator
En Android, en MainActivity
que extiende ReactActivity
puede utilizar un enfoque similar:
public boolean isEmulator() { return Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown") || Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK built for x86") || Build.MANUFACTURER.contains("Genymotion") || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) || "google_sdk".equals(Build.PRODUCT); } @Override protected Bundle getLaunchOptions() { Bundle opts = new Bundle(); opts.putBoolean("isEmulator", isEmulator()); return opts; }
Puede hacerlo fácilmente con reaccionar-nativo-dispositivo-info , así:
import DeviceInfo from 'react-native-device-info' isSimulator() { return DeviceInfo.isEmulator(); },
Usando reaccionar-nativo-dispositivo-info usted puede conseguir los datos siguientes (ejecutados en un simulador):
getUniqueID: DB71DCB5-6BB0-497B-BE9E-A02BCC1235B7 getInstanceID: undefined getDeviceId: x86_64 getManufacturer: Apple getModel: Simulator getBrand: Apple getSystemName: iOS getSystemVersion: 10.1 getBundleId: org.reactjs.native.example.project getBuildNumber: 1 getVersion: 1.0 getReadableVersion: 1.0.1 getDeviceName:MacBook Pro getUserAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72 getDeviceLocale: en getDeviceCountry: US getTimezone: America/Panama isEmulator: true isTablet: false
Actualmente, no hay ninguna forma de ver si se está ejecutando desde un simulador en JS.
Yo sugeriría agregar el TARGET_IPHONE_SIMULATOR
condicional para verificar su código nativo (si escribió su propio módulo). O tal vez utilizar un módulo de terceros que no hace la cámara si en un simulador … es decir: reaccionar-nativo de la cámara: https://github.com/lwansbrough/react-native-camera/search?utf8=% E2% 9C% 93 & q = TARGET_IPHONE_SIMULATOR