React Native: Wie kann ich erkennen, ob mein Code im Simulator läuft?

Lesezeit: 4 Minuten

Benutzer-Avatar
Ben Clayton

In einer Obj-C iOS-App kann ich verwenden #if (TARGET_IPHONE_SIMULATOR) Nur-Simulator-Code zu schreiben.

In React Native kann ich verwenden:

if (__DEV__) {
 .. do something special
}

.. um den Entwicklungsmodus zu erkennen.

Wir können benutzen Platform.OS === 'ios' um die Plattform (Android/iOS) zu erkennen. Weitere Informationen finden Sie hier Plattformdokumente

Aber wie erkennen wir, ob die App im Simulator läuft?

Der Grund, warum ich frage, ist, dass meine App die Kamera zum Scannen von Barcodes verwendet und dies im iOS-Simulator nicht unterstützt wird.

Benutzer-Avatar
Lane Rettig

Das kannst du ganz einfach mit machen reagieren-native-geräte-infoso:

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

isSimulator() {
  // https://github.com/react-native-community/react-native-device-info#isemulator
  return DeviceInfo.isEmulator();
},

  • Hat .getModel() das gleiche Ergebnis auch auf Android? Was ist “Simulator”?

    – zianwar

    27. August 2016 um 23:40 Uhr

  • Tut mir leid, ich weiß nicht, ich habe nicht viel mit Android gemacht! Tolle Frage!

    – Gasse Rettig

    28. August 2016 um 3:08 Uhr

  • Dies funktioniert nicht auf Android-Simulatoren (zumindest in meinem)

    – R01010010

    22. Dezember 2016 um 23:09 Uhr

  • Verwenden Sie stattdessen DeviceInfo.isEmulator(). Ich habe die Antwort bearbeitet.

    – Bruno Lemos

    30. März 2017 um 0:04 Uhr

  • @BrunoLemos Ich glaube nicht, dass deine Bearbeitung gespeichert/akzeptiert wurde

    – Marklar

    16. Juni 2017 um 7:28 Uhr

Benutzer-Avatar
Artal

Die einfachste Lösung, die ich mir vorstellen kann und für die kein natives Modul erstellt (oder ein vorhandenes geändert) werden muss, wäre, diesen Parameter als React-Komponenteneigenschaft zu übergeben.

In deiner AppDelegate bei dem die RCTRootView initialisiert ist, überprüfen Sie, ob es sich um den Simulator handelt, wie Sie es in einer normalen iOS-App tun würden; Sie übergeben diese Informationen dann als ihre an die Reaktionsstammansicht initialProperties:

  BOOL isSimulator = NO;
#if TARGET_IPHONE_SIMULATOR
  isSimulator = YES;
#endif
  
  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"ReactDemo"
                                               initialProperties:@{@"isSimulator": @(isSimulator)}
                                                   launchOptions:launchOptions];

Jetzt können Sie im JavaScript über die Props Ihrer React-Komponente darauf zugreifen:

this.props.isSimulator

Auf Android, in dir MainActivity was sich erstreckt ReactActivity Sie können einen ähnlichen Ansatz verwenden:

import android.os.Build;
import android.os.Bundle;

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

  • Hey, tolle Lösung und es funktioniert wie ein Zauber. Hast du auch ein Code-Snippet, wie das mit Android funktionieren würde?

    – Sebastian

    19. August 2016 um 9:19 Uhr

  • @SebastianGermesin Ich habe die Antwort aktualisiert, um eine Lösung für Android mit einem ähnlichen Ansatz zu zeigen.

    – Artal

    19. August 2016 um 14:37 Uhr

  • In der neuesten RN (0.63.x) mit createReactActivityDelegate funktioniert.

    – Freigänger

    15. September 2020 um 20:04 Uhr

  • Ich musste auch eine Zeile wie diese hinzufügen: || Build.MODEL.contains("sdk_gphone")

    – Freigänger

    15. September 2020 um 20:17 Uhr

  • Wie kann ich für ios auf den Wert isSimulator in der funktionalen Komponente zugreifen? da es ‘dies’ nicht gibt

    – Tuan Dat Tran

    8. Juni um 3:12

Benutzer-Avatar
sguha

Wenn Sie eine CRNA/Expo-App erstellen, können Sie verwenden Device.isDevice
https://docs.expo.dev/versions/latest/sdk/device/#deviceisdevice

import * as Device from 'expo-device';
//....

console.log(Device.isDevice) // => false if simulator

Verwenden reagieren-native-geräte-info Sie können die folgenden Daten erhalten (ausgeführt auf einem Simulator):

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

Derzeit gibt es keine Möglichkeit zu sehen, ob Sie von einem Simulator in JS aus ausgeführt werden.

Ich würde vorschlagen, die Bedingung hinzuzufügen TARGET_IPHONE_SIMULATOR um Ihren nativen Code einzuchecken (wenn Sie Ihr eigenes Modul geschrieben haben). Oder verwenden Sie vielleicht ein Modul eines Drittanbieters, das die Kamera nicht rendert, wenn sie sich in einem Simulator befindet … dh: React-native-camera: https://github.com/lwansbrough/react-native-camera/search?utf8=%E2%9C%93&q=TARGET_IPHONE_SIMULATOR

Benutzer-Avatar
Kamen Zwetkow

import getHostForRN from 'rn-host-detect';
const IS_SIMULATOR = getHostForRN('127.0.0.1') == "localhost";

Dies funktioniert, um meinen iOS-Simulator von meinem tatsächlichen Gerät zu unterscheiden, da der Simulator zurückkehrt localhost und das iOS-Gerät kehrt zurück 127.0.0.1. Ich habe es nicht auf Android getestet, aber lassen Sie mich wissen, ob es Ihnen hilft.

1175290cookie-checkReact Native: Wie kann ich erkennen, ob mein Code im Simulator läuft?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy