随着 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 的大小

如果你去看 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 了吗?或者说你接下来会考虑吗?