ios - tools - xcode versions




Versione vs build in Xcode (5)

Ho un'app che ho sviluppato con Xcode 3 e di recente ho iniziato a modificare con Xcode 4. Nel riepilogo obiettivo ho il modulo di destinazione dell'applicazione iOS con campi: identificatore, versione, build, dispositivi e obiettivo di distribuzione. Il campo versione è vuoto e il campo build è 3.4.0 (che corrisponde alla versione dell'app da quando stavo ancora modificando con Xcode 3).

Le mie domande sono:

  1. Qual è la differenza tra la versione e i campi di compilazione?

  2. Perché il campo della versione era vuoto dopo l'aggiornamento a Xcode 4?


(Basta lasciare questo qui per il mio riferimento.) Questo mostrerà la versione e la build per i campi "version" e "build" che vedi in un target Xcode:

- (NSString*) version {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}

In Swift

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as? String
    let build = dictionary["CFBundleVersion"] as? String
    return "\(version) build \(build)"
}

Apple ha riorganizzato / riproposto i campi.

Andando avanti, se guardi la scheda Info per il tuo Target di applicazione, dovresti usare "Bundle versions string, short" come versione (ad es. 3.4.0) e "Bundle version" come Build (es. 500 o 1A500 ). Se non li vedi entrambi, puoi aggiungerli. Quelli si assoceranno alla versione corretta e costruiscono caselle di testo nella scheda Riepilogo; sono gli stessi valori.

Quando si visualizza la scheda Informazioni, se si fa clic con il pulsante destro del mouse e si seleziona Mostra chiavi / valori non CFBundleShortVersionString i nomi effettivi sono CFBundleShortVersionString (Versione) e CFBundleVersion (Build).

Di solito la versione viene usata come sembra che tu stia usando Xcode 3. Non sono sicuro di quale livello stai chiedendo riguardo alla differenza tra versione / build, quindi ti risponderò filosoficamente.

Ci sono tutti i tipi di schemi, ma uno popolare è:

{MajorVersion}. {MinorVersion}. {} Revisione

  • Versione principale: modifiche importanti, ridisegni e modifiche alle funzionalità
  • Versione secondaria: miglioramenti minori, aggiunte alla funzionalità
  • Revisione - Un numero di patch per correzioni di errori

Quindi la Build viene utilizzata separatamente per indicare il numero totale di build per un rilascio o per l'intera durata del prodotto.

Molti sviluppatori avviano il numero di build a 0 e ogni volta che costruiscono aumentano il numero di uno, aumentando per sempre. Nei miei progetti, ho uno script che aumenta automaticamente il numero di build ogni volta che costruisco. Vedi le istruzioni per questo di seguito.

  • La versione 1.0.0 potrebbe essere la build 542. Ci sono voluti 542 build per arrivare a una versione 1.0.0.
  • La versione 1.0.1 potrebbe essere la build 578.
  • La versione 1.1.0 potrebbe essere la build 694.
  • La versione 2.0.0 potrebbe essere la build 949.

Altri sviluppatori, tra cui Apple, hanno un numero di build composto da una versione principale + versione minore + numero di build per la versione. Questi sono i numeri di versione software effettivi, in contrasto con i valori utilizzati per il marketing.

Se vai al menu Xcode > Informazioni su Xcode , vedrai i numeri di versione e generazione. Se premi il pulsante Altre informazioni ... vedrai un sacco di versioni diverse. Poiché il pulsante Altre informazioni ... è stato rimosso in Xcode 5, queste informazioni sono anche disponibili nella sezione Software> Sviluppatore dell'app System Information , disponibile aprendo il menu Apple > Informazioni su questo Mac > Report sistema ....

Ad esempio, Xcode 4.2 (4C139). La versione 4.2 di marketing è la versione principale di Build 4, la versione di build minore C e la build numero 139. La prossima versione (presumibilmente la 4.3) sarà probabilmente la versione di build 4D, e il numero di build ricomincerà da 0 e incrementerà da lì.

I numeri di versione / creazione di iPhone Simulator sono uguali a quelli di iPhone, Mac e così via.

  • 3.2: (7W367a)
  • 4.0: (8A400)
  • 4.1: (8B117)
  • 4.2: (8C134)
  • 4.3: (8H7)

Aggiornamento : su richiesta, ecco i passaggi per creare uno script che viene eseguito ogni volta che si crea l'app in Xcode per leggere il numero di build, incrementarlo e {App}-Info.plist file {App}-Info.plist dell'app. Sono disponibili passaggi aggiuntivi facoltativi se si desidera scrivere la versione / i numeri di build nei file Settings.bundle/Root*.plist .

Questo è esteso dall'articolo di how-to here .

In Xcode 4.2 - 5.0:

  1. Carica il tuo progetto Xcode.
  2. Nel riquadro a sinistra, fai clic sul tuo progetto nella parte superiore della gerarchia. Questo caricherà l'editor delle impostazioni del progetto.
  3. Sul lato sinistro del riquadro della finestra centrale, fai clic sulla tua app sotto la voce TARGETS . Sarà necessario configurare questa configurazione per ciascun target di progetto.
  4. Seleziona la scheda Fasi di creazione .
    • In Xcode 4, in basso a destra, fai clic sul pulsante Aggiungi fase di costruzione e seleziona Aggiungi script di esecuzione .
    • In Xcode 5, selezionare il menu Editor > Aggiungi fase di creazione > Aggiungi fase di costruzione script di esecuzione .
  5. Trascina e rilascia la nuova fase Esegui script per spostarla appena prima della fase Copia risorse pacchetto (quando il file app-info.plist sarà fornito in bundle con la tua app).
  6. Nella nuova fase Esegui script , imposta Shell : /bin/bash .
  7. Copia e incolla quanto segue nell'area di script per i numeri interi di build:

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

    Come ha sottolineato @Bdebeez, è disponibile anche lo strumento di agvtool versioni generiche di Apple ( agvtool ). Se preferisci usarlo, allora ci sono un paio di cose da cambiare prima:

    • Seleziona la scheda Impostazioni di costruzione .
    • Sotto la sezione Versioning , imposta la versione corrente del progetto sul numero di build iniziale che desideri utilizzare, ad es. 1 .
    • Tornando alla scheda Fasi di costruzione , trascina e rilascia la fase Esegui script dopo la fase Copia risorse pacchetto per evitare una condizione di competizione durante il tentativo di creare e aggiornare il file di origine che include il numero di build.

    Nota che con il metodo agvtool puoi ancora ottenere periodicamente build falliti / annullati senza errori. Per questo motivo, non raccomando di usare agvtool con questo script.

    Tuttavia, nella fase Esecuzione script , è possibile utilizzare il seguente script:

    "${DEVELOPER_BIN_DIR}/agvtool" next-version -all
    

    L'argomento della next-version incrementa il numero di build (l' bump è anche un alias per la stessa cosa) e -all aggiorna Info.plist con il nuovo numero di build.

  8. E se hai un pacchetto Impostazioni in cui mostri la versione e il build, puoi aggiungere quanto segue alla fine dello script per aggiornare la versione e il build. Nota: modifica i valori di PreferenceSpecifiers in modo che corrispondano alle tue impostazioni. PreferenceSpecifiers:2 significa guardare l'elemento all'indice 2 sotto l'array PreferenceSpecifiers nel tuo file plist, quindi per un indice a 0, questa è la terza preferenza nell'array.

    productVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
    

    Se stai usando agvtool invece di leggere direttamente Info.plist , puoi aggiungere invece il seguente al tuo script:

    buildNumber=$("${DEVELOPER_BIN_DIR}/agvtool" what-version -terse)
    productVersion=$("${DEVELOPER_BIN_DIR}/agvtool" what-marketing-version -terse1)
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
    
  9. E se hai un'app universale per iPad e iPhone, puoi anche impostare le impostazioni per il file iPhone:

    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root~iphone.plist    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root~iphone.plist
    

Il numero della versione di marketing è per i clienti, chiamato numero di versione . Inizia con 1.0 e sale 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à.

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 ramo del repository. Questo numero dovrebbe essere unico per distinguere le diverse build quasi uguali.

Come puoi vedere, il numero di build non è necessario e dipende da te quale numero di build vuoi utilizzare. Quindi se aggiorni il tuo Xcode ad una versione principale, il campo di compilazione è vuoto. Il campo versione potrebbe non essere vuoto !.

Per ottenere il numero di build come variabile NSString :

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

Per ottenere il numero di versione come variabile NSString :

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

Se vuoi entrambi in una NSString :

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

Questo è testato con Xcode versione 4.6.3 (4H1503) . Il numero di build viene spesso scritto tra parentesi / parentesi. Il numero di build è in formato esadecimale o decimale.

In Xcode è possibile incrementare automaticamente il numero di build come numero decimale posizionando quanto segue nella fase di Run script 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 usa 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"


Il numero di build è un numero interno che indica lo stato corrente dell'app. Si differenzia dal numero di versione in quanto generalmente non è rivolto all'utente e non denota alcuna differenza / funzionalità / aggiornamento come in genere un numero di versione.

Pensalo in questo modo:

  • Build ( CFBundleVersion ): il numero della build. Di solito inizi da questo a 1 e aumenti di 1 con ogni build dell'app. Permette di confrontare rapidamente quale build è più recente e denota il senso di avanzamento del codice base. Questi possono essere estremamente preziosi quando si lavora con il QA e devono essere sicuri che i bug siano registrati nei build giusti.
  • Versione di marketing ( CFBundleShortVersionString ): il numero dell'utente che stai usando per indicare questa versione della tua app. Di solito questo segue uno schema di versione Major.minor (es. MyAwesomeApp 1.2) per far sapere agli utenti quali rilasci sono più piccoli aggiornamenti di manutenzione e quali sono le nuove funzionalità più importanti.

Per utilizzarlo efficacemente nei tuoi progetti, Apple fornisce un ottimo strumento chiamato agvtool . Consiglio vivamente di usarlo poiché è MOLTO più semplice rispetto a modifiche di plist di scripting. Ti consente di impostare facilmente sia il numero di build che la versione di marketing. È particolarmente utile quando si esegue lo scripting (ad esempio, è possibile aggiornare facilmente il numero di build su ogni build o anche interrogare quale sia il numero di build corrente). Può anche fare cose più esotiche come taggare il tuo SVN per te quando aggiorni il numero di build.

Per usarlo:

  • Imposta il tuo progetto in Xcode, sotto Versioning, per usare "Apple Generic".
  • Nel terminale
    • agvtool new-version 1 (imposta il numero di build su 1)
    • agvtool new-marketing-version 1.0 (impostare la versione di Marketing su 1.0)

Vedi la pagina man di agvtool per un sacco di buone informazioni


un altro modo è impostare il numero di versione in appDelegate didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application         didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     NSString * ver = [self myVersion];
     NSLog(@"version: %@",ver);

     NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
     [userDefaults setObject:ver forKey:@"version"];
     return YES;
}

- (NSString *) myVersion {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}




xcode