# 没有 Mac 发布 iOS 应用：Expo 和 EAS 指南

> 在 Windows 电脑上，Expo 和 EAS 就能编译 iOS 应用并提交给 Apple。但你仍需要开发者账号和一台 iPhone。

原始页面：[没有 Mac 发布 iOS 应用：Expo 和 EAS 指南](https://devoria.fr/zh-hans/blog/publish-ios-app-without-mac-expo-eas)
作者：[Mehdi Azizi](https://devoria.fr/zh-hans/mehdi-azizi)
发布：2026-09-23
内容最后修订：2026-10-09


## 没有 Mac 能发布 iOS 应用吗？

能。只要你用 Expo 和 React Native 开发，没有 Mac 也能发布 iOS 应用。EAS Build 会在 Expo 托管的云端 Mac 上编译你的应用，然后 EAS Submit 把它提交到 App Store Connect。Expo 的文档写得很清楚：EAS Submit 支持 macOS、Linux 和 Windows，[所以提交 iOS 构建并不需要 Mac](https://docs.expo.dev/submit/ios/)。

不过有三样东西是替代不了的：一个[付费的 Apple Developer 账号](https://devoria.fr/zh-hans/blog/apple-developer-account-price-free-or-99)，一台用来真机测试的 iPhone，以及一个用来在 App Store Connect 里填写应用信息的浏览器。本文接下来会讲清楚：在 Windows 电脑上哪些能做、哪些会卡住，以及各个步骤的顺序。

我所有的 iOS 应用都走这条流程：Expo、EAS Build，然后 EAS Submit。Solys 和 TradaZen 就是这样上架 App Store 的。我自己用 Mac 工作，但发布过程中没有任何一步依赖它：构建在 Expo 的云端完成，提交给 Apple 则通过命令行。

## Expo 和 EAS 如何替代 Mac

要弄清楚哪些事情可行，先得知道为什么以前必须有 Mac。iOS 应用必须用 Apple 的工具 Xcode 编译，而 Xcode 只能在 macOS 上运行，而且版本要足够新，才不会被 ITMS-90725 拒绝。之后还要用与你开发者账号绑定的证书签名，再提交到 App Store Connect。

Expo 把这些工作拆成了三个工具：

- **Expo 和 React Native**：你用 JavaScript 或 TypeScript 写应用，任何电脑都可以。
- **EAS Build**：你在自己的电脑上运行命令，代码会发送到 Expo 的 Mac 上，由它替你编译并签名。你拿到的是一个可以直接安装或提交的文件。
- **[EAS Submit](https://devoria.fr/zh-hans/blog/eas-submit-ios-publish-expo-app-store)**：它把这个构建提交到 App Store Connect。Apple 处理完毕后（比如会检查图标，见 ITMS-90717），构建就会出现在 TestFlight 里。

流程里依然有 Mac，只是不再是你自己的。如果你想知道我为什么向新手推荐这套技术栈，可以看看[用 React Native 和 Expo 开发移动应用](https://devoria.fr/zh-hans/expertise/react-native-expo-mobile-app)这一页。

## 在 Windows 电脑上能做什么

### 编写应用

所有开发工作都能在 Windows 上不受限制地完成：编辑器（VS Code、Cursor）、Node.js、终端。如果你借助 Claude 或 ChatGPT 写代码，也没有任何区别。关于这一点，可以看[用 AI 开发 iOS 应用](https://devoria.fr/zh-hans/blog/build-ios-app-with-ai-pitfalls-checks)。

### 一边写代码一边在 iPhone 上看效果

刚开始时，在 iPhone 上装好 Expo Go，用它扫描终端里显示的二维码，就能加载你的项目。每次修改几秒钟内就会出现在手机上。做最初几个页面时非常合适。从 2026 年 5 月起，[App Store 版的 Expo Go 停留在 SDK 54](https://expo.dev/changelog/expo-go-and-app-store-may-2026)：创建项目时选择与它兼容的版本，或者通过 `eas go` 和 TestFlight 使用更新的 SDK。

Expo Go 有个限制：它只包含 Expo 提供的原生模块。一旦你的应用用到了它不包含的原生库，比如用于订阅的 RevenueCat SDK，你就需要一个开发构建：也就是由 EAS Build 编译的、属于你自己应用的版本，安装到你的 iPhone 上。

### 不经过 App Store 把构建装到 iPhone 上

EAS 提供内部分发功能。你用 `eas device:create` 命令注册 iPhone，然后用 `internal` 分发方式运行构建，就会收到一个安装链接。Apple 对这种方式有限制：[一个账号每年最多只能这样分发给 100 台 iPhone](https://docs.expo.dev/build/internal-distribution/)，而且每增加一台新设备，都需要重新构建或重新签名。只给自己和几个亲友用的话，完全够了。

### 不用 Xcode 管理证书

签名是最容易卡住新手的环节，即使在 Mac 上也一样，提交时还可能遇到 ITMS-90034 错误。用 EAS 的话，你在命令行里登录 Apple 账号，工具[可以自动生成分发证书和描述文件](https://docs.expo.dev/build/setup/)。你完全不用打开钥匙串访问。

### 把应用提交给 Apple 并发布

`eas submit --platform ios` 会把构建提交到 App Store Connect。你也可以用 `eas build` 的 `--auto-submit` 选项把两步串起来。其余一切都在浏览器里完成：App Store 页面、[截图](https://devoria.fr/zh-hans/blog/app-store-screenshot-sizes-2026)、隐私声明、订阅、TestFlight 以及提交审核。App Store Connect 是网页应用，在 Windows 上运行得很好。

## 没有 Mac 做不到（或更难）的事

### 本地 iOS 模拟器

iOS 模拟器是 Xcode 的一部分，所以无法在 Windows 上运行。实际上问题不大：用来测试，你的 iPhone 比模拟器更好。Expo 在 2026 年 9 月发布了云端 iOS 模拟器 [EAS Simulator](https://expo.dev/blog/build-ios-apps-on-windows-with-cloud-simulators)，在我写这篇文章时仍是限量开放。在它全面开放之前，别把工作流程建立在它上面。

### 调试原生代码

如果崩溃来自原生代码（Swift、Objective-C、配置有误的库），Apple 的诊断工具都在 Xcode 里。没有 Mac，你只能依靠 EAS 的构建日志，以及像 Sentry 这样能上报已安装应用崩溃信息的工具。可以做到，但更慢。所以第一个应用最好只用兼容 Expo 且有人维护的库，这样也能避免提交时被 ITMS-90338 拒绝。

### 手写原生扩展

小组件、通知扩展、特定的原生 target：借助配置插件，Expo 也能做到，但没有 Xcode 来检查生成的项目，每个错误都要多花一次构建。第一个应用的话，这些功能留到以后再做。

### 本地编译

EAS 的本地构建（`--local` 选项）[不支持 Windows](https://docs.expo.dev/build-reference/local-builds/)。所以在 PC 上，你的 iOS 构建都要走 Expo 的云端。EAS 的免费套餐每月只包含有限次数的构建，而且要排队：在安排一周高强度工作之前，先去 Expo 的价格页面确认当前条款。

## Apple Developer 账号：必须有，没有例外

没有任何技巧能绕过这一点，就连仅限大型机构内部应用使用的 Apple Developer Enterprise Program 也不行。没有[加入 Apple Developer Program](https://devoria.fr/zh-hans/blog/apple-developer-membership-renewal-cancel)，就没有 App Store Connect，没有 TestFlight，没有内部分发，也[无法提交到 App Store](https://developer.apple.com/support/compare-memberships/)。会员费是[每年 99 美元](https://developer.apple.com/help/account/membership/programs-overview/)，按你所在地区的货币扣款。

注册前的两条建议：

- **认真选择个人账号还是组织账号。** 个人账号在 App Store 上显示的卖家是你的名字。组织账号显示的是你的机构名称，但 Apple 会要求提供 D-U-N-S 编码，审核时间也更长。
- **预留几天时间。** 账号审核不一定是即时的。一确定要发布就去注册，别等到提交前一天。

## 为什么真的需要一台 iPhone 来测试

从技术上说，你可以发布一个自己从没拿在手上用过的 iOS 应用。我强烈不建议这样做，Apple 也不建议：它的[审核指南](https://developer.apple.com/app-store/review/guidelines/)（guideline 2.1）要求应用在提交前已在设备上测试过 bug 和稳定性。而你的用户，手里只有真实的 iPhone。

下面这些只有真机才能让你看到：

- **真正的首次启动**，没有开发服务器：启动时的崩溃就藏在这里。
- **测试环境下的应用内购买**，用来确认付费墙显示的价格正确，订阅确实能解锁应用。
- **通知、相机、震动、权限**，在其他环境里表现不同，或者根本不起作用。
- **真实的布局**：刘海或灵动岛、主屏幕指示条、遮住输入框的键盘。
- **流畅度**，高性能电脑常常会掩盖这个问题。

一台较新的二手 iPhone 就够了，前提是它运行的 iOS 版本受你所用的 Expo SDK 版本支持。如果可以，再借一台尺寸不同的 iPhone：在大屏上没问题的应用，在小屏上可能会被截断。Solys 就是因为这个被拒的，我在[Apple 为什么拒绝你的应用](https://devoria.fr/zh-hans/blog/apple-app-rejection-reasons-real-cases)里讲过。

> 没有 Mac，可以。没有 iPhone，你提交给 Apple 的就是一个你从没见过它运行的应用。

## 在 Windows 上的操作步骤，按顺序来

1. **创建项目**：运行 `npx create-expo-app`，用 Expo Go 测试最初几个页面。
2. **安装 EAS CLI**：运行 `npm install -g eas-cli`，然后执行 `eas login` 和 `eas build:configure`。
3. **加入 Apple Developer Program**：项目一有雏形就去注册。
4. **注册你的 iPhone**：运行 `eas device:create`，然后启动一个开发构建。
5. **在 App Store Connect 里创建应用**，Bundle ID 要和 Expo 配置里的一致。
6. **启动生产构建**：运行 `eas build --platform ios`。
7. **提交构建**：运行 `eas submit --platform ios`，然后在 TestFlight 里测试。[用 TestFlight 测试应用](https://devoria.fr/zh-hans/blog/testflight-guide-test-iphone-app)这篇指南详细讲解了这一步。
8. **在浏览器里填写应用信息并[提交审核](https://devoria.fr/zh-hans/blog/app-store-connect-waiting-for-review-statuses)**。至于推广文本，之后不发新版本也能修改。

这个阶段有三个常见的坑。每次提交时，构建版本号都必须递增：开启 EAS 的自动递增，就不用再操心了。加密相关的问题在你回答之前会卡住每一个构建：你可以在应用配置里一次性声明。还有，Bundle ID 必须处处一致，否则 EAS Submit 找不到你的应用。之后从填写信息到通过审核的每一步，[在 App Store 上发布应用](https://devoria.fr/zh-hans/expertise/publish-an-app-on-the-app-store)这一页都有讲解。

## 发布你的第一个应用，不用 Mac，也不迷路

Mac 已经不是真正的障碍了。真正的障碍在别处：选一个有机会赚钱的应用，接入能正常工作的订阅，准备一份 Apple 会接受的提交材料。这正是 [iOS Kit](https://devoria.fr/zh-hans/kits/ios) 四步流程涵盖的内容，你可以按自己的节奏来。提交材料方面，[Apple Review Kit](https://devoria.fr/zh-hans/kits/review-apple) 收录了我提交前的检查清单和给审核员的备注。首页介绍了如何用 Expo 和 Claude Code [不从零开始开发移动应用](https://devoria.fr/zh-hans)，有没有 Mac 都行。

最终是否让你的应用上架，决定权在 Apple，任何套件都无法保证。我能给你的，是我在自己应用上使用的方法。

## 常见问题

### 没有 Mac 怎么发布 iOS 应用？

用 Expo 和 React Native，由 Expo 托管的 Mac 代替你自己的 Mac。你在任何电脑上写代码，EAS Build 在云端编译并签名应用，然后 EAS Submit 把它提交到 App Store Connect。你还需要一个付费的 Apple Developer 账号、一个用来填写应用信息的浏览器，以及一台用来真机测试的 iPhone。

### 在 Windows 上发布 iOS 应用有哪些步骤？

用 Expo 创建项目，安装 EAS CLI，并加入 Apple Developer Program。注册你的 iPhone，启动开发构建，然后在 App Store Connect 里创建应用，Bundle ID 要和 Expo 配置里的一致。接着启动生产构建，用 EAS Submit 提交，在 TestFlight 里测试，最后在浏览器里填写应用信息并提交审核。

### 在 App Store 发布应用要花多少钱？

加入 Apple Developer Program 每年 99 美元，按你所在地区的货币扣款。这是必须的：没有它，就没有 App Store Connect、TestFlight、内部分发，也无法提交到 App Store。Expo 这边，EAS 的免费套餐每月只包含有限次数的构建，而且要排队：请到 Expo 的价格页面确认当前条款。

### 没有 Mac 发布 iOS 应用，需要 iPhone 吗？

技术上不需要，但我强烈不建议，Apple 也不建议：它的审核指南（guideline 2.1）要求应用在提交前已在设备上测试过 bug 和稳定性。一台较新的二手 iPhone 就够了，前提是它运行的 iOS 版本受你所用的 Expo SDK 版本支持。

### 没有 Mac 怎么测试 iOS 应用？

在 iPhone 上安装 Expo Go：它扫描终端里显示的二维码来加载你的项目，每次修改几秒钟内就能看到。Expo Go 只包含 Expo 提供的原生模块。一旦你的应用用到它不包含的原生库，比如 RevenueCat SDK，就需要一个由 EAS Build 编译的开发构建。要测试最终构建，可以看[用 TestFlight 测试应用](https://devoria.fr/zh-hans/blog/testflight-guide-test-iphone-app)。

### 没有 Mac 开发 iOS 有哪些限制？

你无法在本地使用 iOS 模拟器：它是 Xcode 的一部分，所以无法在 Windows 上运行。EAS 的本地构建（`--local`）不支持 Windows：你的 iOS 构建都要走 Expo 的云端。调试原生代码和手写原生扩展仍然可以做，但更困难，因为 Apple 的工具都在 Xcode 里。


## 你的项目

[iOS Kit](https://devoria.fr/zh-hans/kits/ios)：用 Claude Code 做你的 iPhone App：我自己 App 的起步代码、检查其工作的 skills，以及 Apple Review Kit、App Store Screenshots Kit 和 ASO Kit。129,99 €。
