一、React Native Expo 基础介绍
React Native (RN) 是 Facebook 推出的跨平台移动开发框架,通过 JavaScript/TypeScript 编写代码,最终生成接近原生体验的 iOS/Android 应用;Expo 是基于 RN 的上层开发工具链,它封装了复杂的原生配置、构建流程,提供了一套开箱即用的 API(如相机、定位、推送等),让开发者无需接触原生代码(Objective-C/Swift/Java/Kotlin)就能快速开发 RN 应用,大幅降低了 RN 的入门门槛和开发成本。
核心优势:
- 无需配置原生开发环境(如 Xcode/Android Studio 复杂配置),通过 Expo Go 即可快速预览;
- 内置大量常用原生能力的封装,无需自己开发原生模块;
- 提供 EAS (Expo Application Services) 云构建服务,无需本地打包即可生成 iOS/Android 安装包。
二、iOS 开发模式分析
1. 前期:Web/Expo Go 快速开发(无原生依赖场景)
- 核心特点:无需配置原生环境,开发效率最高;
- 使用方式 :
- 安装 Expo Go App(iOS 应用商店可下载);
- 本地启动项目:
npx expo start,生成二维码; - 用 Expo Go 扫描二维码,即可实时预览、热更新代码(修改代码后无需重启,秒级刷新);
- 也可通过
npx expo start --web在浏览器中预览(仅适配基础 UI,部分原生 API 不可用);
- 适用场景:原型开发、纯 JS/TS 逻辑开发、无自定义原生模块的场景;
- 局限性:无法使用未被 Expo 封装的原生库,无法调用自定义原生代码。
2. 后期:模拟器/真机开发(需原生依赖场景)
- 核心特点:当项目需要引入 Expo 未封装的原生库(如第三方 SDK),或自定义原生模块时,Expo Go 不再适用,需切换到「原生开发模式」;
- 使用方式 :
- 需本地安装 Xcode(iOS 原生开发工具),配置 macOS 开发环境;
- 每次新增/修改原生依赖(如
npm install 某原生库),需重新生成原生工程文件并打包,无法再用 Expo Go 热更新; - 可通过模拟器(Xcode 内置 iOS Simulator)或真机调试;
- 核心优势:支持所有原生库和自定义原生代码,满足复杂业务需求;
- 局限性:开发流程变复杂,新增原生依赖后需重新打包,调试周期变长。
三、EAS 环境配置(打包前提)
EAS 是 Expo 提供的构建/发布服务,无论本地打包还是云打包 iOS 应用,都需先配置 EAS 环境:
1. 基础准备
- 注册/登录 Expo 账号:https://expo.dev/(建议和 Apple 开发者账号关联);
- 安装全局 EAS 命令:
npm install -g eas-cli; - 本地项目初始化 EAS:
eas init(关联 Expo 账号和项目,生成eas.json配置文件)。
2. iOS 证书/Profile 配置(核心关键)
iOS 应用打包/安装到真机必须依赖 Apple 开发者证书和 Provisioning Profile(描述文件),EAS 可简化这一流程,但需提前准备:
(1)前置条件:获取测试设备 UDID
- UDID 是 iOS 设备的唯一标识,添加到 Apple 开发者后台后,设备才能安装调试包;
- 获取方式:
- 连接设备到 Mac,打开 Xcode → Window → Devices and Simulators → 选中设备,即可看到 UDID;
- 或通过第三方工具(如 https://get.udid.io/)获取。
(2)EAS 自动创建证书/Profile
执行命令:eas credentials,按交互提示操作:
- 选择 iOS 平台 → 选择项目;
- 选择「Manage distribution certificates」(分发证书)→ 选择「Create new certificate」;
- 选择「Manage provisioning profiles」(描述文件)→ 选择「Create new profile」;
- 按提示输入 Apple 开发者账号密码,EAS 会自动在 Apple 开发者后台创建:
- 分发证书(Distribution Certificate);
- 两种 Profile:
- App Store Profile:用于发布到 App Store/TestFlight;
- Ad Hoc Profile:用于内部真机安装(无需上架,仅限添加了 UDID 的设备)。
Ad Hoc Profile 可以忽略,我们使用testfilght 测试就行
(3)开发证书/Profile 手动配置(调试真机用,开发者用)
EAS 自动创建的是「分发证书/Profile」,若需通过 npx expo run ios --device 直接安装到真机调试,需手动配置「开发证书/Profile」:
- 登录 Apple 开发者后台:https://developer.apple.com/;
- 进入「Certificates, Identifiers & Profiles」→ 「Certificates」→ 新建「Development Certificate」(开发证书);
- 进入「Profiles」→ 新建「Development Profile」(开发描述文件),关联 App ID、开发证书、测试设备 UDID;
- Xcode 配置:
- 打开 Xcode → 顶部菜单「Xcode」→「Settings」(旧版是「Preferences」)→「Accounts」;
- 登录你的 Apple 开发者账号(需付费开发者账号,免费个人账号无法创建开发 Profile,会报错);
- 选中账号 → 点击「Manage Certificates」→ 点击左下角「+」→ 选择「iOS Development」,Xcode 会自动关联开发证书和 Profile;
- 验证:确保 Apple 开发者账号角色是「Admin/Developer」(仅「App Manager」等角色可能权限不足)。



(4)真机调试命令
连接 iOS 设备到 Mac(开启 USB 调试),执行:
bash
npx expo run ios --device
命令执行后会列出当前 USB 连接的 iOS 设备,选择对应设备编号,即可自动编译、安装开发版应用到真机(无需手动打包 IPA)。

四、EAS 打包 iOS 常用命令 & 前提条件
1. 打包前提条件
- 已完成 EAS 环境配置(
eas init成功); - 已配置好 Apple 开发者证书/Profile(EAS 自动创建或手动配置);
- 项目根目录的
eas.json、app.json配置正确; - 确保
app.json中bundleIdentifier(iOS 包名)与 Apple 开发者后台的 App ID 一致。
2. 常用打包命令
(1)云打包(推荐,无需本地 Xcode 复杂配置)
bash
# 打包 TestFlight 测试包(默认使用 eas.json 中 production 配置)
eas build --platform ios
# 打包 Ad Hoc 内部测试包(需指定配置)
eas build --platform ios --profile ad-hoc
# 本地调试用的开发包
eas build --platform ios --profile development
# 打包并发布testfilght
npx testflight
(2)本地打包(需本地安装 Xcode,适合自定义原生配置)
bash
# 本地生成 IPA 包
eas build --platform ios --local
本地打包额外前提:
- Mac 系统(Windows/Linux 无法本地打包 iOS 应用);
- Xcode 已安装并配置好 Command Line Tools(Xcode → Settings → Locations → Command Line Tools 选择对应版本);
- 已安装 CocoaPods(iOS 依赖管理工具):
sudo gem install cocoapods。
3. 打包产物 & 上传 TestFlight
- 打包完成后,会得到
.ipa格式的 iOS 安装包; - 上传 TestFlight:使用 Apple 官方工具「Transporter」(Mac App Store 可下载),打开 Transporter → 拖拽 IPA 包到应用内 → 登录 Apple 开发者账号 → 点击「Deliver」即可上传;
- 上传成功后,Apple 审核(TestFlight 审核通常 1-3 分钟),审核通过后,测试人员可在 TestFlight 中安装测试包(需提前添加测试人员的 Apple ID 到开发者后台的「TestFlight 测试群组」)。
五、iOS 版本号说明
iOS 应用有两个核心版本号,Expo/EAS 会自动管理,需理解其区别:
- 版本号(Version) :如
1.0.16,对外展示的版本号,与 App Store 发布绑定,每次上架新版本需高于上一次(如从 1.0.16 → 1.0.17); - 构建号(Build Number) :如
5(括号内的数字),对内的构建标识,每次打包需唯一(即使版本号不变,构建号也需递增); - Expo 配置:在
app.json中配置version(版本号),EAS 打包时会自动递增buildNumber(也可手动在app.json或eas.json中指定)。
示例配置(app.json):
json
{
"expo": {
"version": "1.0.16", // 版本号
"ios": {
"buildNumber": "5" // 构建号(EAS 打包会自动 +1)可以不写用默认就行
}
}
}
六、核心配置文件说明
1. eas.json(打包配置文件)
核心作用:定义不同打包环境(开发/测试/生产)的配置,如环境变量、打包类型、证书、版本号规则等。
示例(常用配置):
json
{
"cli": {
"version": ">= 7.0.0" // 要求 EAS CLI 最低版本
},
"build": {
"development": { // 开发环境(本地真机调试)
"developmentClient": true, // 生成开发版客户端
"ios": {
"simulator": true, // 支持模拟器运行
"buildNumber": { "autoIncrement": true } // 自动递增构建号
},
"env": { // 开发环境变量
"API_URL": "https://dev-api.example.com"
}
},
"preview": { // 测试环境(Ad Hoc 包)
"distribution": "ad-hoc", // 内部分发类型
"ios": {
"enterpriseProvisioning": "adhoc"
},
"env": {
"API_URL": "https://test-api.example.com"
}
},
"production": { // 生产环境(App Store/TestFlight)
"distribution": "store", // 商店分发类型
"ios": {
"buildNumber": { "autoIncrement": true }
},
"env": {
"API_URL": "https://api.example.com"
}
}
},
"submit": { // 自动上传到 App Store/TestFlight 配置
"production": {
"ios": {
"appleId": "your-apple-id@example.com",
"ascAppId": "1234567890", // App Store Connect 中的 App ID
"teamId": "ABCDE12345" // Apple 开发者团队 ID
}
}
}
}
2. app.json(应用基础配置文件)
核心作用:定义应用名称、包名、权限、iOS/Android 原生配置等,其中 iOS 端需重点关注 infoPlist(对应 iOS 原生的 Info.plist 文件),所有用到的系统权限必须声明,否则 App Store 审核会被拒 。
示例(iOS 核心配置):
json
{
"expo": {
"name": "你的应用名称",
"slug": "app-slug",
"bundleIdentifier": "com.yourapp.name", // iOS 包名(需与 Apple 开发者后台的 App ID 一致)
"version": "1.0.16",
"ios": {
"buildNumber": "5",
"supportsTablet": true, // 是否支持平板
"infoPlist": { // 必须声明所有用到的系统权限
"NSCameraUsageDescription": "需要访问相机以拍摄照片", // 相机权限
"NSPhotoLibraryUsageDescription": "需要访问相册以选择照片", // 相册权限
"NSLocationWhenInUseUsageDescription": "需要访问位置以提供定位服务", // 定位权限
"NSNotificationsUsageDescription": "需要推送通知以接收消息提醒" // 推送权限
},
"config": {
"usesNonExemptEncryption": false // 加密声明(无加密需设为 false,否则审核需额外说明)
}
}
}
}
七、补充关键注意事项
- Apple 开发者账号:免费个人账号无法创建开发/分发 Profile,必须使用付费账号(99 美元/年);
- 权限声明:
infoPlist中权限描述需真实,不能夸大或虚假(如仅用相册却声明相机权限),否则审核拒; - 热更新:Expo Go 模式支持热更新,原生模式需通过
npx expo start --dev-client实现热更新; - 依赖兼容:引入原生库时,需确认其支持 Expo/EAS 构建,避免依赖不兼容导致打包失败;
- 测试Flight 审核:TestFlight 审核比 App Store 宽松,但仍需遵守 Apple 审核规则(如无违规内容、权限声明合理)。
总结
- Expo 开发 iOS 分「Expo Go 快速开发」(无原生依赖)和「模拟器/真机开发」(有原生依赖)两个阶段,需根据需求切换;
- EAS 环境配置的核心是证书/Profile,开发调试需手动配置开发证书,打包发布可通过 EAS 自动创建分发证书;
- 版本号需区分「对外版本号」和「对内构建号」,EAS 会自动递增构建号;
eas.json管理打包环境,app.json需重点配置 iOS 权限(infoPlist),否则审核失败;- 本地打包仅支持 Mac 系统,推荐优先使用 EAS 云打包,降低环境配置成本。