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
相关产品推荐
相关产品推荐

