React Native: Comment puis-je détecter si mon code fonctionne dans le simulateur?

dans une application Obj-C iOS je peux utiliser #if (TARGET_IPHONE_SIMULATOR) pour écrire du code simulant seulement.

À réagir native, je peux utiliser:

if (__DEV__) {
 .. do something special
}

.. pour détecter le mode de développement.

nous pouvons utiliser Platform.OS === 'ios' pour détecter la plateforme (Android / iOS). Voir ici pour plus d'info Plate-Forme Docs

mais comment détecter si l'application fonctionne dans le simulateur?

la raison pour laquelle je demande est que mon application utilise la caméra pour scanner les codes-barres, et ce n'est pas pris en charge dans le simulateur iOS.

26
demandé sur Cherniv 2016-01-11 20:48:30

5 réponses

la solution la plus simple à laquelle je puisse penser, qui ne nécessite pas de créer un module natif (ou de modifier un module existant), serait de passer ce paramètre comme propriété react component.

Dans votre AppDelegateRCTRootView est initialisé, vous vérifier si c'est le simulateur comme vous le feriez dans une application iOS; vous pouvez alors passer cette info à réagir à la racine de la vue comme sa initialProperties:

  BOOL isSimulator = NO;
#if TARGET_IPHONE_SIMULATOR
  isSimulator = YES;
#endif

  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"ReactDemo"
                                               initialProperties:@{@"isSimulator": @(isSimulator)}
                                                   launchOptions:launchOptions];

Maintenant vous pouvez y accéder dans le JavaScript via les accessoires de votre react composant:

this.props.isSimulator

sur Android, en vous MainActivity qui s'étend ReactActivity vous pouvez utiliser une approche similaire:

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;
}
19
répondu Artal 2016-08-19 14:35:45

Vous pouvez le faire assez facilement avec réagissent-native-appareil-info, comme ceci:

import DeviceInfo from 'react-native-device-info'

isSimulator() {
  return DeviceInfo.isEmulator();
},
41
répondu Lane Rettig 2017-06-16 10:32:08

en utilisant réagissent-native-appareil-info vous pouvez obtenir les données suivantes (exécuté sur un simulateur):

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
6
répondu chachan 2016-12-12 09:29:19

si vous construisez une application CRNA / Expo vous pouvez utiliser Expo.Constants.isDevice https://docs.expo.io/versions/latest/sdk/constants.html#expoconstantsisdevice

import { Constants } from 'expo'
//....

console.log(Constants.isDevice) // => false if simulator
6
répondu sguha 2017-12-15 01:09:38

Actuellement, il n'y a aucun moyen de voir si vous êtes en train de courir à partir d'un simulateur à JS.

je suggère d'ajouter la condition TARGET_IPHONE_SIMULATOR pour vérifier votre code natif (si vous avez écrit votre propre module). Ou peut-être utiliser un module tiers qui ne rend pas la caméra si dans un simulateur...https://github.com/lwansbrough/react-native-camera/search?utf8=%E2%9C%93&q=TARGET_IPHONE_SIMULATOR

1
répondu Dave Sibiski 2016-01-11 19:33:45