React Native iOS端OCR集成编译报错求助,Android端运行正常
问题背景
React Native项目中集成OCR功能,Android端运行正常,但iOS端编译报错,使用的OCR库为rn-text-detector。
编译错误详情
CompileC /Users/Macbook/Library/Developer/Xcode/DerivedData/CRANE-ciqqhizauxjmlaevomkjkiypelyu/Build/Intermediates.noindex/Pods.build/Debug-iphonesimulator/RNTextDetector.build/Objects-normal/x86_64/RNTextDetector.o /Users/Macbook/Documents/GitHub/crane-app/CRANE/node_modules/rn-text-detector/ios/RNTextDetector.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler (in target 'RNTextDetector' from project 'Pods')(1 failure)
核心业务代码
import RNTextDetector from "rn-text-detector"; const captureImage = async type => { let options = { mediaType: type, maxWidth: 300, maxHeight: 550, quality: 1, videoQuality: 'low', durationLimit: 30, // 视频最长录制时长(秒) saveToPhotos: true, }; let isCameraPermitted = await requestCameraPermission(); let isStoragePermitted = await requestExternalWritePermission(); if (isCameraPermitted && isStoragePermitted) { launchCamera(options, response => { console.log('Response = ', response); if (response.didCancel) { alert('用户取消了相机选择'); return; } else if (response.errorCode == 'camera_unavailable') { alert('设备相机不可用'); return; } else if (response.errorCode == 'permission') { alert('权限未获取'); return; } else if (response.errorCode == 'others') { alert(response.errorMessage); return; } console.log('base64 -> ', response.assets[0].base64); console.log('uri -> ', response.assets[0].uri); console.log('width -> ', response.assets[0].width); console.log('height -> ', response.assets[0].height); console.log('fileSize -> ', response.assets[0].fileSize); console.log('type -> ', response.assets[0].type); console.log('fileName -> ', response.assets[0].fileName); setFilePath(response.assets[0].uri); (async () => { const textRecognition = await RNTextDetector.detectFromUri(response.assets[0].uri); console.log('识别结果', textRecognition); setSerialNumber(textRecognition[0].text) })(); RNFS.readFile(response.assets[0].uri, "base64").then(result => { setImage('data:/' + response.assets[0].type + ';' + 'base64,' + result) setScreenData({ ...screenData, image1: 'data:/' + response.assets[0].type + ';' + 'base64,' + result }); }) }); } };
解决步骤
清理并重新安装Pod依赖
进入项目iOS目录,依次执行:pod deintegrate pod install完成后重启Xcode再尝试编译。
验证库链接与iOS版本兼容性
- 打开Xcode项目,检查
Build Phases->Link Binary With Libraries中是否已添加RNTextDetector.framework,未添加则手动引入。 - 确认项目部署目标不低于iOS 11.0(该库依赖的Vision框架最低支持iOS 11)。
- 打开Xcode项目,检查
排查库源码语法问题
打开node_modules/rn-text-detector/ios/RNTextDetector.m文件,检查:- 是否导入
#import <Vision/Vision.h>头文件 - Objective-C代码是否存在语法错误(如未定义变量、API调用过时)
若发现问题,可临时修改源码后重新编译,或切换到库的稳定版本。
- 是否导入
完善iOS权限配置
在Info.plist中添加必要权限描述:<key>NSCameraUsageDescription</key> <string>需要使用相机拍摄图片进行文字识别</string> <key>NSPhotoLibraryUsageDescription</key> <string>需要访问照片库以处理识别图片</string>切换到真机测试
部分OCR功能在iOS模拟器上存在限制,直接在真机上编译运行,排除模拟器环境问题。
内容的提问来源于stack exchange,提问作者Mac

