Cocoa Touch Framework Bitcode支持:项目归档失败求助
解决Cocoa Touch Framework通过CocoaPods分发时的归档失败问题
我经手过不少这类归档失败的案例,大概率是你构建fat framework的脚本逻辑和Xcode归档的规则冲突了,毕竟App Store不允许归档包包含模拟器架构。下面是一步步的排查和解决方法:
1. 修正Run Script的执行逻辑
你的脚本现在每次构建都生成包含模拟器+真机架构的fat framework,但归档阶段Xcode会严格校验架构——模拟器架构(x86_64/i386)是不被允许的。我们需要让脚本区分普通构建和归档构建:
修改你的Run Script,加入环境变量判断:
# 判断是否处于归档模式 if [ "${CONFIGURATION}" = "Release" ] && [ "${ARCHIVE}" = "YES" ]; then # 归档阶段:只保留真机架构,跳过lipo合并 echo "正在归档:仅编译真机架构" else # 普通开发构建:合并模拟器和真机架构(保留你原来的lipo逻辑) DEVICE_FRAMEWORK="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PRODUCT_NAME}.framework" SIMULATOR_FRAMEWORK="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PRODUCT_NAME}.framework" UNIVERSAL_OUTPUT_DIR="${BUILD_DIR}/${CONFIGURATION}-universal" mkdir -p "${UNIVERSAL_OUTPUT_DIR}" cp -R "${DEVICE_FRAMEWORK}" "${UNIVERSAL_OUTPUT_DIR}/" lipo -create "${DEVICE_FRAMEWORK}/${PRODUCT_NAME}" "${SIMULATOR_FRAMEWORK}/${PRODUCT_NAME}" -output "${UNIVERSAL_OUTPUT_DIR}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}" fi
同时记得调整脚本的执行顺序:在Compile Sources之后,Copy Bundle Resources之前,避免资源复制冲突。
2. 调整Podspec的配置细节
如果你的podspec直接指向了fat framework,归档时CocoaPods可能会把多余的模拟器架构打包进去。可以做这些优化:
- 在podspec中限制仅允许真机架构:
spec.pod_target_xcconfig = { 'VALID_ARCHS' => 'arm64 armv7 armv7s' } - 确保
vendored_frameworks指向的路径在归档阶段能正确找到仅含真机架构的框架文件,或者考虑让CocoaPods在安装时根据目标设备自动编译对应架构(而非预编译fat framework)。
3. 检查Xcode项目的构建配置
打开你的Framework项目,进入Build Settings:
- 在Release/归档配置下,把
Valid Architectures里的x86_64、i386删掉,只保留arm64、armv7、armv7s; - 把
Build Active Architecture Only在Release配置下设为NO,确保编译所有指定的真机架构。
4. 清理缓存后重试
缓存经常会导致诡异的问题,按以下步骤清理后再尝试归档:
- 清理项目:
Cmd + Shift + K; - 删除Derived Data:Xcode → Preferences → Locations → Derived Data → 点击箭头打开文件夹并删除;
- 重新安装Pods:
pod deintegrate && pod install。
5. 验证框架架构(可选)
归档前可以手动检查框架的架构,确保没有多余的模拟器架构:
lipo -info /path/to/your/framework.framework/YourFrameworkName
如果输出里包含x86_64或i386,说明脚本逻辑还没调整到位,需要再检查。
内容的提问来源于stack exchange,提问作者Andrea Mario Lufino
相关产品推荐
相关产品推荐

