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

参考链接

相关推荐
songgeb2 小时前
YYImage Bug:一行之差,正常 JPEG 如何在 iOS 被读成条纹
ios·swift
fthux4 小时前
Tick Rest,一个休息提醒工具的自我修养
macos·开源·swift
灿飞5 小时前
Kotlin与Java虚拟机七:空安全:把十亿美元的错误消灭在类型系统里
java·kotlin
传奇开心果5 小时前
【Flutter踩坑排雷】第3课:const 误用坑|const 错误使用引发 UI 异常与性能损耗
android·flutter
哲鲤5 小时前
AOSP思绎|Android 多媒体:一段视频为什么需要这么多服务
android
阿杰m5 小时前
Android源码第三章:Handler、Looper 与 MessageQueue——一条消息如何入队、唤醒并执行
android
海雅达手持终端PDA8 小时前
巡线、深井、爆管抢修与极寒水网的硬件矩阵怎么配?海雅达水务巡检终端PDA选型指南
android·物联网·5g·集成测试·能源·政务
茶底世界之下9 小时前
阴天花摊不必变暖:用 Awaking 留住花色与湿街
ios·app·产品
行者-全栈开发9 小时前
Flutter 插件 device_calendar_plus 开源鸿蒙适配实战:从权限弹窗失灵到循环日程跑通
flutter·跨平台·harmonyos·arkts·日历·适配·开源鸿蒙
恋猫de小郭10 小时前
Flutter 开始支持 Jetpack Compose Platform View
android·前端·flutter