react navite 安卓iOS 打包、签名、环境区分

如果你现在是在做 React Native 原生 Android + iOS 项目,可以把「打包、签名、环境区分」理解成三件事:

开发环境 → 测试环境 → 生产环境

不同配置 → 不同包名/Bundle ID → 不同签名 → 不同安装包

我给你按实际项目中比较常用的方案梳理一下。


一、推荐的环境划分

建议至少分:

环境 Android iOS 用途
dev 开发包 开发包 本地开发
test 测试包 测试包 测试/联调
prod 正式包 正式包 上架

例如:

复制代码
开发环境
com.example.app.dev

测试环境
com.example.app.test

生产环境
com.example.app

这样三个 App 可以同时安装在手机上,非常方便。


二、React Native 环境变量

推荐使用:

arduino 复制代码
react-native-config

例如:

bash 复制代码
.env
.env.development
.env.test
.env.production

.env.development

ini 复制代码
API_URL=https://dev-api.example.com
APP_ENV=development

.env.test

ini 复制代码
API_URL=https://test-api.example.com
APP_ENV=test

.env.production

ini 复制代码
API_URL=https://api.example.com
APP_ENV=production

JS 中:

javascript 复制代码
import Config from 'react-native-config';

console.log(Config.API_URL);
console.log(Config.APP_ENV);

例如:

bash 复制代码
fetch(`${Config.API_URL}/user/info`);

三、Android 打包

Android 原生项目:

erlang 复制代码
android/
├── app/
│   ├── build.gradle
│   └── ...
└── build.gradle

Android 最常见的环境方案是:

复制代码
productFlavors

例如:

bash 复制代码
android {
    ...

    flavorDimensions "environment"

    productFlavors {
        dev {
            dimension "environment"
            applicationIdSuffix ".dev"
            versionNameSuffix "-dev"
        }

        test {
            dimension "environment"
            applicationIdSuffix ".test"
            versionNameSuffix "-test"
        }

        prod {
            dimension "environment"
        }
    }
}

最终:

bash 复制代码
dev
com.example.app.dev

test
com.example.app.test

prod
com.example.app

四、Android 签名

正式 Android 包一定需要签名。

通常:

arduino 复制代码
release.keystore

例如生成:

vbnet 复制代码
keytool -genkeypair \
  -v \
  -keystore release.keystore \
  -alias my-key \
  -keyalg RSA \
  -keysize 2048 \
  -validity 10000

然后:

arduino 复制代码
android/app/release.keystore

不要把 keystore 提交到 Git。

推荐:

bash 复制代码
android/gradle.properties

配置:

ini 复制代码
MYAPP_UPLOAD_STORE_FILE=release.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key
MYAPP_UPLOAD_STORE_PASSWORD=******
MYAPP_UPLOAD_KEY_PASSWORD=******

更推荐生产环境通过:

复制代码
CI/CD Secret

注入,而不是直接写进项目。


五、Android Release 签名配置

android/app/build.gradle

arduino 复制代码
android {

    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
                storeFile file(MYAPP_UPLOAD_STORE_FILE)
                storePassword MYAPP_UPLOAD_STORE_PASSWORD
                keyAlias MYAPP_UPLOAD_KEY_ALIAS
                keyPassword MYAPP_UPLOAD_KEY_PASSWORD
            }
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release

            minifyEnabled false
            shrinkResources false
        }
    }
}

然后执行:

bash 复制代码
cd android

正式 APK:

bash 复制代码
./gradlew assembleProdRelease

Windows:

复制代码
gradlew.bat assembleProdRelease

生成:

arduino 复制代码
android/app/build/outputs/apk/release/

如果使用 AAB:

复制代码
gradlew.bat bundleProdRelease

生成:

arduino 复制代码
app-prod-release.aab

Google Play 推荐上传 AAB。


六、Android Debug / Test / Production

最终可以形成:

bash 复制代码
# 开发
npx react-native run-android --mode devDebug

# 测试
cd android
gradlew.bat assembleTestRelease

# 正式
gradlew.bat bundleProdRelease

也可以:

复制代码
gradlew.bat assembleDevDebug
gradlew.bat assembleTestRelease
gradlew.bat assembleProdRelease

七、iOS 环境区分

iOS 比 Android 稍微麻烦一些。

通常使用:

diff 复制代码
Scheme
+
Build Configuration
+
xcconfig

例如:

sql 复制代码
Debug-Dev
Debug-Test
Release-Dev
Release-Test
Release-Prod

或者简单一点:

复制代码
Dev
Test
Prod

八、iOS Bundle Identifier

例如:

复制代码
Development
com.example.app.dev

Test
com.example.app.test

Production
com.example.app

这样可以:

复制代码
App Dev
App Test
App

同时安装。

这是非常推荐的方案。


九、iOS Signing

iOS 签名涉及:

markdown 复制代码
Apple Developer
    ↓
Certificate
    ↓
Provisioning Profile
    ↓
Bundle Identifier

生产环境一般:

diff 复制代码
Apple Distribution Certificate
+
App Store Provisioning Profile

测试环境可以:

复制代码
Apple Development

或者:

复制代码
Ad Hoc

如果是公司项目,我更推荐使用:

