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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (112)

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

在反应本机我可以使用:

if (__DEV__) {
 .. do something special
}

检测开发模式。

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

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

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

提问于
用户回答回答于

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

在你AppDelegateRCTRootView初始化时,你检查它是否是,你会在常规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上,在你的MainActivity扩展中ReactActivity你可以使用类似的方法:

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;
}
用户回答回答于

扫码关注云+社区

领取腾讯云代金券