react native expo 开发 ios经验总结

一、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,按交互提示操作:

  1. 选择 iOS 平台 → 选择项目;
  2. 选择「Manage distribution certificates」(分发证书)→ 选择「Create new certificate」;
  3. 选择「Manage provisioning profiles」(描述文件)→ 选择「Create new profile」;
  4. 按提示输入 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」:

  1. 登录 Apple 开发者后台:https://developer.apple.com/;
  2. 进入「Certificates, Identifiers & Profiles」→ 「Certificates」→ 新建「Development Certificate」(开发证书);
  3. 进入「Profiles」→ 新建「Development Profile」(开发描述文件),关联 App ID、开发证书、测试设备 UDID;
  4. Xcode 配置:
    • 打开 Xcode → 顶部菜单「Xcode」→「Settings」(旧版是「Preferences」)→「Accounts」;
    • 登录你的 Apple 开发者账号(需付费开发者账号,免费个人账号无法创建开发 Profile,会报错);
    • 选中账号 → 点击「Manage Certificates」→ 点击左下角「+」→ 选择「iOS Development」,Xcode 会自动关联开发证书和 Profile;
  5. 验证:确保 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.jsonapp.json 配置正确;
  • 确保 app.jsonbundleIdentifier(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.jsoneas.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,否则审核需额外说明)
      }
    }
  }
}

七、补充关键注意事项

  1. Apple 开发者账号:免费个人账号无法创建开发/分发 Profile,必须使用付费账号(99 美元/年);
  2. 权限声明:infoPlist 中权限描述需真实,不能夸大或虚假(如仅用相册却声明相机权限),否则审核拒;
  3. 热更新:Expo Go 模式支持热更新,原生模式需通过 npx expo start --dev-client 实现热更新;
  4. 依赖兼容:引入原生库时,需确认其支持 Expo/EAS 构建,避免依赖不兼容导致打包失败;
  5. 测试Flight 审核:TestFlight 审核比 App Store 宽松,但仍需遵守 Apple 审核规则(如无违规内容、权限声明合理)。

总结

  1. Expo 开发 iOS 分「Expo Go 快速开发」(无原生依赖)和「模拟器/真机开发」(有原生依赖)两个阶段,需根据需求切换;
  2. EAS 环境配置的核心是证书/Profile,开发调试需手动配置开发证书,打包发布可通过 EAS 自动创建分发证书;
  3. 版本号需区分「对外版本号」和「对内构建号」,EAS 会自动递增构建号;
  4. eas.json 管理打包环境,app.json 需重点配置 iOS 权限(infoPlist),否则审核失败;
  5. 本地打包仅支持 Mac 系统,推荐优先使用 EAS 云打包,降低环境配置成本。
相关推荐
lbb 小魔仙1 小时前
【HarmonyOS】React Native实战项目+智能文本省略Hook开发
react native·华为·harmonyos
星空22231 小时前
【HarmonyOS 】平台day26: React Native 实践:Overlay 遮罩层组件开发指南
react native·华为·harmonyos
lbb 小魔仙1 小时前
【HarmonyOS】React Native实战项目+Redux Toolkit状态管理
react native·华为·harmonyos
YJlio10 小时前
1.7 通过 Sysinternals Live 在线运行工具:不下载也能用的“云端工具箱”
c语言·网络·python·数码相机·ios·django·iphone
胖鱼罐头16 小时前
RNGH:指令式 vs JSX 形式深度对比
前端·react native
BD16 小时前
Umi 项目核心库升级踩坑(Umi 3→4、React 16→18、Antd 3→4、涉及 Qiankun、MicroApp 微前端)
前端·react.js
Oscarzhang18 小时前
React 核心原理完全解析:从组件化、虚拟DOM到声明式编程
react.js
光影少年18 小时前
react中的filble架构和diffes算法如何实现的
前端·react.js·掘金·金石计划
lbb 小魔仙19 小时前
【HarmonyOS】React Native实战+Popover内容自适应
react native·华为·harmonyos