134 lines
3.0 KiB
TypeScript
134 lines
3.0 KiB
TypeScript
/**
|
||
* 应用配置工具
|
||
* 统一管理环境变量和配置
|
||
*/
|
||
|
||
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
|
||
// ⚠️ 重要:需要替换为你的本机 IP 地址
|
||
// 查看本机 IP:
|
||
// - Windows: ipconfig
|
||
// - Mac/Linux: ifconfig
|
||
// - 或者使用 Metro Bundler 显示的 IP
|
||
// process.env.APP_IP_ADDRESS 在 .env.development.local 中配置 自己本地创建,避免提交到代码库
|
||
return process.env.APP_IP_ADDRESS || '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;
|