핵심 요약
- Bevy 게임 엔진의 iOS 연동 라이브러리들에서 Xcode SPM 설정이 필요하던 Swift 패키지 의존성을 완전히 제거했습니다.
- 애플 프레임워크 런타임에 직접 접근하는 objc2를 활용해 수천 줄의 브리지 코드를 삭제하고 시뮬레이터 빌드 호환성도 되살렸습니다.
- 이제 외부 패키지 설치 없이 cargo add 하나만으로 깔끔하게 iOS 기능을 연동할 수 있게 되었습니다.
요약 Rust 기반 게임 엔진 Bevy의 iOS 플러그인 모음인 bevy_ios_* 생태계에서 번거로운 Swift 패키지 의존성을 완전히 제거했다는 개발팀의 기술 공유입니다.
기존에는 iOS 기능을 연동하기 위해 crates.io의 Rust 크레이트뿐만 아니라 Xcode 프로젝트에서 Swift 패키지 매니저(SPM)를 통해 별도의 Swift 패키지를 추가해야 했습니다. 이로 인해 Rust 크레이트 버전과 SPM 패키지 버전을 엄격하게 맞춰야 했고, 버전 불일치 시 링크 타임 에러가 발생하는 등 설정이 매우 까다로웠습니다. 또한 swift-bridge를 사용하는 라이브러리는 매 릴리즈마다 .xcframework를 빌드해 압축하고 해시값을 매겨 첨부해야 했으며, 아키텍처 호환성 문제로 iOS 시뮬레이터 빌드가 깨지는 문제도 겪었습니다.
개발팀은 애플의 네이티브 프레임워크가 본질적으로 Objective-C 런타임을 공유한다는 점에 착안해, `objc2`와 이를 기반으로 생성된 바인딩(objc2-ui-kit, objc2-user-notifications 등)을 도입하여 이 문제를 해결했습니다. 이를 통해 플랫폼 브리지를 Rust 내부 의존성으로 통합했으며, Rust 코드 내에서 직접 Objective-C 클래스와 델리게이트를 정의할 수 있게 되었습니다. 결과적으로 bevy_ios_notifications에서 2,800여 줄, bevy_ios_gamecenter에서 4,400여 줄의 불필요한 브리지 코드를 삭제하는 성과를 거두었습니다.
사용자 입장에서는 이제 복잡한 SPM 패키지 설정이나 프레임워크 수동 링크 없이 단순히 `cargo add` 명령어로 플러그인을 설치할 수 있게 되었으며, 시뮬레이터 빌드도 정상 지원됩니다. 다만 Swift 전용 API인 StoreKit 2를 사용하는 인앱결제(bevy_ios_iap)의 경우, 작은 Swift 쉼(shim)을 유지하되 이를 build.rs에서 정적 링크하도록 처리하여 외부 SPM 의존성 없이 단일 크레이트로 설치할 수 있도록 구성했습니다.
Sponsored · 광고