Skip to content

Instantly share code, notes, and snippets.

@martinpi
Created September 25, 2020 13:45
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save martinpi/f4311512c443b8134bda3f268ae7abd3 to your computer and use it in GitHub Desktop.
Save martinpi/f4311512c443b8134bda3f268ae7abd3 to your computer and use it in GitHub Desktop.
Automatically increment the iOS build number in Unity conforming to Apple's guidelines before every build. Be sure to drop into a folder name "Editor". Worked in autumn 2020.
using UnityEngine;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEditor;
public class IncrementBuildNumber : IPreprocessBuildWithReport {
public int callbackOrder { get { return 0; } } // Part of the IPreprocessBuildWithReport interface
public void OnPreprocessBuild(BuildReport report) {
if (report.summary.platform == BuildTarget.iOS) {
// to update major or minor version, manually set it in Edit>Project Settings>Player>Other Settings>Version
string[] versionParts = PlayerSettings.iOS.buildNumber.Split('.');
int buildNumber = 0;
if (versionParts.Length != 3 || !int.TryParse(versionParts[2], out buildNumber) ) {
Debug.LogError("BuildPostprocessor failed to update version " + PlayerSettings.bundleVersion + " with build number: " + PlayerSettings.iOS.buildNumber);
return;
}
// major-minor-build
versionParts[2] = (buildNumber + 1).ToString();
PlayerSettings.iOS.buildNumber = PlayerSettings.bundleVersion + "." + versionParts[2];
}
}
}
@jameshenderson12
Copy link

This is very useful, thank you.

@jmarsh411
Copy link

Thank you for sharing this!

@moritz-mg
Copy link

moritz-mg commented Jul 19, 2023

I prefer using a more standard solution instead of doctoring strings at build time. I'd use System.Version, for instance:

var input = new Version(PlayerSettings.bundleVersion); //at runtime, use Application.version
var output = new Version(input.Major, input.Major, input.Revision, input.Build+1);
PlayerSettings.bundleVersion = output.ToString();

This is nice, because System.Version also supports comparison operations such as:

var version = new Version(Application.version);
var lowestCompatible = new Version(RemoteConfigService.Instance.appConfig.getString("lowestCompatibleVersion"));
if (version < lowestCompatible) await ShowForceUpdateDialog();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment