1 //! Tauri command: `app_build_version`
2 //!
3 //! Exposes the native build number so Settings can show a real version string
4 //! instead of a hardcoded one. The marketing version (`CFBundleShortVersionString`)
5 //! comes from `tauri.conf.json` and is read on the JS side via the app plugin's
6 //! `getVersion()`; the build number (`CFBundleVersion`) is Apple-specific and
7 //! lives only in the shipped bundle, so it needs a native read.
8
9 /// Return the app's build version (`CFBundleVersion`).
10 ///
11 /// On Apple platforms this reads `CFBundleVersion` from the running bundle's
12 /// Info.plist — the exact value App Store Connect and TestFlight show, stamped
13 /// at build time by the release scripts as `YYYYMMDD.HHMM`. Returns `None` when
14 /// it cannot be resolved so the UI can fall back to the marketing version alone.
15 #[cfg(any(target_os = "ios", target_os = "macos"))]
16 #[tauri::command]
17 pub fn app_build_version() -> Option<String> {
18 use objc2_foundation::{NSBundle, NSString};
19
20 let bundle = NSBundle::mainBundle();
21 let value = bundle.objectForInfoDictionaryKey(&NSString::from_str("CFBundleVersion"))?;
22 let version = value.downcast::<NSString>().ok()?;
23 Some(version.to_string())
24 }
25
26 /// Non-Apple builds have no `CFBundleVersion`; fall back to the marketing version.
27 #[cfg(not(any(target_os = "ios", target_os = "macos")))]
28 #[tauri::command]
29 pub fn app_build_version() -> Option<String> {
30 None
31 }