Come visualizzare a livello di codice la versione / costruire il numero di destinazione nell'app iOS?


135

Come posso ottenere a livello di codice il valore di target version, come nell'immagine qui sotto?

Come visto nella finestra Proprietà della destinazione del mio progetto Xcode. Voglio visualizzarlo nella schermata iniziale della mia app in modo da sapere quale versione stanno utilizzando le persone?

Risposte:


392

Ci sono 2 numeri!

Il numero della versione di marketing è per i clienti, chiamato numero di versione . Inizia con 1.0 e va per aggiornamenti importanti a 2.0 , 3.0 , per aggiornamenti minori a 1.1 , 1.2 e per correzioni di bug a 1.0.1 , 1.0.2 . Questo numero è orientato alle versioni e alle nuove funzionalità. Non deve fermarsi alle 9, 1.11.23 è un numero di versione ragionevole.

Il numero di build è principalmente il numero interno di build che sono state fatte fino ad allora. Ma alcuni usano altri numeri come il numero di diramazione del repository o il suo numero di commit. Questo numero dovrebbe essere univoco per distinguere le diverse build, che presentano solo piccole modifiche incrementali.


Per ottenere il numero di versione :

Objective-C:

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

Swift <3.0:

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

Swift 3.0+ (testato con 5.0):

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

Per ottenere il numero di build :

Objective-C:

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

Swift <3.0:

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

Swift 3.0+ (testato fino alla 5.0):

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

Se vuoi entrambi in uno:

Prima usa le righe sopra e poi quelle seguenti.

Objective-C:

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

Swift (testato fino alla 5.0):

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

Appunti:

I valori nel bundle principale non sono sempre presenti, ad esempio in un'applicazione a riga di comando non è presente CFBundleShortVersionStringo CFBundleVersion, quindi i metodi restituiranno nile si arresterà in modo anomalo perché nel codice effettua un downcast errato. Ma nelle normali app Cocoa iOS e Mac questi valori sono definiti e non verranno eliminati.

Questo è testato con Xcode versione 7.3 (7D175) . Il numero di build è spesso scritto tra parentesi / parentesi graffe. Il numero di build è in esadecimale o decimale.

buildandversion


In Xcode è possibile incrementare automaticamente il numero di build come numero decimale inserendo quanto segue nella Run scriptfase di build nelle impostazioni del progetto

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

Per il numero di build esadecimale, utilizzare questo script

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"

Per Xcodefare quanto segue:

Passo 1

passo 1

Passo 2

passo 2

Passaggio 3

step3


4
Per aggiungere l'esempio sopra, "CFBundleVersion" è Build = 300, "CFBundleShortVersionString" è la versione = 0.41. La risposta di Viktor dovrebbe essere la risposta corretta.
justinkoh

1
Ho avuto problemi con i numeri esadecimali una volta. Apple afferma di utilizzare numeri interi: developer.apple.com/library/ios/documentation/general/Reference/…
hashier

Sai se ci sono costanti di stringa per @ "CFBundleShortVersionString" e @ "CFBundleVersion"?
igrek,

Ora che i sistemi CI / CD sono piuttosto comuni, potresti voler sottolineare le insidie ​​dell'uso degli script di build per impostare la versione # con quelli.
Sam Ballantyne,

1
Le cose sono state rinominate per Swift 3.0: è Bundle.main.object(forInfoDictionaryKey: "...")ora.
Raffaello,

13

Non è necessario modificare nulla nel progetto o nell'Xcode. Ecco la versione Swift per entrambi separatamente:

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

È incluso in questo repository, dai un'occhiata:

https://github.com/goktugyil/EZSwiftExtensions


quale risposta? non lo vedo
Esqarrouth,

C'è solo una risposta, è nel suo secondo paragrafo
Daniel Galasko,

3
Sì, 1. C'è troppo rumore e non molto segnale nella sua risposta. 2. Questo è veloce, questo è obiettivo-c. 3. Quello è dell'era
ios5

Le cose sono state rinominate per Swift 3.0: lo è Bundle.main.object(forInfoDictionaryKey: "...")ora.
Raffaello,

5

Qui lo stesso codice per Swift 3 :

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

Bundle.mainaveva un vuoto infoDictionaryper me; forse perché lo sto facendo all'interno di un framework, non di un eseguibile o di un'app? Bundle(for: MyClass.self)contiene i valori previsti.
Raffaello,

4

Visualizza a livello di codice la versione e il numero di build - 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) )"

1

Puoi anche usare 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))"
}

Quindi puoi usarlo ovunque quando dichiari a livello globale.

print(appVersion)

Produzione:

Version: #1.0 (#1.0.3)

1

Ho creato un'estensione per Bundle in modo che sia facile da usare

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")"
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.