React Native集成iOS Swift版Google MLKit文字识别v2异常求助
问题分析与解决方案
你遇到的问题主要由两个原因导致:
1. Objective-C方法声明的参数类型错误
在OCRTextRecognizer.m的RCT_EXTERN_METHOD声明中,NSString类型缺少指针符号*,Objective-C中所有对象类型必须以指针形式传递,这个错误会导致RN的Promise机制出现异常——即使Swift层成功调用resolve,底层参数解析的问题仍会触发catch块。
2. Swift代码存在未处理的分支
当传入的图片路径无效、无法加载图片时,代码既没有调用resolve也没有调用reject,会导致Promise处于悬而未决的状态,这也可能引发不可预期的Promise行为。
修改步骤
第一步:修正Objective-C的方法声明
修改ios/OCRTextRecognizer.m中的方法声明,给NSString添加指针符号:
#import <Foundation/Foundation.h> #import "React/RCTBridgeModule.h" @interface RCT_EXTERN_MODULE(OCRTextRecognizer,NSObject) // 修正:NSString → NSString * RCT_EXTERN_METHOD(runTextRecognition:(NSString *)url resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) @end
第二步:补全Swift代码的错误分支处理
在ios/OCRTextRecognizer.swift中,当图片加载失败时调用reject:
import Foundation import MLKit import UIKit @objc(OCRTextRecognizer) class OCRTextRecognizer: NSObject{ // When using Latin script recognition SDK let latinOptions = TextRecognizerOptions() private lazy var textRecognizer = TextRecognizer.textRecognizer(options: latinOptions) @objc(runTextRecognition:resolver:rejecter:) func runTextRecognition(_ url:String, resolver resolve:@escaping RCTPromiseResolveBlock, rejecter reject:@escaping RCTPromiseRejectBlock) { let imagePath = url DispatchQueue.global(qos: .default).async{ if let imagee = UIImage(contentsOfFile: imagePath){ let visionImage = VisionImage(image: imagee) visionImage.orientation = imagee.imageOrientation self.textRecognizer.process(visionImage) {result,error in guard error == nil, let result = result else { // Error handling DispatchQueue.main.async { reject("TEXT_RECOGNITION_ERROR","Error recognition text",error) } return } // Recognized text var resLines:[String] = [] for block in result.blocks { for line in block.lines { resLines.append(line.text) } } let response = ["blocks":resLines] DispatchQueue.main.async { resolve(response) } } } else { // 新增:图片加载失败时调用reject DispatchQueue.main.async { reject("IMAGE_LOAD_FAILED", "Could not load image from path: \(imagePath)", nil) } } } } @objc static func requiresMainQueueSetup() -> Bool { return true } }
验证修改
重新编译iOS项目,再次调用RN端的方法:
import {NativeModules} from 'react-native' NativeModules.OCRTextRecognizer.runTextRecognition(imagePath) .then((response: any) => { console.log('This block called first'); }) .catch((error: any) => { console.log('then this block called'); });
此时当识别成功时,只会触发then块;当图片加载失败或识别出错时,才会触发catch块,符合预期。
内容的提问来源于stack exchange,提问作者7th storm
相关产品推荐
相关产品推荐

