KMM iOS共享模块使用MLKit文字识别遇类型不匹配问题
解决KMM iOS共享模块MLKit文字识别的类型不匹配问题
问题根源
你遇到的MLKVisionImage与MLKCompatibleImageProtocol类型不匹配,本质是KMM的cinterop绑定未自动识别MLKVisionImage对该协议的实现,或是初始化/转换环节的类型映射问题。下面是具体解决方案:
1. 确认CocoaPods依赖配置与绑定生成
先检查iOS模块的build.gradle.kts中MLKit的pod配置是否正确,确保使用稳定版本:
ios { binaries { framework { baseName = "shared" } } cocoapods { pod("GoogleMLKit/TextRecognition") { version = "3.2.0" // 推荐使用稳定版本 } pod("Peekaboo") { version = "1.2.0" // 替换为你实际使用的版本 } } }
执行命令重新生成cinterop绑定:
./gradlew clean podInstall
2. 修正VisionImage的类型转换
在iOS模块的actual实现中,显式将MLKVisionImage强转为MLKCompatibleImageProtocol,解决类型不匹配:
import platform.UIKit.UIImage import platform.Foundation.NSData import com.google.mlkit.vision.text.MLKTextRecognizer import com.google.mlkit.vision.common.MLKVisionImage import com.google.mlkit.vision.common.MLKCompatibleImageProtocol actual fun recognizeText(imageBytes: ByteArray): String { // 将字节数组转为UIImage val nsData = NSData.create(bytes = imageBytes, length = imageBytes.size.toULong()) val uiImage = UIImage.imageWithData(data = nsData) ?: return "" // 创建VisionImage并强转为协议类型 val visionImage = MLKVisionImage.imageWithImage(image = uiImage) val compatibleImage = visionImage as MLKCompatibleImageProtocol // 执行文字识别 val recognizer = MLKTextRecognizer.textRecognizer() val result = recognizer.processImage(image = compatibleImage) return result.text ?: "未识别到文字" }
3. 验证cinterop绑定的协议关联
如果强转后仍报错,查看生成的cinterop绑定文件(路径:build/cinterop/ios/main/GoogleMLKitTextRecognition.kt),确认MLKVisionImage是否实现了MLKCompatibleImageProtocol。若未关联,尝试更换MLKit版本(比如3.1.0)重新生成绑定。
4. 确认图片字节数组有效性
检查Peekaboo获取的字节数组是否为标准图片格式(JPEG/PNG),可以通过UIImage.imageWithData的返回值是否为null验证,无效的图片数据会导致后续VisionImage初始化异常。
内容的提问来源于stack exchange,提问作者herz88888888
相关产品推荐
相关产品推荐

