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

Compose Multiplatform iOS集成Google MLKit扫码cinterop生成失败求助

问题

开发Compose Multiplatform应用时,通过CocoaPods在iOS端集成Google MLKit条码扫描器,构建项目时出现以下错误:

Failed to generate cinterop for :composeApp:cinteropGoogleMLKitIosArm64: 
Process 'command '/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java'' finished with non-zero exit value 1
composeApp:iosArm64Main: cinterop file: /Users/OTB/Desktop/Tkl/composeApp/build/libs/composeApp-iosArm64Cinterop-GoogleMLKitMain.klib does not exist

附带提示:

Possible solution:
- Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html 

当前配置如下:

Podfile

platform :ios, '15.5'

target 'iosApp' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!
    pod 'composeApp', :path => '../composeApp'
    pod 'GoogleMLKit/BarcodeScanning', '8.0.0'

  # Pods for iosApp

end

Compose模块build.gradle

cocoapods {
        summary = "Tkl ios dependency"
        homepage = "tkl.com/homepage"
        version = "1.0"
        podfile = project.file("../iosApp/Podfile")
        ios.deploymentTarget = "15.5"
 
        pod("GoogleMLKit/BarcodeScanning"){
            moduleName ="MLKitBarcodeScanning"
            version = "8.0.0"
            extraOpts += listOf("-compiler-option","-fmodules")
        }
 
    }
 
    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach { iosTarget ->
        iosTarget.binaries.framework {
            baseName = "ComposeApp"
            isStatic = true
        }
 
    }
sourceSets {
 
        androidMain.dependencies {
            implementation(compose.preview)
            implementation(libs.androidx.activity.compose)
            ...

        }
        commonMain.dependencies {
            implementation(compose.runtime)
            implementation(compose.foundation)
            ...
          
        }
        iosMain.dependencies {
            implementation(libs.ktor.client.darwin)
        }}

求问如何正确集成Google MLKit条码扫描Pod到Compose Multiplatform的iOS端,需要可行方案或示例。


解决方案

1. 移除Pod依赖重复声明

当前build.gradle和Podfile同时声明了GoogleMLKit/BarcodeScanning,会导致依赖冲突。只保留build.gradle中的声明,修改Podfile如下:

platform :ios, '15.5'

target 'iosApp' do
  use_frameworks!
  pod 'composeApp', :path => '../composeApp'
end

2. 优化cinterop配置

Google MLKit的框架结构需要额外参数才能让cinterop正确识别,更新build.gradle中的Pod配置:

pod("GoogleMLKit/BarcodeScanning") {
    moduleName = "MLKitBarcodeScanning"
    version = "8.0.0"
    extraOpts += listOf(
        "-compiler-option", "-fmodules",
        "-framework", "MLKitBarcodeScanning",
        "-I", "\${PODS_ROOT}/GoogleMLKit/BarcodeScanning/Frameworks"
    )
}

3. 刷新依赖与清理缓存

  • 执行Android Studio缓存清理:File -> Invalidate Caches...,选择Invalidate and Restart
  • 同步Gradle项目:点击工具栏的「Sync Project with Gradle Files」按钮
  • 在iOS项目目录下执行命令更新Pods:
cd iosApp
pod deintegrate
pod install

4. 验证配置有效性

重新构建项目后,若仍有错误,检查:

  • 确认iOS部署目标15.5符合MLKit 8.0.0的最低要求(支持iOS 13.0+)
  • 查看iosApp/Pods/GoogleMLKit/BarcodeScanning目录下是否存在MLKitBarcodeScanning.framework

5. 示例调用代码

在iosMain源集中编写MLKit条码扫描的包装代码:

import MLKitBarcodeScanning.*
import platform.CoreImage.CIImage
import platform.UIKit.UIImage

fun scanBarcodeFromImage(image: UIImage): List<String> {
    val ciImage = CIImage(image = image) ?: return emptyList()
    val scanner = BarcodeScanner.barcodeScanner()
    val results = scanner.process(ciImage)
    return results.mapNotNull { it.displayValue }
}

内容的提问来源于stack exchange,提问作者uniqueapps

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:31:03