You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
2.9 KiB
129 lines
2.9 KiB
/** |
|
* 应用配置工具 |
|
* 统一管理环境变量和配置 |
|
*/ |
|
|
|
import Constants from 'expo-constants'; |
|
import { Platform } from 'react-native'; |
|
|
|
/** |
|
* 环境类型 |
|
*/ |
|
export type Environment = 'development' | 'staging' | 'production'; |
|
|
|
/** |
|
* 获取当前环境 |
|
*/ |
|
export const getEnvironment = (): Environment => { |
|
if (__DEV__) { |
|
return 'development'; |
|
} |
|
|
|
// 可以通过环境变量或其他方式判断 staging 环境 |
|
const env = process.env.EXPO_PUBLIC_ENV; |
|
if (env === 'staging') { |
|
return 'staging'; |
|
} |
|
|
|
return 'production'; |
|
}; |
|
|
|
/** |
|
* 获取 API 基础 URL |
|
*/ |
|
export const getApiBaseUrl = (): string => { |
|
// 1. 优先使用环境变量 |
|
const envApiUrl = process.env.EXPO_PUBLIC_API_URL; |
|
if (envApiUrl) { |
|
return envApiUrl; |
|
} |
|
|
|
// 2. 根据环境返回不同的 URL |
|
const env = getEnvironment(); |
|
|
|
switch (env) { |
|
case 'development': |
|
// 开发环境 |
|
if (Platform.OS === 'web') { |
|
// Web 平台使用代理服务器 |
|
// 代理服务器运行在 http://localhost:8086 |
|
// 会将 /api/* 请求转发到目标服务器 |
|
return 'http://localhost:8086/api'; |
|
} else { |
|
// iOS/Android 使用本机 IP |
|
// 从环境变量读取,避免多人开发时地址冲突 |
|
// 请在 .env.local 文件中配置 EXPO_PUBLIC_DEV_API_URL |
|
return process.env.EXPO_PUBLIC_DEV_API_URL || 'http://192.168.1.100:8086/api'; |
|
} |
|
|
|
case 'staging': |
|
// 预发布环境 |
|
return 'https://staging-api.yourdomain.com/api'; |
|
|
|
case 'production': |
|
// 生产环境 |
|
return 'https://api.yourdomain.com/api'; |
|
|
|
default: |
|
return '/api'; |
|
} |
|
}; |
|
|
|
/** |
|
* 获取 API 超时时间 |
|
*/ |
|
export const getApiTimeout = (): number => { |
|
const timeout = process.env.EXPO_PUBLIC_API_TIMEOUT; |
|
return timeout ? Number(timeout) : 10000; |
|
}; |
|
|
|
/** |
|
* 应用配置 |
|
*/ |
|
export const config = { |
|
// 环境 |
|
env: getEnvironment(), |
|
isDev: __DEV__, |
|
|
|
// API 配置 |
|
api: { |
|
baseURL: getApiBaseUrl(), |
|
timeout: getApiTimeout(), |
|
}, |
|
|
|
// 应用信息 |
|
app: { |
|
name: process.env.EXPO_PUBLIC_APP_NAME || 'RN Demo', |
|
version: process.env.EXPO_PUBLIC_APP_VERSION || '1.0.0', |
|
bundleId: Constants.expoConfig?.ios?.bundleIdentifier || '', |
|
packageName: Constants.expoConfig?.android?.package || '', |
|
vk: 'fT6phq0wkOPRlAoyToidAnkogUV7ttGo', |
|
nc: 1, |
|
aseqId: '7', |
|
}, |
|
|
|
// 平台信息 |
|
platform: { |
|
os: Platform.OS, |
|
version: Platform.Version, |
|
isWeb: Platform.OS === 'web', |
|
isIOS: Platform.OS === 'ios', |
|
isAndroid: Platform.OS === 'android', |
|
}, |
|
}; |
|
|
|
/** |
|
* 打印配置信息(仅开发环境) |
|
*/ |
|
export const printConfig = () => { |
|
if (__DEV__) { |
|
console.log('📋 App Configuration:', { |
|
environment: config.env, |
|
apiBaseURL: config.api.baseURL, |
|
platform: config.platform.os, |
|
version: config.app.version, |
|
}); |
|
} |
|
}; |
|
|
|
export default config;
|
|
|