返回博客

2026年App Store Connect API指南:密钥类型、ES256令牌与速率限制逐步实操

2026年App Store Connect API指南:密钥类型、ES256令牌与速率限制逐步实操

App Store Connect API 是 App Store Connect 网页界面背后的 REST 层:Apple 自己的描述是它「可自动化你在 App Store Connect 中所做的操作」,并明确警告通过它改动的就是生产数据。这一句话就是本文存在的理由——一把可用的密钥加一个合法令牌,就足以邀请团队成员、改动 bundle ID、上传构建、修改商店元数据、下载销售报表,全程无需浏览器。本篇 2026 年指南覆盖:只有账户持有人才能提交的一次性开通申请、团队密钥与个人密钥的区别、为每次调用授权的 ES256 JWT、滚动一小时速率限制与 HTTP 429、错误判读、分页、资源上传,以及密钥吊销。

一句话版本:账户持有人一次性申请 API 访问;管理员生成按角色授权的团队密钥(或每位用户各自生成唯一的个人密钥);你的代码用 ES256 签一个短时效 JWT,kid 取密钥 ID、aud 取 appstoreconnect-v1;每个响应都带 X-Rate-Limit 头,一旦越限就返回 429 RATE_LIMIT_EXCEEDED。

第 1 步 — 先搞清楚这套 API 能碰到什么

申请之前先画清你要自动化的范围,因为密钥的角色决定了可达边界。Apple 文档列出的资源覆盖:内购与自动续订订阅、TestFlight 测试构建/测试员/分组、Xcode Cloud 数据与工作流、用户与访问权限、证书配置(bundle ID、能力、证书、设备、描述文件)、App 元数据与提审、App Clip 体验、报表(销售与财务报告)、性能与功耗指标,以及用户评价与回复。两个结构性事实必须记住:资源返回的是结构一致的 JSON,并带关系链接用于在资源间跳转;如果你所在账号属于 Apple Developer Enterprise Program,Apple 指向的是 Enterprise Program API 而非这一套。别在建完集成后才发现用错了 API。

第 2 步 — 这份开通申请只有账户持有人能提

API 访问默认不开,而且它不是「按密钥」的开关。账户持有人登录后进入 用户与访问 > 集成(该页默认就选中 App Store Connect API),点 申请访问,勾选同意条款并提交。Apple 随后逐案审核批准——所以正确顺序是在你向任何人承诺自动化上线日期之前就提交,而不是发布当天才想起来。批准之后,同一个页面里就有签发者 ID(issuer ID)和密钥列表。

第 3 步 — 团队密钥还是个人密钥,选对

Apple 定义了两种密钥,二者不可互换:

由此得出两条运维规则。密钥的名称与访问级别生成后不可修改——要改就吊销重签。私钥文件只能下载一次:流水线丢了它,唯一的补救是新建密钥,不是重新下载。把 .p8 放进服务端密钥库,并且像对待数据库口令一样对待它。

第 4 步 — 造出 Apple 真正接受的 ES256 令牌

每个请求都需要一个用你下载的私钥签名的 JWT。Apple 的令牌文档固定了头字段:alg 必须是 ES256,kid 是你的私钥 ID(例如 2X9R4HXF34),typ 为 JWT。团队密钥的载荷携带 iss(签发者 ID,例如 57246542-96fe-1a63-e053-0824d011072a)、UNIX 时间戳格式的 iat 与 exp,以及固定为 appstoreconnect-v1 的 aud。真正会在生产里咬人的是过期规则:过期时间超过未来 20 分钟的令牌无效,Apple 另有豁免清单列举例外。所以要签短时效令牌、在窗口内复用、绝不把令牌缓存过期。如果你有多把团队密钥,kid 必须与签名用的私钥配对——配错是认证失败,不是授权不足。

个人密钥的载荷略有不同:没有 iss,改用值为 user 的 sub 声明。若你为两种密钥共用一套令牌构造代码,请把这个差异写死在代码分支里,而不要在运行时靠猜。

第 5 步 — 给令牌限权,而不是指望它永不泄露

