web-dev-qa-db-ja.com

React Native:コードがシミュレータで実行されているかどうかを検出するにはどうすればよいですか?

Obj-C iOSアプリでは、#if (TARGET_IPHONE_SIMULATOR)を使用してシミュレーター専用のコードを記述できます。

反応ネイティブで私は使用できます:

if (__DEV__) {
 .. do something special
}

..開発モードを検出します。

Platform.OS === 'ios'を使用して、プラットフォーム(Android/iOS)を検出できます。詳細はこちらをご覧ください Platform Docs

しかし、シミュレーターでアプリが実行されているかどうかをどのように検出しますか?

私が尋ねる理由は、アプリがカメラを使用してバーコードをスキャンすることであり、これはiOSシミュレーターではサポートされていないためです。

32
Ben Clayton

react-native-device-info を使用すると、これを非常に簡単に行うことができます。

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

isSimulator() {
  return DeviceInfo.isEmulator();
},
56
Lane Rettig

私が考えることができる最も簡単な解決策は、ネイティブモジュールの作成(または既存のモジュールの変更)を必要とせず、このパラメーターをリアクティブコンポーネントプロパティとして渡すことです。

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

これで、reactコンポーネントの小道具を介して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;
}
21
Artal

CRNA/Expoアプリを作成している場合は、Expo.Constants.isDevicehttps://docs.expo.io/versions/latest/sdk/constants/#constantsisdevice

import { Constants } from 'expo'
//....

console.log(Constants.isDevice) // => false if simulator
11
sguha

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
6
chachan

現在、JSのシミュレーターから実行しているかどうかを確認する方法はありません。

条件付きTARGET_IPHONE_SIMULATORを追加して、ネイティブコードをチェックインすることをお勧めします(独自のモジュールを作成した場合)。または、シミュレータ内にある場合はカメラをレンダリングしないサードパーティのモジュールを使用します... ie:react-native-camera: https://github.com/lwansbrough/react-native-camera/search ?utf8 =%E2%9C%93&q = TARGET_IPHONE_SIMULATOR

1
Dave Sibiski