
Info.plist检查工具上线:上传App Store前预检被拒问题
来源标题:Show HN: Info.plist checker – catch App Store upload rejections before uploading
一款名为Info.plist checker的工具可在上传App Store Connect前检查iOS或Mac应用的Info.plist,列出会导致上传或审核被拒的问题、格式错误及值得注意的事项,每条提示均附苹果规则页面链接。该工具支持XML和二进制plist,能区分项目文件与构建产物,并识别平台、SDK及是否为扩展。开发者称其仅检查单个文件,无法验证图标、bundle ID注册或签名,结果干净不代表一定通过。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
在上传到 App Store Connect 之前检查 iOS 或 Mac 应用的 Info.plist。它能读取 XML 和二进制格式的 plist,区分项目中的 Info.plist 与构建产物中的 Info.plist,并列出上传或 App Review 会拒绝的内容、格式错误的内容,以及值得注意的内容。每条消息都会链接到规则来源的 Apple 页面。
检查器首先判断自己面对的是什么:是构建后的 Info.plist(包含 Xcode 添加的 DT… 系列键),还是项目文件(其中 $(VARIABLES) 是正常的);平台是 iOS 还是 macOS(从文件或 --platform 参数判断);应用是用哪个 SDK 构建的;以及它是否是 app extension(对 extension 会跳过仅适用于 app 的检查)。
错误(上传会被拒绝,或文件格式有误)
警告(提交前需修复或检查)
完整的问题代码列表位于 src/info-plist-checker.mjs 中的 ISSUE_CODES,每条规则对应的 Apple 页面在 SOURCES 以及该文件顶部的注释中。
它只能看到单个文件。它无法判断 bundle 中的图标、storyboard 或 entitlements 是否匹配,无法判断 bundle ID 是否已在你的账号中注册,也无法判断任何与签名相关的问题。检查通过只是其中一步,并不构成保证。
运行一次,无需安装
npx github:peterzhang0216/info-plist-checker path/to/Info.plist
或将其添加到项目中
npm i -D github:peterzhang0216/info-plist-checker npx info-plist-check path/to/Info.plist
文件位置:在构建后的 iOS app 中,它是 YourApp.app/Info.plist;在 Mac app 中,它是 YourApp.app/Contents/Info.plist。对于 .ipa 文件,解压后在 Payload/YourApp.app/Info.plist 中查找。
info-plist-check <Info.plist | -> [--platform ios|mac] [--lang en|zh] [--json]
选项
从 stdin 读取 plist
--platform ios|mac 按指定平台运行检查,而不是使用从文件中读取的平台
--lang en|zh 消息使用英文(默认)或简体中文
--json 输出机器可读的格式
退出码:0 表示没有错误(警告和提示不会导致失败),1 表示至少有一个错误或不是有效的 plist,2 表示用法问题或文件无法读取。
示例输出,针对一个有几处错误的构建后 iOS app(test/fixtures/broken-ios-built.plist):
$ info-plist-check Notebook.app/Info.plist Notebook.app/Info.plist 读取为:构建后的 app,iOS / iPadOS,使用 SDK 27 构建(xml plist) 将被拒绝或格式有误(6)
- [unexpandedVariable] CFBundleShortVersionString 仍包含 $(MARKETING_VERSION)。在构建后的 app 中,Xcode 本应替换这个构建设置变量:请检查该设置在此 target 和 build configuration 中是否有值。 https://developer.apple.com/documentation/bundleresources/managing-your-app-s-information-property-list
- [buildFormat] CFBundleVersion “1.0b3” 只能包含数字和句点,例如 42 或 1.4.2。 https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleversion
- [bundleIdChars] CFBundleIdentifier “com.example.note_book” 只能包含字母(A–Z、a–z)、数字、连字符和句点。 https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleidentifier
- [purposeEmpty] NSCameraUsageDescription 为空。Apple 要求提供用途说明字符串,说明 app 为何需要此访问权限,且该字符串不能为空。 https://developer.apple.com/documentation/uikit/requesting-access-to-protected-resources
- [purposeKeyCase] NSMicrophoneUsagedescription 从未被读取:键名区分大小写。你是指 NSMicrophoneUsageDescription 吗? https://developer.apple.com/documentation/uikit/requesting-access-to-protected-resources
- [noLaunchScreen] 没有启动屏幕。App Store Connect 会拒绝使用 iOS 27 SDK 或更高版本构建、且缺少 UILaunchScreen、UILaunchScreens、UILaunchStoryboardName 或 UILaunchStoryboards 的构建(ITMS-90870)。 https://developer.apple.com/documentation/technotes/tn3208-preparing-your-apps-launch-screen-to-meet-app-store-requirements 提交前需修复或检查(1)
- [badBackgroundMode] UIBackgroundModes 包含 “background-fetch”,该值不在 Apple 的后台模式列表中。 https://developer.apple.com/documentation/bundleresources/information-property-list/uibackgroundmodes 值得注意(1)
- [noEncryptionKey] 没有 ITSAppUsesNonExemptEncryption 键,因此 App Store Connect 会为每次构建询问出口合规问题。如果 app 不使用加密,或仅使用豁免加密(例如通过系统使用 HTTPS),请将其设置为 NO。 https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations 错误:6,警告:1,提示:1 规则来自 Apple 的 Information Property List 文档和 App Store Connect 上传消息,检查日期为 2026-10-31。每条消息都会链接到其背后的 Apple 页面。
使用 --json 时: "file": "Notebook.app/Info.plist
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。