iOS使用自定义Framework时Xcode 9.2归档失败问题排查
问题原因与解决方法
嘿,我太懂这种情况了——真机模拟器跑的好好的,一到归档就掉链子,尤其是自研Framework的问题,大概率是Xcode的构建配置在归档模式下的特殊对待搞的鬼。咱们先拆解原因,再一步步解决:
核心原因分析
- 构建依赖的配置遗漏:拖拽添加Framework时,Xcode通常只会自动把它加到
Link Binary With Libraries的Debug配置里,但归档用的Release配置下,可能没把Framework的路径加入Framework Search Paths,或者嵌入步骤没配置。第三方Framework要么是你当初手动补全了这些配置,要么是它们的打包结构更规范,所以没出问题。 - Framework的打包配置错误:自研Framework的
Skip Install参数如果设为NO,Xcode会把它当成独立产品归档,导致主项目找不到它的符号;这是自研Framework归档失败最常见的坑之一。 - 符号可见性问题:自研Framework里的类/函数可能默认被隐藏了(比如用了
__attribute__((visibility("hidden")))),调试模式下Xcode没严格检查,但归档时的Release编译会做符号优化,导致找不到。第三方Framework一般都把公开符号明确暴露了,所以不受影响。
按优先级尝试的解决方法
1. 补全Framework的嵌入与链接配置
打开主项目的Build Phases:
- 确认自研Framework在
Link Binary With Libraries里,并且**所有配置(Debug/Release)**都包含它(点击Framework旁的小三角,查看配置列表)。 - 把Framework添加到
Embed Frameworks中,设置Destination为Frameworks,勾选Copy only when installing。第三方Framework肯定已经配置了这一步,所以归档正常。
2. 修正Framework搜索路径
去主项目的Build Settings,搜索Framework Search Paths:
- 确保Release配置下的路径包含自研Framework的所在目录,推荐用相对路径(比如
$(PROJECT_DIR)/YourFrameworkFolder),避免绝对路径在归档时失效。直接把Framework拖到输入框里就能自动生成正确路径。
3. 调整自研Framework的Build Settings
打开自研Framework的项目:
- 找到
Build Settings里的Skip Install(在Deployment分类下),设为YES——这是最容易忽略的关键配置!如果设为NO,Xcode会把Framework单独归档,主项目就找不到它的符号了。 - 确认
Mach-O Type是Dynamic Library(如果是动态Framework)或者Static Library(静态库的话要确保主项目正确链接)。 - 如果你用了动态Framework,检查Symbols Hidden by Default:设为
YES的同时,要把需要公开的类/函数用__attribute__((visibility("default")))标记,或者在Framework的Public Headers里添加对应的头文件。
4. 重新构建并替换Framework
- 先彻底清理项目:按
Cmd+Shift+K清理构建目录,再按Cmd+Option+Shift+K清理派生数据。 - 单独构建自研Framework的Release版本:选择
Generic iOS Device或者任意真机,然后点击Product -> Build,找到生成的Framework(路径一般在DerivedData的Build/Products/Release-iphoneos下),把这个版本替换到主项目里的Framework文件。
5. 提前验证Release构建
先选择Generic iOS Device,执行Product -> Build,如果这里出错,说明Release配置本身有问题,先解决这个再尝试归档,能节省不少时间。
内容的提问来源于stack exchange,提问作者caldera.sac
相关产品推荐
相关产品推荐

