隨著 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
屬性,選擇在單獨的渲染線程上對渲染命令進行編碼:
@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 了嗎?或者說你接下來會考慮嗎?
參考鏈接
- https://blog.jetbrains.com/kotlin/2025/05/compose-multiplatform-1-8-0-released-compose-multiplatform-for-ios-is-stable-and-production-ready/