Detox测试时App闪退,怎么排查原因?
我在用Detox测试iOS真机时,启动App直接闪退,但手动打开App没问题。试过清除缓存、重启模拟器和重装依赖,还是报错。控制台最后显示红色警告但没具体信息,应该从哪里查起?
执行命令是:detox test -c ios.sim.release,日志里只看到:
Failed to launch application: Error: App 'MyApp' could not be launched in time. Try increasing the 'launchTimeout'
但调整过launchTimeout到120秒也没用。真机调试模式下App会卡在启动画面,Xcode调试器没捕获到崩溃日志。是什么配置或权限问题吗?
直接用 Xcode 打开你的项目,连上真机,选对设备,然后用 Product -> Run 跑起来。这时候如果也闪退,Xcode 控制台会打印崩溃堆栈,比 Detox 日志清楚多了。
如果 Xcode 能跑,那问题出在 Detox 的启动方式。重点查这几个:
1. 确认 build configuration 是 release 还是 debug,你在 detox.config.js 里配的 scheme 和 build 命令要一致。比如你用的是 Release 包,但某些依赖没打包进去,就会启动崩溃。
2. 检查 entitlements 和权限配置。Detox 启动的 App 是被注入测试 bundle 的,系统可能会拦截。确保你的主 App 和 Detox 测试 target 都启用了正确的 signing,并且 capabilities 里没有冲突。
3. 在 AppDelegate.m 的 didFinishLaunchingWithOptions 最前面加个 sleep(5),然后重新 build 一个包给 Detox 用。如果加上后不闪退了,说明是启动阶段有同步初始化任务卡住了,比如某个 SDK 初始化太慢被 Detox 误判为卡死。
4. 最狠的一招:进到你的项目目录,运行这个命令导出详细日志:
看最后几行有没有 dyld、bundle ID 或 missing symbol 相关报错,经常是符号没链接上或者架构不匹配。
我之前遇到过一次,是因为用了 use_frameworks! 但某个静态库没处理好,Debug 模式忽略错误,Release 直接链接失败。改 podfile 加了这一句就通了:
先按上面几步来,90% 的问题都能定位到。
然后用Xcode手动运行测试target确认设备日志。有时候Detox的启动超时只是表象,真机调试时记得在Xcode的Devices窗口里打开控制台过滤器,选中你的设备和App名称,能看到更详细的dyld加载日志。如果卡在main thread初始化,可能是某个C++依赖在测试环境下没正确链接。试试用detox的internal_e2e测试套件先跑个最简用例:
detox test e2e/internal/firstTest.spec.js -c ios.sim.release --debug-synchronization 2000
这样能排除业务代码干扰。另外注意下iOS的trust store设置,真机测试时需要把detox的CA证书加到设备信任列表里。可以用这个命令导出证书:
cd node_modules/detox/scripts && sh ios-sign.sh -d
最后如果还是卡住,可以临时在AppDelegate.m的didFinishLaunchingWithOptions方法里加个sleep(3),给Detox的JS bridge多点初始化时间,能复现问题的话再逐步缩小范围。