iOS App 上传失败:Square SDK Bundle Identifier 校验错误
结论
Square framework 的 Info.plist 中出现 com.squareup.square-in-app-payments-sdk,不代表开发者需要在 App Store Connect 中注册或拥有这个 Bundle ID。动态 framework 有自己的 Info.plist 和 CFBundleIdentifier 很正常。
这个错误更像是上传服务误把 Square framework 当成了主应用。可能的原因有:
- IPA 目录结构有误,framework 不在主应用的
Frameworks目录中。 - framework 的
CFBundlePackageType、嵌入方式或签名不正确。 - 上传脚本选错了产物,或从 IPA 中读取了错误的应用标识。
- 当前导出的 IPA 与之前成功上传的版本并不一致,例如 CocoaPods、Xcode、构建脚本或导出配置已经改变。
更换 Fastlane、altool 或 Transporter 通常无效,因为这些工具最终上传的还是同一个 IPA。Apple 也没有提供在校验时排除某个 framework Bundle ID 的配置。
检查最终 IPA,不要只看 Pods 目录
Pods 中的源文件结构不能反映最终上传包的实际内容。先解压准备上传的 IPA:
mkdir ipa-check
unzip MyApp.ipa -d ipa-check
find ipa-check/Payload -name Info.plist -print
正常的目录结构类似:
Payload/
└── MyApp.app/
├── Info.plist
├── MyApp
└── Frameworks/
└── SquareInAppPaymentsSDK.framework/
├── Info.plist
└── SquareInAppPaymentsSDK
如果 SquareInAppPaymentsSDK.framework 位于 Payload 根目录或 IPA 根目录,或被包装成了另一个 .app,应先修复打包流程。
然后列出 IPA 中所有 bundle 的标识和类型:
find ipa-check/Payload -name Info.plist -print0 |
while IFS= read -r -d '' plist; do
echo "$plist"
/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "$plist" 2>/dev/null
/usr/libexec/PlistBuddy -c "Print :CFBundlePackageType" "$plist" 2>/dev/null
echo
done
结果应满足以下条件:
MyApp.app使用 App Store Connect 中登记的 Bundle ID,CFBundlePackageType为APPL。SquareInAppPaymentsSDK.framework可以保留com.squareup.square-in-app-payments-sdk,其CFBundlePackageType应为FMWK。- IPA 中没有意外出现的第二个
.app,也没有其他被错误标记为APPL的 bundle。
如果 framework 的 CFBundlePackageType 为 APPL、缺失或目录位置异常,Apple 可能会把它当成应用记录查询,从而触发当前错误。
恢复正确的嵌入和签名设置
不要对所有名称中包含 Square 的 target 设置:
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
config.build_settings['CODE_SIGNING_REQUIRED'] = 'NO'
这段配置只会影响签名,不会删除 framework 的 CFBundleIdentifier,所以无法解决当前错误。动态 framework 最终需要嵌入 App,禁用签名还可能引发新的签名校验问题。
恢复 CocoaPods 的默认设置,并检查主应用 target 的嵌入配置:
- 动态 framework 使用
Embed & Sign。 - 静态 XCFramework 不要重复嵌入。
- 不要在自定义 Copy Files Build Phase 中再次复制 Square framework。
- 不要将整个
.xcframework复制到 App 中,应由构建系统选择当前平台对应的 framework slice。 - 如果依赖由 CocoaPods 管理,不要再手动将同一个 framework 添加到
Frameworks, Libraries, and Embedded Content。
之后在干净的构建环境中重新执行 pod install、Archive 和 Export,不要复用旧的 Archive 或 IPA。
检查签名结果
解压 IPA 后,分别验证主应用和 Square framework:
codesign --verify --strict --verbose=4 \
ipa-check/Payload/MyApp.app/Frameworks/SquareInAppPaymentsSDK.framework
codesign --verify --strict --verbose=4 \
ipa-check/Payload/MyApp.app
再查看实际的签名信息:
codesign -dvvv \
ipa-check/Payload/MyApp.app/Frameworks/SquareInAppPaymentsSDK.framework
codesign -dvvv \
ipa-check/Payload/MyApp.app
framework 应作为应用的一部分完成签名,无需在 App Store Connect 中建立独立的应用记录。
在 Fastlane 中明确指定要上传的应用
如果 IPA 的结构和签名都正常,可以在 Fastlane 中明确指定应用标识,避免客户端根据包内多个 Info.plist 判断目标应用:
upload_to_testflight(
ipa: "./build/MyApp.ipa",
app_identifier: "com.example.myapp",
apple_id: "1234567890",
team_id: "YOUR_TEAM_ID"
)
各参数的含义如下:
app_identifier是主应用的 Bundle ID。apple_id是该应用在 App Store Connect 中的数字 ID。team_id指向拥有该应用记录的团队。
这些配置可以排除 Fastlane 选错应用或团队的情况,但修复不了结构有误的 IPA。配置完成后,还要检查 Fastlane 日志,确认它实际上传的是预期的 MyApp.ipa。
为什么以前可以上传,现在却失败了
单凭错误日志,无法判断 Apple 最近是否修改了 embedded framework 的校验规则。上传工具或服务端校验可能发生了变化,也需要逐项比较成功构建和失败构建:
- Xcode 或 Command Line Tools 是否更新。
- CocoaPods lockfile 中的 Square SDK 版本或二进制内容是否变化。
Podfile.lock、project.pbxproj或 Build Phase 是否变化。- Archive 和 Export 是否来自同一次构建。
- Fastlane 是否仍在上传相同路径下的 IPA。
- IPA 中 Square framework 的位置、
CFBundlePackageType和签名是否变化。
最直接的排查方式,是解压一份曾经成功上传的 IPA,与当前 IPA 进行对比。只比较 Podfile 或业务代码,无法确认最终打包产物是否相同。
是否应该删除或修改 Square 的 Info.plist
不应删除。framework bundle 通常需要 Info.plist,其中可能包含版本、可执行文件名、包类型和最低系统版本等信息。删除后可能导致加载、签名或 App Store 校验失败。
也不建议将 Square 的 CFBundleIdentifier 直接改成自己的标识。修改后需要重新签名,还可能破坏 SDK 的完整性或后续更新流程。只有在 Square 明确确认该字段发布有误,并提供修改方法后,才适合将自动补丁作为临时处理方案。
如果 IPA 结构完全正常
确认以下各项:
- 主应用 Bundle ID 与 App Store Connect 中的记录一致;
- Square framework 位于
MyApp.app/Frameworks; - framework 的
CFBundlePackageType为FMWK; - 主应用和 framework 均通过签名验证;
- 上传工具选择了正确的应用、团队和 IPA;
- Apple 的上传工具仍持续将 Square Bundle ID 当作主应用查询。
如果全部满足,问题就超出了客户端的可配置范围。App Store Connect 没有公开的上传选项可以”忽略此 Bundle ID”或将其”标记为第三方 framework”。此时应保存 IPA、完整上传日志以及所有 bundle 的清单,分别提交给 Apple Developer Support 和 Square,同时提供可复现的最小工程。
不要为 com.squareup.square-in-app-payments-sdk 创建自己的 App ID,也不要尝试申请访问 Square 的 App Store Connect 记录。第三方 framework 的标识问题不能通过这种方式解决。
备注:内容仅供参考。
