@react-native-community/geolocation引发iOS编译错误求助
问题描述
系统环境
- MacOS: Big Sur
- XCode: Version 12.5.1 (12E507)
- iOS Simulator: iPhone 8 (iOS 14.5)
- Node: v16.10.0
操作流程
- 创建全新React Native项目:
npx react-native@latest init MyFreshProject - 项目创建成功后,执行
npm run ios可在iOS模拟器正常运行。 - 安装
@react-native-community/geolocation(版本^3.0.6),并在Info.plist中添加配置:<key>NSLocationWhenInUseUsageDescription</key> <string></string> <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string></string> - 在
App.tsx中添加代码:import Geolocation from '@react-native-community/geolocation'; ... useEffect(() => { Geolocation.getCurrentPosition(info => console.log(info)); }, []);
编译错误
执行npm run ios后编译失败,错误输出:
/Users/aberikashvili/Documents/.../MyFreshProject/node_modules/@react-native-community/geolocation/ios/RNCGeolocation.mm:393:23: error: property 'sourceInformation' not found on object of type 'CLLocation *' mocked = location.sourceInformation.isSimulatedBySoftware; ^ 1 error generated. ** BUILD FAILED ** The following build commands failed: CompileC /Users/aberikashvili/Library/Developer/Xcode/DerivedData/MyFreshProject-cviktleltpvwpcdkzpdqowhphiwn/Build/Intermediates.noindex/Pods.build/Debug-iphonesimulator/react-native-geolocation.build/Objects-normal/x86_64/RNCGeolocation.o /Users/aberikashvili/Documents/.../MyFreshProject/node_modules/@react-native-community/geolocation/ios/RNCGeolocation.mm normal x86_64 objective-c++ com.apple.compilers.llvm.clang.1_0.compiler (1 failure)
已尝试注释掉App.tsx中Geolocation相关代码,但编译仍然失败,寻求解决思路。
解决思路
原因分析
sourceInformation是iOS 15.0及以上版本CLLocation新增的属性,而你的XCode 12.5.1仅支持最高iOS 14.5版本,编译器无法识别该属性,导致编译失败。
具体解决方案
方案1:降级地理定位库版本
选择不依赖sourceInformation属性的旧版本,比如3.0.0:
npm uninstall @react-native-community/geolocation npm install @react-native-community/geolocation@3.0.0
安装完成后重新执行npm run ios。
方案2:修改库源码(临时修复)
找到node_modules/@react-native-community/geolocation/ios/RNCGeolocation.mm文件,定位到第393行,添加iOS版本判断:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 150000 mocked = location.sourceInformation.isSimulatedBySoftware; #else mocked = NO; // 根据需求设置默认值即可 #endif
修改后保存,重新执行npm run ios。注意:这种修改会在依赖重新安装后失效,可配合patch-package工具打持久化补丁。
方案3:升级XCode和iOS模拟器
将XCode升级到13.0及以上版本(对应支持iOS 15+),同时将Simulator的iOS版本升级到15.0或更高,升级后重新编译项目。
内容的提问来源于stack exchange,提问作者Arkadi
相关产品推荐
相关产品推荐

