Ответ 1
Вы можете сделать это довольно легко с помощью response-native-device-info, например:
import DeviceInfo from 'react-native-device-info'
isSimulator() {
return DeviceInfo.isEmulatorSync();
},
В приложении iOS Obj-C я могу использовать #if (TARGET_IPHONE_SIMULATOR)
для написания кода только для симулятора.
В ответном нативном я могу использовать:
if (__DEV__) {
.. do something special
}
.. для обнаружения режима разработки.
Мы можем использовать Platform.OS === 'ios'
для обнаружения платформы (Android/iOS).
Подробнее см. Здесь Документация по платформам
Но как определить, работает ли приложение в симуляторе?
Я прошу, что мое приложение использует камеру для сканирования штрих-кодов, и это не поддерживается в iOS-симуляторе.
Вы можете сделать это довольно легко с помощью response-native-device-info, например:
import DeviceInfo from 'react-native-device-info'
isSimulator() {
return DeviceInfo.isEmulatorSync();
},
Самое легкое решение, о котором я могу думать, которое не требует создания собственного модуля (или модификации существующего), - это передать этот параметр в качестве свойства реагирующего компонента.
В вашем 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;
}
Если вы создаете приложение 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
Используя 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
В настоящее время нет никакого способа узнать, работаете ли вы с симулятором в JS.
Я бы предложил добавить условный TARGET_IPHONE_SIMULATOR
, чтобы проверить свой собственный код (если вы написали свой собственный модуль). Или, возможно, использовать сторонний модуль, который не отображает камеру, если в симуляторе... то есть: реагировать-родная камера: https://github.com/lwansbrough/react-native-camera/search?utf8=%E2%9C%93&q=TARGET_IPHONE_SIMULATOR