当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ReactNative:如何检测我的代码是否在模拟器中运行?》经验,为你挑选了4个好方法。

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

在本地反应我可以使用:

if (__DEV__) {
 .. do something special
}

..检测开发模式.

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

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

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



1> Lane Rettig..:

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

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

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


请改用DeviceInfo.isEmulator().我编辑了答案.
.getModel()在android上也有相同的结果吗?这是"模拟器"?

2> Artal..:

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

在你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];

现在,您可以通过您的react组件的props在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;
}



3> sguha..:

如果您正在构建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



4> chachan..:

使用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

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有