You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SPM静态库提交iOS应用至iTunes Connect失败求解决方案

解决SPM引入静态XCFramework后App Store提交失败的问题

我来帮你搞定这个问题——你碰到的两个错误本质是同一个根源:SPM错误地把静态库的.a文件打包到了Frameworks目录里,而App Store不允许独立的静态库文件出现在这个位置(静态库的代码应该被合并到主App二进制中,而非作为独立文件存在)。下面是几个可行的解决方案,按优先级排序:

1. 修正Package.swift的配置

先确保你的Hello库的Package.swift正确标记了静态库的类型和链接逻辑。调整内容如下:

let package = Package(
    name: "Hello",
    products: [
        // 明确声明为静态库类型
        .library(
            name: "Hello",
            type: .static,
            targets: ["Hello"]
        ),
    ],
    targets: [
        .binaryTarget(
            name: "Hello",
            path: "./Hello.xcframework"
        )
    ]
)

这里的核心是在products里显式指定.static类型,让SPM明确知道这是一个需要链接而非嵌入的静态库,避免后续打包时的错误处理。

2. 调整Xcode项目的嵌入设置

在你的主App项目中:

  • 打开General标签页,找到Frameworks, Libraries, and Embedded Content区域
  • 找到SPM引入的Hello库,把它的Embed选项改为Do Not Embed

静态库不需要被嵌入到App包中,因为它的代码会在编译阶段直接合并到主App的二进制文件里。这个设置能直接阻止Xcode把.a文件复制到Frameworks目录。

3. 添加Post-Build脚本作为兜底方案

如果上面的方法还是没解决(可能是Xcode 12的小bug),可以添加一个Run Script Phase自动清理多余的.a文件:

  1. 在主App的Target中,切换到Build Phases标签页
  2. 点击+按钮,选择New Run Script Phase
  3. 在脚本区域输入:
# 移除Frameworks目录下的静态库文件
if [ -f "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libHello.a" ]; then
    rm -rf "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libHello.a"
fi
  1. 把这个Run Script Phase移到Embed Frameworks phase之后,确保它在归档前执行。

这个脚本会自动清理掉错误出现在Frameworks目录的.a文件,保证提交时符合App Store的要求。

为什么之前的操作无效?

你手动拖入XCFramework能正常提交,是因为手动添加时可以直接设置Do Not Embed;而SPM默认可能没正确识别静态库的类型,导致Xcode错误地把它当作需要嵌入的动态库处理。通过上面的配置,就能让SPM和静态库正确配合,完全符合Xcode 12+和Swift 5.3的支持规范。

内容的提问来源于stack exchange,提问作者Shams Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:42:34