You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:50:21