Jak programowo wyświetlić wersję / numer kompilacji celu w aplikacji na iOS?

135

Jak mogę programowo uzyskać wartość target version, jak na poniższym obrazku?

Jak widać w oknie Właściwości elementu docelowego mojego projektu Xcode. Chcę to wyświetlić na ekranie powitalnym mojej aplikacji, aby wiedzieć, z której wersji ludzie aktualnie korzystają?

szczupły
źródło

Odpowiedzi:

392

Istnieją 2 liczby!

Numer wersji marketingowej jest przeznaczony dla klientów, nazywany numerem wersji . Zaczyna się od wersji 1.0 i przechodzi do głównych aktualizacji do 2.0 , 3.0 , do drobnych aktualizacji do 1.1 , 1.2 i do poprawek błędów do 1.0.1 , 1.0.2 . Liczba ta dotyczy wersji i nowych funkcji. Nie musi kończyć się na 9, 1.11.23 to rozsądny numer wersji.

Numer kompilacji jest głównie wewnętrzny numer buduje , które zostały wykonane do tej pory. Ale niektórzy używają innych liczb, takich jak numer gałęzi repozytorium lub jego numer zatwierdzenia. Ta liczba powinna być unikatowa, aby rozróżnić różne kompilacje, które mają tylko niewielkie przyrostowe zmiany.


Aby uzyskać numer wersji :

Cel C:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

Szybki <3,0:

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0+ (testowany z 5.0):

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

Aby uzyskać numer kompilacji :

Cel C:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Szybki <3,0:

let buildNumber: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Swift 3.0+ (testowany do 5.0):

let buildNumber: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String   

Jeśli chcesz mieć oba w jednym:

Najpierw użyj powyższych wierszy, a następnie następnego.

Cel C:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Swift (testowany do 5.0):

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

Uwagi:

Wartości w pakiecie głównym nie zawsze są obecne, na przykład w aplikacji wiersza poleceń nie ma CFBundleShortVersionStringlub CFBundleVersion, więc metody zwrócą nili ulegną awarii, ponieważ w kodzie tworzy niepoprawny downcast. Ale w zwykłych aplikacjach Cocoa iOS i Mac te wartości są zdefiniowane i nie zostaną usunięte.

Jest to testowane z Xcode w wersji 7.3 (7D175) . Numer kompilacji jest często zapisywany w nawiasach / nawiasach klamrowych. Numer kompilacji jest szesnastkowy lub dziesiętny.

buildandversion


W Xcode możesz automatycznie zwiększać numer kompilacji jako liczbę dziesiętną , umieszczając następujące elementy w Run scriptfazie kompilacji w ustawieniach projektu

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Dla numeru kompilacji szesnastkowej użyj tego skryptu

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Dla Xcodewykonaj następujące czynności:

Krok 1

krok 1

Krok 2

krok 2

Krok 3

krok 3

Binarian
źródło
4
Aby dodać do powyższego przykładu, „CFBundleVersion” to Build = 300, „CFBundleShortVersionString” to Version = 0.41. Odpowiedź Viktora powinna być poprawna.
justinkoh
1
Kiedyś miałem problemy z liczbami szesnastkowymi. Apple twierdzi, że używa liczb całkowitych: developer.apple.com/library/ios/documentation/general/Reference/…
hashier
Czy wiesz, czy istnieją jakieś stałe łańcuchowe dla @ "CFBundleShortVersionString" i @ "CFBundleVersion"?
igrek
Teraz, gdy systemy CI / CD są dość powszechne, możesz zwrócić uwagę na pułapki związane z używaniem skryptów kompilacji do ustawiania wersji z nimi.
Sam Ballantyne
1
W wersji Swift 3.0 zmieniono nazwę: jest Bundle.main.object(forInfoDictionaryKey: "...")teraz.
Raphael
13

Nie musisz niczego zmieniać w swoim projekcie ani w Xcode. Oto wersja Swift dla obu osobno:

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Jest zawarte w tym repozytorium, sprawdź to:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
źródło
która odpowiedź? nie widzę tego
Esqarrouth
Jest tylko jedna odpowiedź, jest w drugim akapicie
Daniel Galasko
3
Tak, 1. W jego odpowiedzi jest za dużo hałasu, a mało sygnału. 2. To jest szybkie, czyli obiektywne-c. 3. To z ery
ios5
W wersji Swift 3.0 zmieniono nazwę: jest Bundle.main.object(forInfoDictionaryKey: "...")teraz.
Raphael
5

Tutaj ten sam kod dla Swift 3 :

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
tanaschita
źródło
Bundle.mainmiał infoDictionarydla mnie pusty ; może dlatego, że robię to w ramach, a nie w pliku wykonywalnym lub aplikacji? Bundle(for: MyClass.self)zawiera oczekiwane wartości.
Raphael
4

Programowe wyświetlanie wersji i numeru kompilacji - Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"
Sandip Patel - SM
źródło
1

Możesz również użyć like

var appVersion: String {
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"
}

Następnie możesz użyć dowolnego miejsca, gdy deklarujesz globalnie.

print(appVersion)

Wynik:

Version: #1.0 (#1.0.3)
Sivabalaa Jothibose
źródło
1

Zrobiłem rozszerzenie dla Bundle, więc będzie łatwe w użyciu

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}
Amr Angry
źródło