Expo独立iOS构建在Simulator和TestFlight启动屏后崩溃问题
问题描述
我使用Expo开发了一款市场类应用,在Android、iOS端的Expo Go环境以及Android独立包中运行均正常。问题出在构建iOS模拟器对应的.tar包或是上传到TestFlight测试时,应用在显示启动闪屏后立即崩溃。我使用的是托管工作流(managed workflow),且确认已遵循所有官方操作指引。
崩溃日志
崩溃线程:0 com.apple.main-thread 调度队列 异常类型:EXC_CRASH (SIGABRT) 异常代码:0x0000000000000000, 0x0000000000000000 异常说明:EXC_CORPSE_NOTIFY 应用特定信息: *** 应用因未捕获的异常'ExpoFatalError'终止,原因:'Expo遇到致命错误:未处理的JS异常:不变量违规:原生模块不能为null' 终止时抛出未捕获的NSException类型异常 已调用abort() CoreSimulator 757.5 - 设备:iPhone 12 (0D59D0C0-2D3B-40ED-A8E2-DA0B1417C29C) - 运行时:iOS 14.5 (18E182) - 设备类型:iPhone 12 应用特定回溯1: 0 CoreFoundation 0x00007fff20422fba __exceptionPreprocess + 242 1 libobjc.A.dylib 0x00007fff20193ff5 objc_exception_throw + 48 2 ComGrabbiGrabbiapp 0x000000010b375821 -[EXAppViewController maybeShowError:] + 506 3 ComGrabbiGrabbiapp 0x000000010b396dce handleFatalReactError_block_invoke_2 + 574 4 libdispatch.dylib 0x00007fff201078df _dispatch_client_callout + 8 5 libdispatch.dylib 0x00007fff201156ca _dispatch_async_and_wait_invoke + 109 6 libdispatch.dylib 0x00007fff201078df _dispatch_client_callout + 8 7 libdispatch.dylib 0x00007fff20114a27 _dispatch_main_queue_callback_4CF + 1045 8 CoreFoundation 0x00007fff203908f8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 9 CoreFoundation 0x00007fff2038b169 __CFRunLoopRun + 2781 10 CoreFoundation 0x00007fff2038a1a7 CFRunLoopRunSpecific + 567 11 GraphicsServices 0x00007fff2b874d85 GSEventRunModal + 139 12 UIKitCore 0x00007fff246c14df -[UIApplication _run] + 912 13 UIKitCore 0x00007fff246c639c UIApplicationMain + 101 14 ComGrabbiGrabbiapp 0x000000010b1461d0 main + 80 15 libdyld.dylib 0x00007fff2025abbd start + 1 线程0崩溃:: com.apple.main-thread 调度队列 0 libsystem_kernel.dylib 0x00007fff60309946 __pthread_kill + 10 1 libsystem_pthread.dylib 0x00007fff60343615 pthread_kill + 263 2 libsystem_c.dylib 0x00007fff200fbd4f __abort + 139 3 libsystem_c.dylib 0x00007fff200fbcc4 abort + 135 4 libc++abi.dylib 0x00007fff20254692 abort_message + 241 5 libc++abi.dylib 0x00007fff20245dfd demangling_terminate_handler() + 266 6 libobjc.A.dylib 0x00007fff20179ace _objc_terminate() + 96 7 libc++abi.dylib 0x00007fff20253aa7 std::__terminate(void (*)()) + 8 8 libc++abi.dylib 0x00007fff20253a49 std::terminate() + 41 9 libdispatch.dylib 0x00007fff201078f3 _dispatch_client_callout + 28 10 libdispatch.dylib 0x00007fff201156ca _dispatch_async_and_wait_invoke + 109 11 libdispatch.dylib 0x00007fff201078df _dispatch_client_callout + 8 12 libdispatch.dylib 0x00007fff20114a27 _dispatch_main_queue_callback_4CF + 1045 13 com.apple.CoreFoundation 0x00007fff203908f8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 14 com.apple.CoreFoundation 0x00007fff2038b169 __CFRunLoopRun + 2781 15 com.apple.CoreFoundation 0x00007fff2038a1a7 CFRunLoopRunSpecific + 567 16 com.apple.GraphicsServices 0x00007fff2b874d85 GSEventRunModal + 139 17 com.apple.UIKitCore 0x00007fff246c14df -[UIApplication _run] + 912 18 com.apple.UIKitCore 0x00007fff246c639c UIApplicationMain + 101 19 com.grabbi.grabbiapp 0x000000010b1461d0 main + 80 20 libdyld.dylib 0x00007fff2025abbd start + 1
问题根因
核心报错Invariant Violation: Native module cannot be null说明项目中引用的某个原生依赖没有被正确注入到iOS生产包中。Expo Go环境内置了绝大多数常用原生模块,因此开发阶段不会触发报错,只有在构建独立包时才会出现该问题。
解决方案
- 检查所有引入的第三方依赖是否支持Expo托管工作流,排除仅支持裸工作流(Bare Workflow)的原生库
- 执行
npx expo install --check校验所有依赖版本是否与当前使用的Expo SDK版本匹配,按提示将不匹配的依赖升级至对应版本 - 排查代码中直接调用NativeModules的逻辑,确认调用的原生模块名称无拼写错误、对应依赖已正确安装
- 检查非Expo官方维护的第三方库是否需要在app.json中配置插件,遗漏插件配置会导致iOS打包时不会注入对应的原生代码
- 清理所有缓存后重新构建:执行
npx expo start --clear清理JS侧缓存,构建iOS包时选择清理构建缓存选项
快速定位技巧
在项目入口文件最顶部添加全局JS异常捕获逻辑,打印异常对应的模块路径和名称,可直接定位到具体是哪个依赖的原生模块为空。
内容的提问来源于stack exchange,提问作者Eric Lehmann
相关产品推荐
相关产品推荐

