在代码中确定应用程序是否在Expo Go中运行(在生产构建中)。

9

我想在React Native代码中确定应用程序是在Expo Go中运行还是作为独立的iOS/Android应用程序运行。

我不能使用__DEV__,因为我想能够针对生产版本进行确定。

3个回答

17

您可以使用Expo中的AppOwnership,它来自于Constants

import Constants from 'expo-constants'

const isRunningInExpoGo = Constants.appOwnership === 'expo'

来源


3
此属性appOwnership仅适用于托管工作流和经典构建;对于使用EAS Build构建的应用程序和原生工作流,结果始终为null。 - timboektoe

4
由于经典构建已被弃用,每个人都将开始使用EAS构建,因此您需要使用Constants.ExecutionEnvironment而不是appOwnership来检查构建是否通过EAS进行,因为在EAS构建中,appOwnership始终为null。
因此,您可以使用以下代码来检查是否处于生产环境:
ExecutionEnvironment.Standalone === "standalone"

文档可以在这里找到


1
@JulienPepe 这是正确的,因为您正在使用expo-dev-client。 因此,standalone用于生产构建,storeClient用于通过Expo Go客户端进行开发,而bare用于通过自己的应用程序进行开发(无论是通过弹出还是通过dev-client,因为它基本上是裸设置的“模拟器”)。 - Eduard
我一直在使用 eas build --platform ios 来构建正式版应用,使用 eas build --profile development-simulator --platform ios 来构建开发版应用。但不幸的是,Constants.executionEnvironment 对于两者都返回 bare。你有任何想法为什么会发生这种情况吗? - ElDiabolo
@Eduard 不,我没有弹出。我在谈论正确的代码片段,因为ExecutionEnvironment是一个枚举,看起来像这样 export enum ExecutionEnvironment { Bare = 'bare', Standalone = 'standalone', StoreClient = 'storeClient'} 你的检查将始终返回true,因为你将枚举值Standalone = 'standalone'与字符串"standalone"进行比较。 - undefined
如果你将你的应用程序弹出,你将会得到一个bare作为正确的响应,你可以在这里找到文档:https://docs.expo.dev/bare/overview/ - undefined
@Nazar,不要将appOwnershipExecutionEnvironment混淆,如果你在expo-dev-client上运行,将返回bare,而如果你直接在Expo Go上运行,则返回storeClient,当在最终的EAS Build应用程序中运行时,则返回standalone - undefined
显示剩余5条评论

2
如果您正在使用带有TypeScript的EAS Builds,并且由于ExecutionEnvironment是一个看起来像这样的枚举类型:
export enum ExecutionEnvironment { 
Bare = 'bare', Standalone = 'standalone', StoreClient = 'storeClient'}

确定当前环境的正确方法是:
Constants.executionEnvironment === ExecutionEnvironment.Standalone

或者适用于裸露的React Native应用程序:
Constants.executionEnvironment === ExecutionEnvironment.Bare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接