复制代码
Xcode Automatic Signing

开发阶段。

生产 CI/CD 再使用:

sql 复制代码
Match

管理证书和 Provisioning Profile。


十、iOS Scheme

例如:

复制代码
App
App-Dev
App-Test

Scheme:

markdown 复制代码
App-Dev
    ↓
Debug-Dev

App-Test
    ↓
Debug-Test

App
    ↓
Release-Prod

然后不同 Scheme 使用不同:

复制代码
.xcconfig

例如:

复制代码
Config/
├── Dev.xcconfig
├── Test.xcconfig
└── Prod.xcconfig

十一、iOS xcconfig

Dev.xcconfig

ini 复制代码
API_URL = https://dev-api.example.com
APP_ENV = development

Test.xcconfig

ini 复制代码
API_URL = https://test-api.example.com
APP_ENV = test

Prod.xcconfig

ini 复制代码
API_URL = https://api.example.com
APP_ENV = production

然后让:

复制代码
Dev Scheme → Dev.xcconfig
Test Scheme → Test.xcconfig
Prod Scheme → Prod.xcconfig

十二、RN 项目最终结构

我比较推荐你做成这样:

css 复制代码
ReactNativeProject
│
├── src/
│   ├── api/
│   ├── components/
│   ├── screens/
│   └── config/
│
├── .env.development
├── .env.test
├── .env.production
│
├── android/
│   └── app/
│       ├── build.gradle
│       └── src/
│           ├── dev/
│           ├── test/
│           └── prod/
│
└── ios/
    ├── App/
    ├── Config/
    │   ├── Dev.xcconfig
    │   ├── Test.xcconfig
    │   └── Prod.xcconfig
    │
    └── ...

十三、最重要:不要只区分 API

很多 RN 项目一开始只做:

ini 复制代码
API_URL=xxx

实际上生产项目最好同时区分:

vbnet 复制代码
API 地址
App 名称
Bundle ID
Android applicationId
推送 AppKey
地图 Key
微信 AppID
支付宝 AppID
Firebase
Google Service
Sentry
统计 SDK

例如:

arduino 复制代码
Dev

com.example.app.dev
https://dev-api.example.com
Firebase Dev
Sentry Dev
微信 Dev


Test

com.example.app.test
https://test-api.example.com
Firebase Test
Sentry Test


Prod

com.example.app
https://api.example.com
Firebase Prod
Sentry Prod
微信 Prod

十四、推荐的完整发布流程

实际公司项目可以这样:

markdown 复制代码
                    Git
                     │
          ┌──────────┼──────────┐
          ↓          ↓          ↓
         Dev        Test       Prod
          │          │          │
          ↓          ↓          ↓
       Debug APK   APK/AAB    AAB
          │          │          │
          ↓          ↓          ↓
       开发人员     测试人员    App Store
                              Google Play

更进一步:

bash 复制代码
Git Push
   ↓
GitHub Actions
   ↓
┌───────────────┐
│ Environment   │
├───────────────┤
│ dev           │
│ test          │
│ production    │
└───────────────┘
   ↓
Android Build + Sign
   +
iOS Build + Sign
   ↓
Artifact
   ↓
TestFlight / Google Play

十五、如果你现在刚开始做 RN 项目

我建议你不要一开始搞得特别复杂。

直接采用:

bash 复制代码
React Native
│
├── .env.development
├── .env.test
├── .env.production
│
├── Android
│   ├── dev
│   ├── test
│   └── prod
│
└── iOS
    ├── Dev Scheme
    ├── Test Scheme
    └── Prod Scheme

核心对应关系:

bash 复制代码
              Android                  iOS
──────────────────────────────────────────────
开发          devDebug                 Dev
测试          testRelease              Test
生产          prodRelease              Prod
──────────────────────────────────────────────
包名          applicationId            Bundle ID
签名          keystore                 Certificate
环境变量      .env                     xcconfig
发布          APK/AAB                  IPA/TestFlight

**如果你是准备做一个真正能上线的 RN 项目,我建议下一步直接把「Android productFlavors + iOS Scheme + .env + 签名 + GitHub Actions CI/CD」一次性搭起来。**这样以后你执行类似 npm run android:testnpm run ios:devnpm run build:prod 就能自动走对应环境。

相关推荐
coderCN22 分钟前
Nodejs 第三十四章 数据库(表达式和函数、子查询和连表)
前端·node.js
ssshooter1 小时前
AI 时代你不能不知道的 git worktree
前端·后端·面试
观测云1 小时前
AI时代的用户访问监测:观测云带你身临其境体验用户与前端UI交互旅程
前端·可观测性·观测云·rum
喵本喵叁肆1 小时前
06-M6-部门过滤与综合研判-从问答机到研判助手
前端·javascript·jquery
墨狂之逸才2 小时前
React Native 环境变量方案选型:自定义、react-native-dotenv 与 react-native-config
react native
TomEval2 小时前
【Web UI 自动化】05 - KDT 模式原理与实现
前端·ui·自动化
南雨北斗2 小时前
vue3项目状态持久化方案Pinia
前端
计算机魔术师3 小时前
Uber 工程师不动手,Agent 接管了 70% 的代码 PR
前端