在Obj-C iOS应用程序中,我可以使用#if (TARGET_IPHONE_SIMULATOR)
编写仅限模拟器的代码。
在react原生中,我可以使用:
if (__DEV__) {
.. do something special
}
。。来检测开发模式。
我们可以使用Platform.OS === 'ios'
来检测平台(Android/iOS)。有关更多信息,请参阅此处Platform Docs
但是我们如何检测应用程序是否在模拟器中运行呢?
我问的原因是我的应用程序使用摄像头来扫描条形码,而这在iOS模拟器中不受支持。
发布于 2016-02-21 05:55:27
使用react-native-device-info可以很容易地做到这一点,如下所示:
import DeviceInfo from 'react-native-device-info'
isSimulator() {
// https://github.com/react-native-community/react-native-device-info#isemulator
return DeviceInfo.isEmulator();
},
发布于 2016-01-12 06:07:00
我能想到的不需要创建本机模块(或修改现有模块)的最简单的解决方案是将此参数作为react组件属性传递。
在初始化RCTRootView
的AppDelegate
中,您可以像在常规iOS应用程序中那样检查它是否是模拟器;然后将此信息作为其initialProperties
传递给react根视图
BOOL isSimulator = NO;
#if TARGET_IPHONE_SIMULATOR
isSimulator = YES;
#endif
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"ReactDemo"
initialProperties:@{@"isSimulator": @(isSimulator)}
launchOptions:launchOptions];
现在,您可以通过react组件的道具在JavaScript中访问它:
this.props.isSimulator
在安卓上,在扩展ReactActivity
的you MainActivity
中,你可以使用类似的方法:
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;
}
发布于 2017-12-15 08:45:24
如果您正在构建一个CRNA/世博会应用程序,您可以使用Expo.Constants.isDevice
https://docs.expo.io/versions/latest/sdk/constants/#constantsisdevice
import { Constants } from 'expo'
//....
console.log(Constants.isDevice) // => false if simulator
https://stackoverflow.com/questions/34727912
复制相似问题