从 Bevy 的 iOS crates 里彻底删掉 Swift
来源: rustunit.com — 2026-09-04
概述
这些 Rust crate 过去要求你在 Xcode 项目里再挂一个 SPM 包,如今只需要一句 cargo add。作者用 objc2 及其框架绑定替换掉了多年积累下来的四套手写桥接层,同时也删掉了 CI 里构建和分发 xcframework 的整条流水线。
核心要点
- 平台侧代码原本分别用 Swift 的 @_cdecl、手写 Objective-C、protobuf 跨 C ABI 序列化、以及 swift-bridge 加预编译 xcframework 实现,四年下来积累了四套不同的桥。
- 旧方案的代价很具体:每个 README 第一屏都是加 SPM 包的 Xcode 截图,crate 版本与包版本必须严格一致,写错只能在链接期才发现,swift-bridge 还需要 CI 每次构建并上传产物。
- 替代方案之所以可行,是因为 Objective-C 拥有可被通用绑定的动态运行时——selector、类型编码、objc_msgSend——objc2 只需一次性地为每个框架生成绑定。
- 桥接于是从「我们要额外发布的产物」变成了一条普通依赖;收益是实打实的:bevy_ios_notifications 删掉 2809 行,bevy_ios_gamecenter 删掉 4430 行,模拟器构建也恢复了。
- 反方向回调同样用 objc2 的 define_class! 在 Rust 里定义 Objective-C 类交给 UIKit 当委托,推送令牌也从 Swift swizzling 改成挂到应用已有的 delegate 上。
- 唯一例外是 StoreKit 2,它只有 Swift 实现,没有可供 objc2 绑定的 Objective-C 运行时,只能保留一个由 build.rs 用 swiftc 静态编译、通过手写 C ABI 传 JSON 的小 shim。
金句
语言障碍本身并没有消失,我们每次调用仍然要跨越它;改变的只是我们不必再自己建造并分发这座桥了。
👍 0
👎 0
← 返回 Lobsters 首页