React Native:如何检测我的代码是否在模拟器中运行?

在Obj-C iOS应用程序中,我可以使用#if (TARGET_IPHONE_SIMULATOR)编写仅模拟器的代码。

在反应本机我可以使用:

 if (__DEV__) { .. do something special } 

检测开发模式。

我们可以使用Platform.OS === 'ios'来检测平台(Android / iOS)。 请参阅这里了解更多信息平台文档

但是,我们如何检测应用程序是否在模拟器中运行?

我问的原因是我的应用程序使用相机扫描条形码,这是不支持iOS模拟器。

  • 如何在反应原生的特定时间安排后台工作
  • 以编程方式重新启动一个React本机应用程序
  • 反应本机twilio Android错误
  • Android Studio 3中反应生成的资源问题
  • React Native:未find哈希string“android-X”的目标
  • 没有为类RCTMap定义的视图pipe理器
  • 无法在Android设备上构buildreact-native应用程序:无法使用哈希string“android-23”查找目标
  • React Native“hello world”快速入门:“无法连接到开发服务器”
  • 我能想到的最简单的解决scheme,不需要创build本地模块(或者修改现有模块),而是将这个参数作为一个反应组件属性来传递。

    在初始化RCTRootViewAppDelegate中,检查是否是模拟器,就像在常规的iOS应用程序中一样; 然后你将这个信息作为initialProperties传递给反应的根视图:

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

    现在你可以通过反应组件的道具在JavaScript中访问它:

     this.props.isSimulator 

    在Android上,在扩展ReactActivity MainActivity ,您可以使用类似的方法:

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

    您可以使用react-native-device-info轻松完成此操作,如下所示:

     import DeviceInfo from 'react-native-device-info' isSimulator() { return DeviceInfo.isEmulator(); }, 

    使用react-native-device-info你可以得到以下数据(在模拟器上执行):

     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 

    目前,没有办法看到你是否从JS中的模拟器运行。

    我会build议添加条件TARGET_IPHONE_SIMULATOR来检查你的本地代码(如果你写自己的模块)。 或者,也许使用第三方模块,如果在模拟器中不渲染相机…即:react-native-camera: https : //github.com/lwansbrough/react-native-camera/search?utf8 =% E2%9C%93&q = TARGET_IPHONE_SIMULATOR

    如果你正在构build一个CRNA / Expo应用程序,你可以使用Expo.Constants.isDevice https://docs.expo.io/versions/latest/sdk/constants.html#expoconstantsisdevice

     import { Constants } from 'expo' //.... console.log(Constants.isDevice) // => false if simulator