React Native 0.65.1搭配Xcode10执行run-ios出现RCTDatePicker编译错误如何解决
问题根因
- React Native 0.65+ 版本默认适配了iOS14新增的
UIDatePicker样式相关API,这类API仅在Xcode 12及更高版本内置的iOS14+ SDK中存在 - 你当前使用的Xcode 10最高仅支持iOS12 SDK,无法识别新增的枚举、属性,因此直接触发编译报错
- 修改pbxproj文件的
objectVersion参数仅能让Xcode正常打开工程文件,无法解决SDK版本过低导致的API缺失问题
可行解决方案
方案1(最推荐):升级Xcode到匹配版本
React Native 0.65.x的官方最低要求Xcode版本为12.4,直接升级Xcode到12.4或更高版本即可解决所有编译报错,不需要修改任何工程代码。
方案2(兼容Xcode10):降级React Native版本
如果无法升级Xcode,可将React Native版本降级到0.63.x。0.63.x版本的RN未引入iOS14的日期选择器新API,完全兼容Xcode10的iOS12 SDK,降级后执行pod install重新安装iOS依赖即可正常编译。
方案3(临时补丁):兼容低版本Xcode的源码修改
如果必须保留当前RN版本和Xcode10,可通过patch-package给RN源码打兼容补丁,步骤如下:
- 安装patch-package工具:
npm install patch-package --save-dev - 打开
node_modules/react-native/React/Views/RCTDatePickerManager.m文件,在文件头部导入UIKit的代码下方添加版本判断宏:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000 #define RCT_SUPPORTS_DATE_PICKER_STYLE 1 #else #define RCT_SUPPORTS_DATE_PICKER_STYLE 0 #endif
- 找到文件中
RCT_ENUM_CONVERTER定义UIDatePickerStyle的代码段,用版本判断包裹:
#if RCT_SUPPORTS_DATE_PICKER_STYLE RCT_ENUM_CONVERTER( UIDatePickerStyle, (@{ @"compact" : @(UIDatePickerStyleCompact), @"spinner" : @(UIDatePickerStyleWheels), @"inline" : @(UIDatePickerStyleInline), }), UIDatePickerStyleAutomatic, integerValue) #endif
- 找到文件中设置
preferredDatePickerStyle属性的代码段,用版本判断包裹:
#if RCT_SUPPORTS_DATE_PICKER_STYLE UIDatePickerStyle style = [RCTConvert UIDatePickerStyle:json]; view.preferredDatePickerStyle = style; #else // 低版本SDK默认使用原生滚轮样式,不需要额外设置 #endif
- 找到fallback逻辑中设置
UIDatePickerStyleWheels的代码,同样用版本判断包裹:
#if RCT_SUPPORTS_DATE_PICKER_STYLE view.preferredDatePickerStyle = UIDatePickerStyleWheels; #endif
- 保存文件后执行
npx patch-package react-native,会在项目根目录生成patches文件夹,补丁会永久生效,后续重新安装依赖也会自动应用修改。
内容的提问来源于stack exchange,提问作者Smelly Potato
相关产品推荐
相关产品推荐

