# 用 iPhone 把短信验证码送进 CI 和 QA 自动化

> 把团队 iPhone 上的短信一次性验证码发送到你自己的 Webhook，让 CI 和 QA 运行自行完成登录。各种做法、设置步骤和限制。

最后更新：2026-10-23
规范 HTML 页面：https://www.fwrdsms.com/zh-hans/blog/sms-otp-codes-ci-automation-iphone
Published: 2026-10-17

要把短信一次性验证码送进 CI 或 QA 自动化，就把接收验证码的 SIM 卡放进一部团队 iPhone，让“快捷指令”的“信息”自动化把每条验证码短信交给 Fwrd，由它以 JSON 格式 POST 到你自己的 HTTPS Webhook。然后你的 CI 任务从该端点读取最新的验证码，并输入到登录界面。

**你需要：** 一部运行 iOS 26 或更高版本、装有接收验证码号码 SIM 卡的 iPhone、“快捷指令”App（手机里本来就有）、[Fwrd](https://apps.apple.com/app/apple-store/id6759069713?pt=128544281&ct=zhs-blog-otp-qa&mt=8)，以及一个 CI 能读取的公开 HTTPS 地址，例如预发布环境的路由或 n8n 工作流。Fwrd 会拒绝 IP 地址以及 .local 或 .internal 名称，而且不发送登录请求头，所以请在地址里放一段很长的密钥。

## 为什么短信验证码很难自动化？

短信验证码会卡住 CI，因为它们到达的是手机，而不是你的运行器，除非有东西把每条短信送到你的流水线能读到的地方。

编写这类检查的团队，大多只有自己的手机来接收验证码。装着 Fwrd 的团队 iPhone，能让这部手机变成你的流水线可以读取的东西。

## 什么时候团队 iPhone 合适？

当验证码必须送到某个特定的运营商号码时，它很合适：比如你要登录的第三方服务、已经绑定公司手机号的预发布账户，或按号码类型区别对待的流程。Twilio 的 [Lookup 文档](https://www.twilio.com/docs/lookup/v2-api/line-type-intelligence)（2026 年 10 月 17 日查阅）表明，应用能区分移动号码和非固定 VoIP 号码，后者被描述为在线获得的虚拟号码。团队 iPhone 里的 SIM 卡是真实的运营商号码，所以验证码会像发给客户时一样送到。

取舍在于：一部手机只有一个号码，而且必须保持开机并联网。下面的章节会讲到这两点。

## 如何把 iPhone 上的短信验证码发送到 CI

在 Fwrd 中添加一个只保留验证码的 Webhook 转发目标，再创建一个把每条验证码短信交给 Fwrd 的“信息”自动化。端点这一侧的做法，[Webhook 指南](https://www.fwrdsms.com/zh-hans/guides/webhook)里有完整说明。

1. **在 Fwrd 中添加 Webhook。** 打开 Fwrd，轻点 +，选取 Webhook。把你端点完整的 HTTPS 地址粘贴到“配置”栏，轻点“发送测试信息”，让你的端点看到这些字段，然后轻点 ✓ 保存。

2. **只保留验证码。** 在同一个转发目标里，在“哪些短信”下选取“仅部分短信”，并打开“像验证码”，它会保留含有 4 到 8 位验证码的短信。这只算一个条件，所以免费版也能用。

3. **创建“信息”自动化。** 在 iOS 27 上，打开“快捷指令”，依次轻点“资料库”“自动化”和 +。如果看到“描述快捷指令”，轻点“编辑”。轻点“自动化”，再轻点“信息”，将“发件人”改为“信息”，然后输入 code，或你的服务发来的短信里使用的词。在 iOS 26 上，打开“自动化”标签页，轻点 +，选取“信息”，并在“信息包含”下输入它。

4. **让它不经询问直接运行。** 在 iOS 27 上，轻点触发条件旁边的箭头，确保“运行前确认”已关闭。依次轻点 ⓘ 和“隐私”，确保“锁定时允许运行”已打开。在 iOS 26 上，选取“立即运行”，然后轻点“下一步”和“创建新快捷指令”。

5. **添加 Fwrd 的操作。** 搜索“转发”，添加“转发信息到所有目标”。把它的“信息”设为“输入快捷指令的信息”（在 iOS 26 上，依次选取“输入快捷指令的信息”和“信息”）。轻点返回来保存（iOS 26 上为“完成”）。

6. **在 CI 中读取验证码。** 让你的端点把每个请求体连同到达时间一起保存下来。在你的运行请求验证码之后，轮询此后收到的最新短信，并用正则表达式取出其中的数字。

7. **这就完成了。** 含有验证码的新短信现在会自动到达你的端点，无论 iPhone 是否锁屏。

### 端点会收到什么？

一个 POST 请求，JSON 请求体里是原样的短信文字，同时放在 `content` 和 `text` 中。其中没有时间戳，所以请在你这一侧记录时间。

```json
{
  "content": "Your verification code is 482913",
  "text": "Your verification code is 482913"
}
```

同一条短信的每次尝试都带有相同的 `Idempotency-Key` 请求头，所以你可以丢弃重复项。如果发送超时、遇到 429 或 5xx，或者连接中断，Fwrd 最多会再试两次。15 秒内返回的任何 2xx 响应都算已送达，重定向会被拒绝。在 Fwrd 的“设置”中打开“附上发件人”，并在 Fwrd 的操作上选取“发件人”，请求体里还会多出一个 `sender` 字段，当多个服务向同一个号码发短信时很有用。

## 这个方案做不到什么

- **一个号码一次只能服务一次运行。** 并行的任务在同一个号码上请求验证码，可能读到对方的验证码，所以请让登录步骤排队，或把每个验证码与请求它的那次运行对应起来。
- **免费版每月涵盖 15 条验证码。** 超过之后，验证码要到下个月才会继续转发，繁忙的流水线很快就会用完；Fwrd Pro 可取消限制，在美国售价为每月 $4.99 或每年 $29.99。
- **它只能接收。** Fwrd 无法替你的 CI 从 iPhone 发送短信。
- **手机必须保持开机并联网。** 重新启动后，转发要等有人解锁一次才会继续；连续三天没有解锁的 iPhone 会自行重新启动。请让它保持充电，并放在有人够得着的地方。
- **Fwrd 的操作会发送到每个已启用的转发目标。** 如果同一部手机还要转发到别处，请改用“转发信息到目标”，再选取这个 Webhook。
- **只处理新短信。** 自动化创建之前到达的验证码不会被发送。

如果你要的是给人看的验证码，而不是给流水线用的，[在 Slack 中与团队共享 2FA 验证码](https://www.fwrdsms.com/zh-hans/blog/share-2fa-codes-with-team-slack)介绍了那种设置。

## 关于自动化中的短信验证码的问题

### Selenium 或 Playwright 能直接读取短信验证码吗？

不能。浏览器自动化看不到手机里的信息。必须先有东西把短信从手机上移出来，例如由“快捷指令”自动化加上 Fwrd，把它发送到你的脚本轮询的 Webhook。

### 验证码会经过 Fwrd 的服务器吗？

不会。Fwrd 没有账户，也没有自己的服务器；每条短信从 iPhone 直接发送到你的 HTTPS 端点，地址保存在 iPhone 的钥匙串中。

### 它支持短码发件人吗？

支持。自动化匹配的是短信的内容，而不是发件人，所以来自不在你联系人里的短号码的验证码，也能匹配 code 这样的词。

### 我可以用 n8n 工作流作为端点吗？

可以。添加一个设为 POST 的 Webhook 节点，使用它的 Production URL，并发布工作流，否则它不会应答。[把 iPhone 短信发送到 Zapier、Make 或 n8n](https://www.fwrdsms.com/zh-hans/iphone-sms-to-zapier-make-n8n)里有具体步骤。

## 继续阅读

- [把 iPhone 短信转发到 Webhook](https://www.fwrdsms.com/zh-hans/iphone-sms-to-webhook)
- [iPhone 有短信 API 吗？在 iOS 上获取短信](https://www.fwrdsms.com/zh-hans/blog/iphone-sms-api)
