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

时间:2016-01-11 17:48:31

标签: android ios react-native

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

在本地反应中,我可以使用:

if (__DEV__) {
 .. do something special
}

..检测开发模式。

我们可以使用Platform.OS === 'ios'来检测平台(Android / iOS)。 有关详细信息,请参阅此处Platform Docs

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

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

6 个答案:

答案 0 :(得分:51)

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

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

isSimulator() {
  return DeviceInfo.isEmulator();
},

答案 1 :(得分:21)

我能想到的最简单的解决方案,即不需要创建本机模块(或修改现有模块),将此参数作为反应组件属性传递。

在初始化AppDelegate的{​​{1}}中,您可以像在常规iOS应用中一样检查它是否是模拟器;然后将此信息作为其RCTRootView

传递给反应根视图
initialProperties

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

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

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

在Android上,this.props.isSimulator 扩展MainActivity你可以使用类似的方法:

ReactActivity

答案 2 :(得分:10)

如果您要构建CRNA / Expo应用,可以使用Expo.Constants.isDevice https://docs.expo.io/versions/latest/sdk/constants/#constantsisdevice

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

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

答案 3 :(得分:6)

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

Function MSumProd(a As Integer, b As Integer, c As Integer, d As Integer)

Dim n As Long
Dim Lastrow As Long, lRow As Long

' find last row with data in Column with passed integer 'b'
Lastrow = Range(Cells(a, b), Cells(a, b)).CurrentRegion.Rows.Count

' reset SUMPRODUCT value
n = 0

' loop through all rows with data in column 'b'
For lRow = a To Lastrow
    n = n + Cells(lRow, b).Value * Cells(c, d).Value
    ' I think you are trying to advance the row (and not column)
    ' Therefore, you need to advance a and not b
    ' In this code I advance the row with lROw in the "For" loop
    c = c + 1 ' can be removed, since is advanced as with lRow
Next lRow

MSumProd = n

End Function

答案 4 :(得分:1)

目前,没有任何方法可以查看您是否在JS中使用模拟器运行。

我建议添加条件TARGET_IPHONE_SIMULATOR以检入您​​的本机代码(如果您编写了自己的模块)。或者也许使用第三方模块,如果在模拟器中没有渲染相机...即:react-native-camera:https://github.com/lwansbrough/react-native-camera/search?utf8=%E2%9C%93&q=TARGET_IPHONE_SIMULATOR

答案 5 :(得分:0)

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

这可以使我的iOS模拟器与实际设备区分开来,因为模拟器返回localhost,而iOS设备返回127.0.0.1。尚未在Android上进行测试,但请告知它是否对您有帮助。