一句话: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 给我。
这句话点破了整件事的关键:
-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 通常几万到十几万字节。你不需要读懂它,但有两点会影响你怎么用:
iOS 上架流程里有三个 plist 常被混为一谈,作用完全不同:
| 文件 | 是什么 | 什么时候用 |
|---|---|---|
| Info.plist | App 自身的配置:Bundle ID、版本号、权限用途说明等 | 写在工程里,会被打进包 |
| ExportOptions.plist | 导出选项:用什么方式签名、导出哪种分发类型 | 打包导出时给
xcodebuild 用 |
| AppStoreInfo.plist | 对导出结果那个包的描述清单 | 上传投递时给 Transporter 用 |
顺序上是:
Info.plist(写在工程里)→ 用
ExportOptions.plist 导出得到 IPA → 为这个 IPA 生成
AppStoreInfo.plist → 连同 IPA 一起上传。
如果你本来就在 Mac 上用
xcodebuild 打包,在
ExportOptions.plist 里加一个开关就行:
1<key>generateAppStoreInformation</key>2<true/>
它默认是关的。打开之后,导出时会一并生成 AppStoreInfo.plist。
有个坑要注意:生成的文件落在
xcodebuild 的临时输出目录里,不一定跟着 IPA 出现在你指定的产物目录,用 fastlane 的 gym 时尤其容易找不到——它不会帮你把这个文件搬到最终目录。导出完记得去临时目录里翻一下,或者在脚本里显式拷贝出来。
包已经打完了、忘了开上面那个开关,可以在 Mac 上单独对 IPA 生成:
1xcrun swinfo -f store.ipa -o AppStoreInfo.plist -prettyprint true
这两种方式的共同前提是: 你得有一台装了 Xcode 的 Mac。
前面两种方式都得有 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
两点提醒:
-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。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047460/viewspace-3180260/ ,如需转载,请注明出处,否则将追究法律责任。