14 unstable releases (4 breaking)
Uses new Rust 2024
| 0.5.0 | Oct 18, 2025 |
|---|---|
| 0.4.0 | Apr 26, 2025 |
| 0.3.1 | Mar 29, 2025 |
| 0.3.0 | Dec 2, 2024 |
| 0.1.8 | May 11, 2024 |
#409 in Game dev
141 downloads per month
58KB
1K
SLoC
bevy_ios_gamecenter
Bevy Plugin and Swift Package to provide access to iOS native GameKit (Gamecenter) from inside Bevy Apps It uses Swift-Bridge to auto-generate the glue code and transport data types.

Demo from our game using this crate: zoolitaire.com
Features
- authentication
- save games (based on iCloud)
- achievements
- leaderboards
- egui based debug ui crate see bevy_ios_gamecenter_egui folder
TODOs
- challenges, matchmaking
Instructions
- Add to XCode: Add SPM (Swift Package Manager) dependency
- Add Rust dependency
- Setup Plugin
1. Add to XCode
-
Add
GameKitframework:
-
Go to
File->Add Package Dependenciesand pastehttps://github.com/rustunit/bevy_ios_gamecenter.gitinto the search bar on the top right:
Note:
The rust crate used must be exactly the same version as the Swift Package.
I suggest using a specific version (like 0.2.0 in the screenshot) to make sure to always use binary matching versions!
2. Add Rust dependency
cargo add bevy_ios_gamecenter
or
# always pin to the same exact version you also of the Swift package
bevy_ios_gamecenter = { version = "=0.5.0" }
3. Setup Plugin
Initialize Bevy Plugin:
// init right on startup
app.add_plugins(IosGamecenterPlugin::new(true));
fn bevy_system(mut gc: BevyIosGamecenter) {
gc.authenticate()
.on_response(|result: On<AuthenticationResult>| match result.response {
IosGCAuthResult::IsAuthenticated => {},
IosGCAuthResult::LoginPresented => {},
IosGCAuthResult::Error(e) => error!("auth error: {e}"),
});
// here we request the player info type for the username and more
// Note: all requests via `gc` of type `BevyIosGamecenter`
// allow to attach an observer to listen to the response:
gc.request_player().on_response(on_player_response);
// update achievement progress, 100 % will complete it
gc.achievement_progress("id".into(),100.);
// reset all achievements
gc.achievements_reset();
// save a game state as a byte slice
gc.save_game("test".into(), vec![1, 2, 3].as_slice());
// request list of `IosGCSaveGame`
gc.fetch_save_games().on_response(on_response);
// based on result of above `fetch_save_games` request
let save_game = IosGCSaveGame {..}
gc.load_game(save_game);
// update leaderboard score
gc.leaderboards_score(
"raking id".into(),
// score
1,
// context
2,
);
// open gamecenter view (leaderboard)
gc.trigger_view(view_states::LEADERBOARDS);
}
Our Other Crates
- bevy_debug_log
- bevy_device_lang
- bevy_web_popups
- bevy_libgdx_atlas
- bevy_ios_review
- bevy_ios_iap
- bevy_ios_alerts
- bevy_ios_notifications
- bevy_ios_impact
- bevy_ios_safearea
Bevy version support
| bevy | bevy_ios_gamecenter |
|---|---|
| 0.17 | 0.5,main |
| 0.16 | 0.4 |
| 0.15 | 0.3 |
| 0.14 | 0.2 |
| 0.13 | 0.1 |
License
All code in this repository is dual-licensed under either:
- MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
at your option. This means you can select the license you prefer.
Your contributions
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Dependencies
~27–44MB
~695K SLoC