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

Coil3是否支持原生iOS?求KMM项目原生iOS加载示例

在KMM原生iOS端使用Coil3加载图片的实现方案

一、共享模块配置

首先在KMM共享模块的build.gradle.kts中添加Coil3的依赖:

kotlin {
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("io.coil-kt:coil:3.0.0")
                implementation("io.coil-kt:coil-network-okhttp:3.0.0") // 可选,基于OkHttp实现网络加载
            }
        }
    }
}

然后在共享模块中封装跨平台图片加载类,通过@ObjCName注解让Swift可调用:

import coil.ImageLoader
import coil.request.ImageRequest
import coil.request.SuccessResult
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import okhttp3.OkHttpClient
import platform.UIKit.UIImage
import kotlin.native.concurrent.SharedImmutable

@ObjCName(name = "CoilImageLoader")
class CoilImageLoader {
    // 全局线程安全的ImageLoader实例
    @SharedImmutable
    private val imageLoader = ImageLoader.Builder()
        .okHttpClient {
            OkHttpClient.Builder().build()
        }
        .build()

    // 同步加载方法(建议仅在后台线程调用)
    fun loadImage(url: String): UIImage? {
        return runBlocking(Dispatchers.IO) {
            val request = ImageRequest.Builder(url).build()
            val result = imageLoader.execute(request)
            (result as? SuccessResult)?.drawable.toUIImage()
        }
    }

    // 异步加载方法,通过闭包回调结果到主线程
    fun loadImageAsync(url: String, completion: (UIImage?) -> Unit) {
        GlobalScope.launch(Dispatchers.IO) {
            val image = loadImage(url)
            launch(Dispatchers.Main) {
                completion(image)
            }
        }
    }

    // 扩展方法:Coil Drawable 转 iOS UIImage
    private fun coil.drawable.Drawable?.toUIImage(): UIImage? {
        val bitmap = (this as? coil.bitmap.BitmapDrawable)?.bitmap ?: return null
        val bytes = bitmap.toByteArray(coil.bitmap.Bitmap.CompressFormat.PNG, 100)
        return UIImage.imageWithData(bytes)
    }
}

二、iOS原生端调用

在Swift代码中直接实例化封装好的加载类,实现图片加载:

import UIKit

class ImageDemoViewController: UIViewController {
    private let imageView = UIImageView(frame: CGRect(x: 80, y: 200, width: 250, height: 250))
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(imageView)
        
        let coilLoader = CoilImageLoader()
        // 异步加载并更新UI
        coilLoader.loadImageAsync(url: "https://example.com/test-image.jpg") { [weak self] image in
            self?.imageView.image = image
        }
    }
}

注意事项

  • 网络权限:iOS端需在Info.plist中配置网络权限,若加载HTTP图片,需添加NSAppTransportSecurity字典并设置NSAllowsArbitraryLoads为YES(或针对特定域名配置例外)。
  • 线程安全:异步加载的回调已切换到主线程,可直接更新UI;同步加载方法需在后台线程调用,避免阻塞主线程。
  • 版本适配:确保使用Coil3的正式版本(3.0.0及以上),依赖配置需与KMM插件版本兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:52:17