WWDC Quick Look 💓 By SwiftGGTeam
Automate your development process with the App Store Connect API

Automate your development process with the App Store Connect API

观看原视频

Highlight

App Store Connect 今年新增 Webhook、Build Upload、Feedback 三套 API,把”上传 build → 分发 → 收反馈”循环里的轮询和手工操作全部替换成事件驱动的自动化。

核心内容

App 开发是一个反复迭代的过程:写新功能或修 bug,上传 build 到 App Store Connect,分发给 beta tester,收到反馈,再开始下一轮。Dajinsol Jeon 在开场(01:04)点出问题:这个循环跑得越快越好,比如用户报 crash,应该尽快修复。但以前要做这件事,CI 系统得不停轮询 ASC,问”build 处理完了没”,“有新反馈了没”,要么就只能依赖 Xcode 或 Transporter 手工上传 build,效率低且难以接入自动化流水线。

今年 App Store Connect 把这一整圈打通了。Webhook 让 ASC 主动推送事件,Build Upload API 让任何语言、任何 CI 平台都能上传 build,Feedback API 让 TestFlight 的截图反馈和 crash 反馈直接进开发工具。三件事配合起来,CI 收到 webhook 就能继续下一步,不用再 sleep 30 秒后再调一次 GET。

详细内容

注册 webhook listener。 既可以在 ASC 网站 Users and Access → Integrations → Webhooks 点加号配置,也可以走 API(06:04)。API 注册的好处是当你管很多 app、需要给新 app 自动注册时一次搞定。

POST /v1/webhooks
{
  "data": {
    "type": "webhooks",
    "attributes": {
      "name": "My CI Webhook",
      "url": "https://ci.example.com/asc-hook",
      "secret": "<your-shared-secret>",
      "eventTypes": [
        "buildUploads.stateChanged",
        "buildBetaDetails.stateChanged",
        "betaFeedbackScreenshotSubmissions.created"
      ]
    },
    "relationships": {
      "scope": { "data": { "type": "apps", "id": "<app-id>" } }
    }
  }
}

关键点:

  • url 是你的 webhook listener 地址,ASC 会向它 POST 事件载荷。
  • secret 是你和 ASC 共享的密钥,可以是任意字符串,但只有你和 ASC 知道;它用于 HMAC-SHA256 签名校验。
  • eventTypes 选 5 类事件中的若干个:Build Upload State、Build Beta State、TestFlight Feedback、App Version State、Apple-Hosted Background Asset State(04:07)。
  • 成功返回 201 CREATED,body 里有 webhook ID,后续管理这个 webhook 要用。

上传 build 走四步。 创建 BuildUpload → 创建 BuildUploadFile → 按 upload operations 上传二进制 → PATCH 标记完成(07:42)。

POST /v1/buildUploads
{
  "data": {
    "type": "buildUploads",
    "attributes": {
      "cfBundleVersion": "42",
      "platform": "IOS"
    }
  }
}

关键点:

  • 第一步只声明这个 build 的元数据:bundle version 和目标平台。
  • 返回 201 CREATED,body 里给你一个 BuildUpload 的 ID。
  • 接下来用这个 ID 去创建 BuildUploadFile,告诉 ASC 文件名、字节数、asset type;ASC 就会回一组 upload operations,里面有目标 URL、要用 PUT 方法、要带哪些 header(09:01)。
  • 文件大时 operations 数组可能有多条,意味着你要按 byte range 拆成多个 chunk 分别 PUT,不能假设只有一段。
  • 全部 chunk 上传完后,PATCH 这个 BuildUpload,把 uploaded 设为 true,ASC 才开始处理 build;成功返回 200 OK,state = COMPLETE。

Webhook 校验签名。 ASC 推送过来的请求会带 X-Apple-SIGNATURE header,算法是 HMAC-SHA256(10:51)。

signature = HMAC_SHA256(secret, raw_request_body)
verify   : signature == X-Apple-SIGNATURE

关键点:

  • 用注册时设的 secret 和原始 body 算 HMAC-SHA256。
  • 算出的值和 header 比对,相等才认这个请求来自 Apple。
  • 必须用 raw body,反序列化后再序列化的字符串顺序可能不一致,签名会对不上。

Webhook payload 是最小化的,详情得回调 API 取。 比如新截图反馈到了,payload 里只有 feedback 类型和 instance ID(13:46);拿到 ID 后调 GET /v1/betaFeedbackScreenshotSubmissions/{id},才能拿到设备信息、截图 URL;截图本身要用返回的 URL 单独下载。Crash 反馈同理,多一个 crashLog endpoint 用来下载 crash log(14:32)。

Build beta state 事件特别有用12:12)。以前外部测试需要 Beta App Review,过完 review 没法立刻知道;现在 review 一过 ASC 就推 webhook,CI 可以立即触发后续的 notify testers 流程。

核心启发

  • 做什么:搭一个最小可用的 ASC webhook 网关

    • 为什么值得做:5 种事件覆盖了 build 上传、beta review、版本状态、反馈、Apple-Hosted Asset;接一次,整条流水线就拿到了实时信号源。
    • 怎么开始:起一个 HTTP 服务暴露 /asc-hook,先实现 HMAC-SHA256 校验,验证失败 401;验证通过把 raw payload 落库或丢进队列,立刻返回 200。先不要在请求线程里干重活,避免 ASC 超时重试。
  • 做什么:把 build 上传从 Xcode 搬到 CI

    • 为什么值得做:Build Upload API 是标准 REST,任何语言、任何 CI 都能调;不再依赖 Mac runner 上的 Xcode altool 或 Transporter,错误信息也是结构化的,方便重试。
    • 怎么开始:写一个上传脚本,按四步顺序调 API;遇到 upload operations 数组要遍历,按 byte range 切 ipa 文件分段 PUT;最后 PATCH uploaded=true,然后等 webhook 推 COMPLETE 再继续后续步骤。
  • 做什么:把 TestFlight 反馈灌进自家 issue 系统

    • 为什么值得做:截图反馈和 crash 反馈是用户最直接的声音,但散落在 ASC 后台容易漏;接进 Jira/Linear/GitHub Issues 后,每条反馈都自带设备信息和截图,不会被错过。
    • 怎么开始:监听 betaFeedbackScreenshotSubmissions.created 和 crash 对应事件;收到后用 ID 调 Feedback API 拿详情,下载截图或 crash log,再调你的 issue tracker API 自动建单,自带 reporter、设备、版本等字段。
  • 做什么:做一条”build review 通过即通知”的自动化

    • 为什么值得做:build beta state webhook 是今年新增的事件,外部 tester 的发布延迟主要卡在等审核,能即时感知到 review 完成意味着可以零延迟通知用户。
    • 怎么开始:订阅 buildBetaDetails.stateChanged,payload 里包含 build ID 和最新状态;状态进入可外部测试时,调 TestFlight API 派发到外部 group,再发邮件或 IM 通知 tester。

关联 Session

评论

GitHub Issues · utterances