使用SBTUITestTunnel执行XCTest时触发EXC_BAD_INSTRUCTION崩溃求助
我之前在集成SBTUITestTunnel做UI自动化测试时,也碰到过一模一样的启动崩溃问题,给你几个亲测有效的排查方向,应该能帮你解决:
1. 先确认Podfile的配置是否正确
这是最容易踩坑的地方,一定要确保主App和UITest Target的依赖分开配置,绝对不要把Server端依赖加到主App里。正确的Podfile示例应该是这样:
target 'YourMainAppTargetName' do use_frameworks! pod 'SBTUITestTunnel/Client' end target 'YourUITestTargetName' do use_frameworks! pod 'SBTUITestTunnel/Server' end
配置完后记得执行pod install,并且关闭Xcode再重新打开.xcworkspace文件。
2. 检查Build Phases的框架嵌入配置
- 主App Target:进入
Build Phases→Link Binary With Libraries,确认有SBTUITestTunnelClient.framework;再看Embed Frameworks,这个框架必须在这里,且设置为Embed & Sign。 - UITest Target:同样在
Link Binary With Libraries里确认有SBTUITestTunnelServer.framework,但绝对不要把它加到Embed Frameworks里——UITest是注入到主App运行的,重复嵌入会导致框架重复加载,直接触发崩溃。
3. 彻底清理缓存后重新构建
缓存经常会导致各种玄学问题,按这个顺序操作:
- 执行终端命令:
pod deintegrate && pod install - 在Xcode里按
Cmd+Shift+K清理项目,再按Cmd+Option+Shift+K彻底清除DerivedData - 重启Xcode和测试用的模拟器/真机
4. 验证App启动时的Client初始化代码
确保你在主App的application:didFinishLaunchingWithOptions:里正确初始化了Client,而且要放在启动流程的早期:
import SBTUITestTunnelClient func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { #if DEBUG // 务必只在Debug环境初始化 SBTUITestTunnelClient.takeOff() #endif // 其他业务初始化代码 return true }
如果你的项目用了SceneDelegate,也要确保在scene(_:willConnectTo:options:)里做同样的初始化(如果需要的话)。
5. 检查UITest Scheme的启动参数
打开UITest的Scheme配置(Cmd+<),进入Test → Info标签:
- 确认
Environment Variables里没有错误的SBTUITestTunnel相关变量 - 切换到
Arguments标签,检查Arguments Passed On Launch里是否包含-SBTUITestTunnel——这个参数是UITest启动App时用来触发Server端初始化的,缺少它也会导致崩溃。
6. 排查系统版本或框架版本兼容性
SBTUITestTunnel对iOS版本有最低要求,比如最新版本可能只支持iOS 13及以上。如果你的测试设备系统版本过低,尝试降级SBTUITestTunnel到适配旧系统的版本;或者升级设备系统到符合要求的版本。
7. 用Demo项目验证是否是项目冲突
如果以上方法都没用,建议创建一个全新的空白iOS项目,严格按照官方步骤集成SBTUITestTunnel。如果Demo能正常运行,说明你的原项目里存在第三方库冲突或者Build Settings配置异常(比如Other Linker Flags里的参数冲突),可以逐步对比两个项目的配置差异来定位问题。
内容的提问来源于stack exchange,提问作者Funktional

