Compose Multiplatform iOS 稳定版发布:可用于生产环境,并支持 hotload

随着 Compose Multiplatform 1.8.0 的发布,iOS 版本也引来的第一个稳定版本,按照官方的原话:「iOS Is Stable and Production-Ready」 ,而 1.8.0 版本,也让 Kotlin 和 Compose 在移动端有了完整的支持。

在 2023 年 4 月 Compose 发布了 Compose for iOS Alpha ,而在 2024 年的 5 月的 1.6 版本发布了iOS Beta ,一年后的今天,1.8 版本终于有迎来了 Stable 发布。

三年之期已到,龙王归来?

在官方的调查里,超过 96% 的开发者表示在 iOS 上使用 Compose Multiplatform 没有重大的性能问题,这也是官方本次 stable 的原因:

同时在性能对比也有不错的基准测试结果:

  • 启动时间与原生应用程序相当
  • 滚动性能与 SwiftUI 相当
  • 仅增加了 ~9 MB 的大小

基准测试:https://github.com/JetBrains/compose-multiplatform/tree/master/benchmarks/showcases/LazyGridImageView

如果你去看 1.8.0 的更新日志 ,就会看到 Compose 大部分都是 iOS 的亮点,基本这个版本就是为了 iOS 而发布,其中最有意思的莫过于本次加入了并发渲染支持:

Compose Multiplatform 在 iOS 现在支持将渲染任务卸载到专用渲染线程,而并发渲染可以在没有 UIKit 互操作的情况下提高性能。

用户通过直接在 ComposeUIViewController 配置块中启用 ComposeUIViewControllerConfiguration 类的 useSeparateRenderThreadWhenPossible 标志或 parallelRendering 属性,选择在单独的渲染线程上对渲染命令进行编码:

kotlin 复制代码
@OptIn(ExperimentalComposeUiApi::class)
fun main(vararg args: String) {
    UIKitMain {
        ComposeUIViewController(configure = { parallelRendering = true }) {
            // ...
        }
    }
}

而另一个 iOS 的核心实现就是 Kotlin/Native ,Kotlin/Native 是 KMP 在 iOS 支持的关键能力,它负责将 Kotlin 代码直接编译为目标平台的机器码或 LLVM 中间表示 (IR),最终为 iOS 生成一个标准 .framework ,这也是为什么 Compose iOS 能实现接近原生的性能。

鸿蒙 Compose 实现支持目前主流也是 Kotlin/Native ,不得不说 Kotlin 最强大的核心价值不是他的语法糖,而是他的编译器。

当然,Compose Multiplatform 的 UI 渲染并非直接依赖于 iOS 的 UIKit 或 SwiftUI 的原生组件,而是依赖于Skia 图形库,在 Compose Multiplatform 里是通过 Skiko (Skia for Kotlin) 这套 Kotlin 绑定库的能力进行绘制。

简单理解,Skiko 在 iOS 利用 CAMetalLayer 作为其绘图表面,Compose UI 的每一帧都会通过 Skia 引擎渲染到由 CAMetalLayer 提供的 Metal 纹理上,这层实现逻辑和 Flutter 类似。

而前面提到了 UIKit 的互操作,这也是 Compose 渐进式集成的支持之一,在 iOS 上 Compose 可以同时与 SwiftUI 和 UIKit 进行互操作,换句话说,开发者可以在 Swift/UIKit 中使用 Compose,也在 Compose 中使用 SwiftUI/UIKit 。

当然,基于 Compose iOS 的实现模式,在继承的数据绑定和状态同步交互上可能还会存在某些边界问题。

同时,就像我们之前聊过的,klibs.io 的发布也补全了 Compose Multiplatform 在跨平台最后一步,这也是 Compose iOS 能正式发布的另外一个原因:

而 1.8 下的 Compose iOS 也更新了一些细节:、

  • 与原生 iOS 物理特性匹配的滚动行为
  • 原生 selection 和从右到左支持的文本编辑
  • 与系统的拖放集成
  • 遵循系统设置(如字体大小和对比度)的自适应 UI
  • iOS 原生的导航手势

目前官方表示,许多团队(包括 Markaz、Wrike、Feres 和 Physics Wallah)已经将 Compose Multiplatform 集成到它们的大型应用中,根据 Compoes 的理念 ,可以一次集成一个屏幕或功能,所以你无需从头开始就可以使用 Compose iOS。

也就是除了 Web 路线之后,基本上 Compose 在 Stable 的节奏上已经跟上了 Flutter 。

最后,现在 Compose 开发模式下的 hot reload 已经可以使用 ,不过暂时只支持 desktop,原理大概是只支持 jvm 模式, 现在 Compose Multi 开发可以和 Flutter 一样在更改代码后立即查看结果:

在补全这一点后, Compose 跨平台的开发体验也上了一个档次,至少 hot load 的体验比 preview 好太多了,虽然还不支持类似 Flutter Attach 的模式。

至于为什么不支持 Kotlin Native 下 iOS 的 hotload ,这个可以参考过去写过 Flutter 在 iOS 上如何实现开发过程中的二进制 JIT Kernel hotload 和遇到的问题,iOS 上的 hotload 基本需要走 hack 支持。

那么,你已经用上 Compose iOS 了吗?或者说你接下来会考虑吗?

参考链接

相关推荐
yuhuofei20212 小时前
【Python入门】Python中字符串相关拓展
android·java·python
dalancon2 小时前
Android Input Spy Window
android
dalancon3 小时前
InputDispatcher派发事件,查找目标窗口
android
我命由我123454 小时前
Android Framework P3 - MediaServer 进程、认识 ServiceManager 进程
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime
liyoro4 小时前
用 Codex + 提示词生成一个快速打开 Ghostty 的 macOS 小工具
macos·shell·ai编程
天才少年曾牛5 小时前
Android14 新增系统服务后,应用调用出现 “hidden api” 警告的原因与解决方案
android·frameworks
赏金术士5 小时前
Jetpack Compose 底部导航实战教程(完整版)
android·kotlin·compose
随遇丿而安5 小时前
第5周:XML 资源、样式和主题,真正解决的是“页面以后还改不改得动”
android
zh_xuan6 小时前
Android 获取系统内存页大小:sysconf(_SC_PAGESIZE) 与 JNI 实现
android·jni·ndk·内存页大小
fundroid7 小时前
Google I/O 2026 | Android 全面进化:从操作系统到“智能中枢”
android·jetpack compose·google i/o 2026