Swift UI测试调用Objective C类时遇未定义符号错误求助
解决Swift UI测试调用Objective-C类出现链接错误的问题
这个链接器错误我之前也碰到过,核心问题是你的UI测试target并没有真正包含MyService的实现代码——桥接文件只是让Swift编译器能识别类的接口,但链接阶段需要实际的二进制代码才能找到对应的符号。下面是具体的解决思路和步骤:
检查UI测试target的编译源文件
打开Xcode,按以下操作处理:- 选中项目导航栏最顶部的项目图标
- 在右侧的target列表里选择你的UI测试target(比如
MyAppUITests) - 切换到
Build Phases标签页,展开Compile Sources部分 - 查看列表里是否有
MyService.m文件:- 如果没有,点击
+按钮,在弹出的文件选择器里找到MyService.m并添加进去 - 这一步是关键,因为UI测试target是独立的,不会自动包含主app的所有代码
- 如果没有,点击
确认UI测试target的桥接文件配置
很多人会只给主app target配置桥接文件,但忘了UI测试target也需要:- 同样选中UI测试target,切换到
Build Settings标签页 - 搜索
Objective-C Bridging Header选项 - 确保这里填写的桥接文件路径是正确的,比如文件在项目根目录的话,路径应该是
$(SRCROOT)/MyApp_Bridging_Header.h
- 同样选中UI测试target,切换到
排查架构与编译宏问题
链接错误也可能是架构不匹配导致的:- 检查
MyService.m里有没有针对特定架构的条件编译宏(比如只允许arm64架构编译),如果有,确保x86_64(旧模拟器)或arm64(新模拟器)也被包含 - 确认主app target和UI测试target的
Architectures设置一致,建议都设为Standard Architectures
- 检查
清理缓存重新编译
有时候Xcode的缓存会导致奇怪的链接问题:- 按下
Cmd+Shift+K清理Build文件夹 - 再按下
Cmd+B重新编译UI测试target,之后再运行测试
- 按下
如果你的MyService是主app里的核心类,后续可能还有其他测试需要用到,更优雅的方式是把它放到一个共享的Framework target里,让主app和UI测试target都依赖这个Framework,这样就不用重复添加源文件了。
内容的提问来源于stack exchange,提问作者ductran
相关产品推荐
相关产品推荐

