AppStoreInfo.plist 是什么?怎么用、怎么生成(Windows / Linux 也能生成)

AppStoreInfo.plist 是 IPA 的"体检报告",Windows/Linux 上用 iTMSTransporter 上传时必附,否则报错。它与 Info.plist、ExportOptions.plist 的区别;三种生成方式:Xcode 开关、xcrun swinfo(都要 Mac)、appuploader-cli info(Windows/Linux/Mac 通用);以及 -assetDescription 配置、放同目录、用 -assetFile 上传等要点。

一句话:AppStoreInfo.plist 是一份"包的体检报告"——它描述你要上传的这个 IPA 里有什么,苹果收包时靠它核对。用 iTMSTransporter 在 Windows 或 Linux 上传 App 时,必须随包附上这份文件。

它不进你的 App,不影响功能,也不是工程里的配置文件,纯粹是投递环节的一份附件。但很多人第一次碰到它,是被一句报错拦住的。

你多半是这样碰到它的

在 Windows 或 Linux 上用 iTMSTransporter 上传 IPA,命令跑起来直接甩出一句:

Unable to perform software analysis on Linux.
Export an AppStoreInfo.plist from Xcode, and use the -assetDescription option.

翻译过来就是:我在这个系统上没法自己分析你的包,你得从 Xcode 里导出一份 AppStoreInfo.plist 给我。

这句话点破了整件事的关键:

  • macOS 上,Transporter 会调用 Xcode 里的工具当场把这份清单生成出来,你根本感觉不到它存在;
  • Windows / Linux 上没有 Xcode,这一步做不了,所以必须你自己准备好,用 -assetDescription 参数交给它。

Apple 官方的 Transporter 用户指南里也写明了这一点:-assetDescription 这个参数 “required for Linux and Windows App uploads, but not for macOS App uploads”。

于是就出现了那个让人头大的循环:Transporter 明明有 Windows 版,却要求你提供一份只能在 Mac 上生成的文件。 卡在这儿的不止你我——Expo、Unity、Codename One 这些跨平台工具的论坛里,都能翻到"能不能把 AppStoreInfo.plist 也导出来给我们"的帖子。

用之前要知道的两件事

文件内容是工具从包里逐层扫出来的,一个中型 App 通常几万到十几万字节。你不需要读懂它,但有两点会影响你怎么用:

  • 它是"一次性"的。 描述的是某一个具体的包文件。换一个构建、改一行代码重新打包,就得重新生成一份,不能拿上个版本的接着用。所以别在流水线里缓存它,打完包顺手生成最省事。
  • 不要手动编辑。 内容和包是对应的,改了只会让校验对不上。

别和另外两个 plist 搞混

iOS 上架流程里有三个 plist 常被混为一谈,作用完全不同:

文件 是什么 什么时候用
Info.plist App 自身的配置:Bundle ID、版本号、权限用途说明等 写在工程里,会被打进包
ExportOptions.plist 导出选项:用什么方式签名、导出哪种分发类型 打包导出时给 xcodebuild
AppStoreInfo.plist 对导出结果那个包的描述清单 上传投递时给 Transporter 用

顺序上是:Info.plist(写在工程里)→ 用 ExportOptions.plist 导出得到 IPA → 为这个 IPA 生成 AppStoreInfo.plist → 连同 IPA 一起上传。

三种生成方式

方式一:打包时让 Xcode 顺带生成(需要 Mac)

如果你本来就在 Mac 上用 xcodebuild 打包,在 ExportOptions.plist 里加一个开关就行:

1<key>generateAppStoreInformation</key>
2<true/>

它默认是关的。打开之后,导出时会一并生成 AppStoreInfo.plist。

有个坑要注意:生成的文件落在 xcodebuild 的临时输出目录里,不一定跟着 IPA 出现在你指定的产物目录,用 fastlane 的 gym 时尤其容易找不到——它不会帮你把这个文件搬到最终目录。导出完记得去临时目录里翻一下,或者在脚本里显式拷贝出来。

方式二:对已经打好的包生成(需要 Mac)

包已经打完了、忘了开上面那个开关,可以在 Mac 上单独对 IPA 生成:

1xcrun swinfo -f store.ipa -o AppStoreInfo.plist -prettyprint true

这两种方式的共同前提是:你得有一台装了 Xcode 的 Mac。

方式三:在 Windows / Linux / macOS 上生成

前面两种方式都得有 Mac。手上没有 Mac 的话,用开心上架(AppUploader)自带的命令行工具,一条命令也能生成:

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

appuploader-cli 在开心上架的安装目录里,装好主程序就有,Windows、Linux、macOS 三个系统都能用。参数很简单:-u 填你的 Apple ID 邮箱,包的路径直接写在命令末尾,-o 指定输出文件名。

跑完会打印一行结果,带上文件大小和包的 Bundle ID:

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

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

如果下游工具要求二进制格式的 plist,加个 --format binary 即可:

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

除了 .ipa.pkg.zip 也能分析。

生成好了怎么用

交给 iTMSTransporter 的 -assetDescription 参数,和 -assetFile 配套:

1iTMSTransporter -m upload -assetFile App.ipa -assetDescription AppStoreInfo.plist -u dev@example.com -p abcd-efgh-ijkl-mnop

两点提醒:

  • 把 IPA 和 AppStoreInfo.plist 放在同一个目录里。 两个文件分散在不同路径时容易出问题,放一起最省心。
  • 上传 App 不能再用 -f,必须用 -assetFile,这是较新版本 Transporter 的要求,老教程里的写法已经不适用了。

正式传之前可以先跑一次校验,把 -m upload 换成 -m verify,参数不变,能提前发现包本身的问题。

还有一条更短的路

如果你要的只是"把包传上去",其实可以完全跳过这份清单。生成它用的那个 appuploader-cli,本身就能直接上传:

1appuploader-cli upload -f App.ipa -u dev@example.com -p abcd-efgh-ijkl-mnop

不需要 AppStoreInfo.plist,也不用装 Transporter,一条命令传完,失败时退出码非 0,直接能写进构建脚本。

什么情况下仍然要老老实实准备那份清单:公司流程明确要求用 Apple 官方工具,或者你的流水线已经围绕 Transporter 搭好了别的环节。这两种情况下,把生成 plist 这一步接进去就行,其余不用动。

搞清楚这份文件是什么之后,它其实就是流水线里顺手一步的事,别再为它去借 Mac 了。上面用到的命令行工具来自开心上架(AppUploader),它在 Windows 上还能签证书、建 Bundle ID、生成描述文件和直接上传 IPA。