PAYATHON 2026

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 的标识问题不能通过这种方式解决。

备注:内容仅供参考。