使用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文件:
- 在主App的Target中,切换到
Build Phases标签页 - 点击
+按钮,选择New Run Script Phase - 在脚本区域输入:
# 移除Frameworks目录下的静态库文件 if [ -f "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libHello.a" ]; then rm -rf "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libHello.a" fi
- 把这个Run Script Phase移到
Embed Frameworksphase之后,确保它在归档前执行。
这个脚本会自动清理掉错误出现在Frameworks目录的.a文件,保证提交时符合App Store的要求。
为什么之前的操作无效?
你手动拖入XCFramework能正常提交,是因为手动添加时可以直接设置Do Not Embed;而SPM默认可能没正确识别静态库的类型,导致Xcode错误地把它当作需要嵌入的动态库处理。通过上面的配置,就能让SPM和静态库正确配合,完全符合Xcode 12+和Swift 5.3的支持规范。
内容的提问来源于stack exchange,提问作者Shams Ahmed
相关产品推荐
相关产品推荐