Apple 支持可选的 scope 声明:一份列出该令牌被允许发起的请求清单,每一项由 HTTP 方法加 URL 路径加可选查询串组成——例如 GET /v1/apps/123 或 GET /v1/apps?filter[platform]=IOS。若令牌携带的 scope 覆盖不到该请求,请求会被拒绝。Apple 给出的理由是值得回敬给「限权是多余开销」论的一句话:如果你无意间把令牌分享给了未授权方,受限的 scope 会削减对方能用它做成的事。只读销售报表的自动化,就该带只读 scope,而不是继承密钥角色的全部权力。

第 6 步 — 尊重滚动一小时,并把 429 当状态而非错误

这套 API 的速率限制是按密钥计的,且没有公布为某个固定数字。每个响应都带 X-Rate-Limit 头,其中 user-hour-lim 是该密钥每小时的请求上限,user-hour-rem 是剩余量;Apple 自己的示例显示上限 3500 次/小时、剩余 500 次,并说明实际限额会变动。窗口是滚动一小时:任何时刻的剩余量,都等于上限减去过去 60 分钟你已发出的全部请求。越限即返回 HTTP 429 与 RATE_LIMIT_EXCEEDED。两个设计结论:先读 user-hour-rem,剩余偏低时提前降速;把 429 当作「记日志、把任务重新入队稍后处理」,而不是致命错误——一个遇到 429 就大声失败的夜间导出任务,会在每个贴近天花板的夜晚都失败。

第 7 步 — 先读状态码,再读错误对象

按 Apple 的错误处理说明:200 段表示成功,响应体里就是数据;400 段或 500 段表示请求失败,响应体里是细节。错误对象还带可用于程序化处理的 code,很多情况下还带 source 精确指出请求里的问题位置——指向载荷内的 JSON 指针,或引发错误的那条查询参数。改请求之前先读 source: 「这段 JSON 在该路径上格式不对」和「你的角色无权做这件事」之间,差的是五分钟修复和一张支持工单。

第 8 步 — 大结果集要翻页,别靠猜一个更大的 limit

集合类响应会带分页信息与相关链接——一个分页对象,加上把你带到下一页的响应链接。请写出跟随这些链接直到游标耗尽的循环;不要假设一次调用就能返回全部构建、测试员或商店版本,也不要硬编码一个你主观认为「够大」的页大小。静默截断的报表比跑得慢的报表危险得多。

第 9 步 — 资源上传必须按 Apple 规定的顺序

二进制资源——截图、App 预览、审核附件、导航类 App 覆盖文件——遵循四步流程:先做资源预留(资产类型、文件名、字节数),再用预留响应里返回的 operations 上传字节,然后提交(commit),最后核实 App Store Connect 已成功处理该资源。预留成功会返回预留 ID、一组上传 operations、文件属性,以及交付状态 AWAITING_UPLOAD。大文件会返回多个 operations,逐个告诉你每段(分片)的偏移与长度——API 故意拆片,就是为了让不稳定的网络不会让你丢掉整个文件。另外注意:App 截图、App 预览与 App 内活动截图这几类资源已废弃,截图与预览请改用 App Asset Library 与 placements 管理。还有一点,别把预留扔在半路:Apple 明确说明预留之后完成上传的时间有限。

第 10 步 — 把密钥当凭证来轮换与吊销

账户持有人或管理员可以吊销团队密钥以及任一成员的个人密钥;用户也可吊销自己的。吊销立即生效且不可恢复——被吊销的密钥无法重新启用——所以吊销是应急动作的正确选择,不是最后手段。被吊销的密钥会在 API 密钥页面的 Revoked 分区保留 30 天,这够你在事故后回答「那把是哪个密钥」,但不足以充当审计流水,因此请把密钥 ID 与自动化运行记录一起落日志。最后,如果某个人根本不该拿到 API 访问权限,管理员可以在人员页取消该用户的 Generate Individual API Keys 权限——这个控制项是存在的,用它,而不是依赖口头规定。

核对清单

Apple 为这套 API 维护发布说明变更记录。字段与资源会陆续新增,所以在把集成视为完成之前,重新读一遍。

Sources

规模化运营开发者账号?运营侧交给我们。

点击选择文件 · 右键「粘贴」或按 Ctrl/⌘+V 直接粘贴截图

也可以直接拖拽文件到此处。

我们会回复你填写的邮箱,信息仅用于本次咨询。

✔ 已提交

我们已收到你的信息,会在 24 小时内回复。

也可发邮件给 expert@kapps.store
← 返回修改