Подтвердить что ты не робот

React Native: Как определить, работает ли мой код в симуляторе?

В приложении iOS Obj-C я могу использовать #if (TARGET_IPHONE_SIMULATOR) для написания кода только для симулятора.

В ответном нативном я могу использовать:

if (__DEV__) {
 .. do something special
}

.. для обнаружения режима разработки.

Мы можем использовать Platform.OS === 'ios' для обнаружения платформы (Android/iOS). Подробнее см. Здесь Документация по платформам

Но как определить, работает ли приложение в симуляторе?

Я прошу, что мое приложение использует камеру для сканирования штрих-кодов, и это не поддерживается в iOS-симуляторе.

4b9b3361

Ответ 1

Вы можете сделать это довольно легко с помощью response-native-device-info, например:

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

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

Ответ 2

Самое легкое решение, о котором я могу думать, которое не требует создания собственного модуля (или модификации существующего), - это передать этот параметр в качестве свойства реагирующего компонента.

В вашем AppDelegate, где инициализируется RCTRootView, вы проверяете, является ли это симулятором, как вы это делали бы в обычном приложении 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;
}

Ответ 4

Используя response-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

Ответ 5

В настоящее время нет никакого способа узнать, работаете ли вы с симулятором в JS.

Я бы предложил добавить условный TARGET_IPHONE_SIMULATOR, чтобы проверить свой собственный код (если вы написали свой собственный модуль). Или, возможно, использовать сторонний модуль, который не отображает камеру, если в симуляторе... то есть: реагировать-родная камера: https://github.com/lwansbrough/react-native-camera/search?utf8=%E2%9C%93&q=TARGET_IPHONE_SIMULATOR