Windows / Linux / Mac 上怎么生成 AppStoreInfo.plist:不装 Xcode 也能拿到上架用的资源描述文件

一条命令,任意系统上都能从 IPA 生成 AppStoreInfo.plist:

1appuploader-cli info -u dev@example.com Payload.ipa -o AppStoreInfo.plist

appuploader-cli 是「开心上架(AppUploader)」自带的命令行工具,info 命令只在本地读你的包,把苹果上架流程里那份资源描述文件生成出来,不联网上传任何东西,也不需要 Xcode。

先说清楚这个文件是干什么的

AppStoreInfo.plist 不是你工程里的配置,而是投递构建时用来描述这个包的一份清单。苹果在这份文件开头就写了它的用途:

This App Store Information can be used with iTMSTransporter and App Store Connect Developer API.

也就是说,当你不是从 Xcode 里点「Distribute App」、而是用 iTMSTransporter 之类的方式把包交给苹果时,通常需要随包附上这份描述。

问题在于,正常情况下这份文件由 Xcode 工具链里的工具生成——它只跑在 macOS 上。这就是很多人卡住的地方:包已经在 Windows 上打好签好了,偏偏差这一份清单,为它专门买台 Mac 或者租云 Mac 并不划算。

appuploader-cli info 解决的就是这一步:在 Windows、Linux、macOS 上都能生成,产出的是同一种格式。

装好工具,找到命令

先安装「开心上架」,命令行工具会跟着一起装好,不用另外下载:

系统 位置
Windows 主程序 AppUploader.exe 同目录下的 appuploader-cli.exe
macOS AppUploader.app/Contents/Resources/appuploader-cli
Linux 主程序 AppUploader 同目录下的 appuploader-cli

在这个目录里开终端就能直接用。想在任意目录都能敲,把它加进 PATH

  • Windows:设置 → 系统 → 关于 → 高级系统设置 → 环境变量 → 选中 Path → 编辑 → 新建,粘贴这个目录,之后重开一个终端才生效。
  • macOS / Linux:把 export PATH="$PATH:/你的安装目录" 加进 ~/.zshrc~/.bashrc

验证一下:

1appuploader-cli info --help

生成 AppStoreInfo.plist

最常用的一条:

1appuploader-cli info -u dev@example.com Payload.ipa -o AppStoreInfo.plist
  • -u 填你的 Apple ID 邮箱;
  • 包的路径直接写在命令末尾就行(也可以写成 -f Payload.ipa);
  • -o 指定输出文件,不加 -o 就直接打印到终端,方便接管道。

跑完会打印一行结果,包含生成的文件名、大小和包的 Bundle ID:

asset description written to AppStoreInfo.plist (93613 bytes, xml plist, bundle id com.example.app)

顺手看一眼这个 Bundle ID,能马上确认你传的是不是想要的那个包——CI 里搞混构建产物比想象中常见。

支持的输入不止 IPA,.pkg(macOS 应用)和 .zip 也能分析。

需要二进制格式的话

默认输出是 XML 格式的 plist,可读、方便 diff。有的下游工具要求二进制 plist:

1appuploader-cli info -u dev@example.com Payload.ipa --format binary -o AppStoreInfo.plist

--format 只有 xml(默认)和 binary 两个值。

放进 CI 里用

两个典型用法。

一是上传前自查。 生成这一步会真正把包解开、逐层读一遍,包本身有结构性问题在这里就会失败,比等到上传到一半被苹果打回来快得多:

1appuploader-cli info -u "$APPLE_ID" -f build/App.ipa -o build/AppStoreInfo.plist || exit 1

二是配合别的上传工具。 如果你的流水线已经在用 iTMSTransporter 或者自研的投递脚本,只缺这份描述文件,那 info 正好补上这一环,把生成的 plist 交给下游即可。

还有个 --deterministic 开关,会把 UUID、进程号、时间戳这些每次跑都不一样的字段钉死:

1appuploader-cli info -u "$APPLE_ID" --deterministic -f build/App.ipa -o out.plist

用途很具体:想验证"两次构建产出的包是不是完全一致",加上它之后两份 plist 可以直接逐字节比对,否则光时间戳就永远对不上。日常上架不需要加。

最后提一句:这份 plist 描述的是某一个具体的包,换一个构建就要重新生成,所以别在流水线里缓存它,打完包顺手生成一份最省事。如果你的目的其实只是把包传上去,同一个工具的 upload 命令一条命令就传完了,不需要先生成这份文件。

当初为了这一份几十 KB 的文件差点去租云 Mac,后来发现这条命令就够了。用的是开心上架(AppUploader)自带的命令行工具,它同一套东西还能在 Windows 上签证书、建 Bundle ID、生成描述文件和上传 IPA。