diff --git a/crates/tauri-bundler/src/bundle/macos/app.rs b/crates/tauri-bundler/src/bundle/macos/app.rs index 20cdd990911e..3a2d4eb5bdd3 100644 --- a/crates/tauri-bundler/src/bundle/macos/app.rs +++ b/crates/tauri-bundler/src/bundle/macos/app.rs @@ -191,12 +191,6 @@ fn create_info_plist( bundle_icon_file: Option, settings: &Settings, ) -> crate::Result<()> { - let format = time::format_description::parse("[year][month][day].[hour][minute][second]") - .map_err(time::error::Error::from)?; - let build_number = time::OffsetDateTime::now_utc() - .format(&format) - .map_err(time::error::Error::from)?; - let mut plist = plist::Dictionary::new(); plist.insert("CFBundleDevelopmentRegion".into(), "English".into()); plist.insert("CFBundleDisplayName".into(), settings.product_name().into()); @@ -224,9 +218,9 @@ fn create_info_plist( plist.insert("CFBundlePackageType".into(), "APPL".into()); plist.insert( "CFBundleShortVersionString".into(), - settings.version_string().into(), + settings.short_version_string().into(), ); - plist.insert("CFBundleVersion".into(), build_number.into()); + plist.insert("CFBundleVersion".into(), settings.version_string().into()); plist.insert("CSResourcesFileMapped".into(), true.into()); if let Some(category) = settings.app_category() { plist.insert( diff --git a/crates/tauri-bundler/src/bundle/macos/ios.rs b/crates/tauri-bundler/src/bundle/macos/ios.rs index 5f4a87a0e538..2a6fdc51aec6 100644 --- a/crates/tauri-bundler/src/bundle/macos/ios.rs +++ b/crates/tauri-bundler/src/bundle/macos/ios.rs @@ -183,7 +183,7 @@ fn generate_info_plist( writeln!( file, " CFBundleShortVersionString\n {}", - settings.version_string() + settings.short_version_string() )?; writeln!( file, diff --git a/crates/tauri-bundler/src/bundle/settings.rs b/crates/tauri-bundler/src/bundle/settings.rs index de7e32a1e3b1..ce02dd4b5cc5 100644 --- a/crates/tauri-bundler/src/bundle/settings.rs +++ b/crates/tauri-bundler/src/bundle/settings.rs @@ -146,6 +146,8 @@ pub struct PackageSettings { pub product_name: String, /// the package's version. pub version: String, + /// the package's short version. + pub short_version: String, /// the package's description. pub description: String, /// the package's homepage. @@ -1089,6 +1091,11 @@ impl Settings { &self.package.version } + /// Returns the short version string of the bundle. + pub fn short_version_string(&self) -> &str { + &self.package.short_version + } + /// Returns the copyright text. pub fn copyright_string(&self) -> Option<&str> { self.bundle_settings.copyright.as_deref() diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index d3e6950db31d..543b099f58fa 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -1017,24 +1017,27 @@ impl RustAppSettings { .workspace .and_then(|v| v.package); + let version = config.version.clone().unwrap_or_else(|| { + cargo_package_settings + .version + .clone() + .expect("Cargo manifest must have the `package.version` field") + .resolve("version", || { + ws_package_settings + .as_ref() + .and_then(|p| p.version.clone()) + .ok_or_else(|| anyhow::anyhow!("Couldn't inherit value for `version` from workspace")) + }) + .expect("Cargo project does not have a version") + }); + let package_settings = PackageSettings { product_name: config .product_name .clone() .unwrap_or_else(|| cargo_package_settings.name.clone()), - version: config.version.clone().unwrap_or_else(|| { - cargo_package_settings - .version - .clone() - .expect("Cargo manifest must have the `package.version` field") - .resolve("version", || { - ws_package_settings - .as_ref() - .and_then(|p| p.version.clone()) - .ok_or_else(|| anyhow::anyhow!("Couldn't inherit value for `version` from workspace")) - }) - .expect("Cargo project does not have a version") - }), + version: version.clone(), + short_version: Self::extract_short_version(&version), description: cargo_package_settings .description .clone() @@ -1119,6 +1122,15 @@ impl RustAppSettings { .or_else(|| self.cargo_config.build().target()) } + fn extract_short_version(version: &str) -> String { + let mut parts = version.split('.'); + match (parts.next(), parts.next()) { + (Some(major), Some(minor)) => format!("{}.{}", major, minor), // Create a new version String + (Some(major), None) => major.to_string(), // Convert major to version String if no minor + _ => String::new(), // Handle empty input case + } + } + pub fn out_dir(&self, options: &Options) -> crate::Result { get_target_dir(self.target(options), options) } diff --git a/crates/tauri-cli/src/mobile/ios/build.rs b/crates/tauri-cli/src/mobile/ios/build.rs index 82a6d2effa40..8bd1e1ac092b 100644 --- a/crates/tauri-cli/src/mobile/ios/build.rs +++ b/crates/tauri-cli/src/mobile/ios/build.rs @@ -177,7 +177,14 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { let mut plist = plist::Dictionary::new(); let version = interface.app_settings().get_package_settings().version; - plist.insert("CFBundleShortVersionString".into(), version.clone().into()); + let short_version = interface + .app_settings() + .get_package_settings() + .short_version; + plist.insert( + "CFBundleShortVersionString".into(), + short_version.clone().into(), + ); plist.insert("CFBundleVersion".into(), version.into()); let info_plist_path = config