使用 SPM 包时无法将 iOS 应用程序提交到 iTunes 连接

Can't submit iOS app to iTunes connect when using a SPM package

当我尝试提交包含使用 new binary target 的 SPM 包的 iOS 应用程序时,提交失败并出现以下两个错误:

Invalid Swift Support. The file MyApp.app/Frameworks/libHello.a doesn’t have the correct file type for this location. Ensure you’re using the correct file, rebuild your app using the current public (GM) version of Xcode, and resubmit it.

Invalid Bundle Structure - The binary file 'MyApp.app/Frameworks/libHello.a' is not permitted. Your app can’t contain standalone executables or libraries, other than a valid CFBundleExecutable of supported bundles. Refer to the Bundle Programming Guide at https://developer.apple.com/go/?id=bundle-structure for information on the iOS app bundle structure.

我觉得是SPM的问题,我手动把Hello.xcframework包拖到项目里就可以成功提交了。

尝试做其他事情,例如更改 Xcode 构建设置、自定义 package.swift 和使用 lipo 来确保架构切片有效,无论如何都不会导致。

我在构建阶段查看了嵌入框架,它不仅包含在 link 框架阶段。我注意到的一件事是,当我存档应用程序时,静态库 libHello.a 位于应用程序的框架文件夹中,这很奇怪,因为它不应该存在,因为它们与应用程序二进制文件集成在一起。当我删除该文件时,我可以继续提交应用程序而不会出现任何问题。但我不认为这种解决方法是长期的理想选择。

我创建了一个简单的静态库,其中包含一个 class 和保持简单的方法。然后,我使用 Xcode 使用 xcodebuild -create-xcframework 将生成的静态库归档到 XCFramework 中。参见 Github Repo: https://github.com/shams-ahmed/Hello

重现步骤:

我需要做什么才能让 SPM 使用静态库?现在这意味着 Xcode 12 和 Swift 5.3

支持

信息:

看起来静态库(.a 文件)是不可能的,因为带有 xcframework 的 .binaryTarget 与动态框架相关联,XCode只需将依赖于平台的实体从 xcframework 复制到您的 . app 而不是 linking 到您的应用程序的二进制文件。

XCode 构建日志:

PBXCp .../Hello.xcframework/ios-x86_64-simulator/libHello.a .../Test.app/Frameworks/libHello.a 

有两种解决方案:

  1. 将库源代码编译为动态框架并从中创建 xcframework。
  2. 如果您只有 .a 文件,您可以制作动态框架包装器,其中 link 静态库并提供 API 对它们的访问,然后制作 xcframework。