Xcode13编译React Native项目iOS13环境触发SIGABRT崩溃
崩溃根因
这是典型的低版本系统动态链接符号缺失错误:
- 报错中提到的
_CTRadioAccessTechnologyNR是CoreTelephony框架内用于标识5G NR接入类型的常量,该符号仅在iOS 14及以上系统版本中存在,iOS 13系统自带的CoreTelephony框架未导出这个符号。 - Xcode 13构建应用时,CoreTelephony默认被配置为强(Required)链接模式:应用启动阶段dyld动态链接器会立刻解析所有强链接依赖的符号,一旦在当前系统框架中找不到对应符号,就会直接触发SIGABRT崩溃,不存在延迟加载容错。这也是应用在iOS 14、iOS 15可正常运行,仅iOS 13启动即崩的原因。
- React Native项目触发该问题的常见来源是核心网络状态模块、或低版本
@react-native-community/netinfo依赖引用了5G相关符号,但未正确配置框架弱链接兼容。
修复步骤
按优先级依次尝试以下方案:
- 手动修改CoreTelephony链接模式
- 打开iOS目录下的
.xcworkspace工程文件,选中应用主Target - 切换到
Build Phases标签,展开Link Binary With Libraries列表 - 找到列表中的
CoreTelephony.framework,将其右侧Status属性从默认的Required修改为Optional - 按下
Cmd+Shift+K清理Xcode构建缓存,重新打包即可
- 打开iOS目录下的
- 升级存在兼容问题的依赖
如果项目集成了@react-native-community/netinfo,请将其升级到6.0.2及以上版本,老版本未对CoreTelephony的5G符号做低版本兼容处理,升级后在iOS目录执行pod install再重新构建即可。 - 全局配置弱链接避免配置被依赖覆盖
如果上述方案操作后,执行pod install配置被重置,可以在iOS目录的Podfile末尾添加如下post_install脚本,自动给所有依赖配置CoreTelephony弱链接:
post_install do |installer| installer.pods_project.targets.each do |target| # 注意保留Podfile中已有的其他post_install逻辑,比如Flipper相关配置 target.build_configurations.each do |config| config.build_settings['OTHER_LDFLAGS'] ||= ['$(inherited)'] config.build_settings['OTHER_LDFLAGS'] << '-weak_framework' << 'CoreTelephony' end end end
脚本添加完成后重新执行pod install,清理缓存构建即可。
附原始崩溃关键日志:
dyld: Symbol not found: _CTRadioAccessTechnologyNR Referenced from: xxxx.app/xxxx Expected in: /System/Library/Frameworks/CoreTelephony.framework/CoreTelephony
内容的提问来源于stack exchange,提问作者Govind Raj
相关产品推荐
相关产品推荐

