Sürüm ve Xcode derlemesi


660

Xcode 3 ile geliştirdiğim ve yakın zamanda Xcode 4 ile düzenlemeye başladığım bir uygulamam var. Hedef özetinde tanımlayıcı, sürüm, derleme, cihazlar ve dağıtım hedefi olan iOS uygulama hedef formum var. Sürüm alanı boş ve derleme alanı 3.4.0 (hala Xcode 3 ile düzenleme yaptığım zamanın sürümüyle eşleşiyor).

Sorularım:

  1. Sürüm ve derleme alanları arasındaki fark nedir?

  2. Xcode 4'e yükselttikten sonra sürüm alanı neden boştu?


Bir kere, Xcode Organizer arşiv listesinde görünen Build numarası olduğunu düşünüyorum. Bunun dışında, ne için kullanıldığından emin değilim.
Daniel Dickison

Yanıtlar:


1224

Apple alanları yeniden düzenledi / yeniden tasarladı.

Bundan sonra, Uygulama Hedefiniz için Bilgi sekmesine bakarsanız, Sürümünüz olarak "Paket sürümleri dizesi kısa" (ör. 3.4.0) ve Derlemeniz olarak "Paket sürümü" (ör. 500 veya 1A500) kullanmalısınız. ). İkisini de görmüyorsanız, ekleyebilirsiniz. Bunlar Özet sekmesinde uygun Sürüm ve Derleme metin kutularıyla eşlenir; aynı değerlerdir.

Bilgi sekmesini görüntülerken, sağ tıklayıp Ham Anahtarları / Değerleri Göster'i seçerseniz , gerçek adların CFBundleShortVersionString(Sürüm) ve CFBundleVersion(Oluştur) olduğunu görürsünüz .

Sürüm genellikle Xcode 3 ile nasıl göründüğünüzde kullanılır. Sürüm / Derleme farkı hakkında hangi düzeyde sorduğunuzdan emin değilim, bu yüzden felsefi olarak cevaplayacağım.

Her türlü şema vardır, ancak popüler olan şudur:

{MajorVersion}. {MinorVersion}. {Revizyon}

  • Ana sürüm - Büyük değişiklikler, yeniden tasarımlar ve işlevsellik değişiklikleri
  • Küçük sürüm - Küçük iyileştirmeler, işlevselliğe eklemeler
  • Düzeltme - Hata düzeltmeleri için yama numarası

Daha sonra Yapı, bir sürüm veya tüm ürün ömrü boyunca toplam yapı sayısını belirtmek için ayrı ayrı kullanılır.

Birçok geliştirici Yapı numarasını 0 ile başlatır ve her oluşturduklarında sayıyı birer birer artırır ve sonsuza dek artar. Projelerimde, her inşa ettiğimde otomatik olarak derleme sayısını artıran bir senaryom var. Aşağıdaki talimatlara bakınız.

  • Sürüm 1.0.0 yapı 542 olabilir. Bir 1.0.0 sürümüne ulaşmak için 542 yapı aldı.
  • 1.0.1 sürümü 578 inşa edilmiş olabilir.
  • 1.1.0 sürümü 694 derlemesi olabilir.
  • Sürüm 2.0.0, 949 derlemesi olabilir.

Apple dahil olmak üzere diğer geliştiricilerin, bir ana sürüm + küçük sürüm + sürüm için derleme sayısından oluşan bir Yapı numarası vardır. Bunlar, pazarlama için kullanılan değerlerin aksine, gerçek yazılım sürüm numaralarıdır.

Eğer giderseniz Xcode menüsü> Xcode Hakkında , sen Sürüm ve Yapı numaralarını göreceksiniz. Eğer vurursanız Fazla Bilgi ... düğmesi farklı sürümleri bir demet göreceksiniz. Yana Fazla Bilgi ... düğmesi Xcode 5'de çıkarıldı, bu bilgiler de edinilebilir Yazılım> Geliştirici bölümünde Sistem Bilgisi , app açarak mevcut Elma > menüsü Bu Mac Hakkında > ... Sistem Raporu .

Örneğin, Xcode 4.2 (4C139). Pazarlama sürümü 4.2, Derleme ana sürümü 4, Derleme küçük sürümü C ve Derleme numarası 139'dur. Bir sonraki sürümde (muhtemelen 4.3) Derleme sürümü 4D olacak ve Derleme numarası 0'dan başlayıp oradan artacaktır.

İPhone Simulator Sürüm / Derleme numaraları iPhone'lar, Mac'ler vb. İle aynıdır.

  • 3.2: (7W367a)
  • 4.0: (8A400)
  • 4.1: (8B117)
  • 4.2: (8C134)
  • 4,3: (8H7)

Güncelleme : İsteğe bağlı olarak, uygulamanızı Xcode'da derleme numarasını okumak, artırmak ve uygulamanın {App}-Info.plistdosyasına geri yazmak için her oluşturduğunuzda çalışan bir komut dosyası oluşturma adımları . Sürüm / yapı numaralarınızı Settings.bundle/Root*.plistdosyalarınıza yazmak istiyorsanız isteğe bağlı ek adımlar vardır .

Bu how-to makalesinden uzatılır burada .

Xcode 4.2 - 5.0'da:

  1. Xcode projenizi yükleyin.
  2. Soldaki bölmede, hiyerarşinin en üstündeki projenizi tıklayın. Bu, proje ayarları düzenleyicisini yükleyecektir.
  3. Orta pencere bölmesinin sol tarafında, HEDEFLER başlığı altındaki uygulamanızı tıklayın . Bu kurulumu her proje hedefi için yapılandırmanız gerekir.
  4. Derleme Aşamaları sekmesini seçin .
    • Xcode 4'te, sağ altta Yapı Aşaması Ekle düğmesini tıklayın ve Çalışma Komut Dosyası Ekle'yi seçin .
    • Xcode 5'te Editör menüsü> Derleme Safhası Ekle > Komut Dosyası Oluşturma Safhası Ekle'yi seçin .
  5. Yeni Komut Dosyası Çalıştır aşamasını, Paket Kaynaklarını Kopyala aşamasından hemen önce (app-info.plist dosyası uygulamanızla birlikte ne zaman paketlenecekse) taşımak için sürükleyip bırakın .
  6. Yeni Komut Dosyası Çalıştır aşamasında Kabuk : ayarını yapın/bin/bash .
  7. Tamsayı derleme numaraları için aşağıdakileri kopyalayıp kod alanına yapıştırın:

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

    @Bdebeez'in işaret ettiği gibi, Apple Genel Versiyonlama Aracı ( agvtool) da mevcuttur. Bunun yerine kullanmayı tercih ederseniz, önce değiştirilecek birkaç şey vardır:

    • Oluşturma Ayarları sekmesini seçin .
    • Altında Sürüm bölümünde, set Güncel Project Version Eğer kullanım istediğiniz başlangıç yapı numarası, örneğin üzere 1 .
    • Derleme Aşamaları sekmesine geri dönün, derleme numaranızı içeren kaynak dosyayı hem oluşturmaya hem de güncellemeye çalışırken bir yarış koşulundan kaçınmak için Paket Kaynaklarını Kopyala aşamasından sonra Komut Dosyası Çalıştır aşamasını sürükleyip bırakın .

    agvtoolYöntemle birlikte, düzenli olarak başarısız / iptal edilmiş yapıların hatasız olabileceğini unutmayın . Bu nedenle, agvtoolbu komut dosyası ile kullanmanızı önermiyorum .

    Bununla birlikte, Komut Dosyasını Çalıştır aşamasında aşağıdaki komut dosyasını kullanabilirsiniz:

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

    next-versionArgüman yapı numarası (artırır bumpayrıca aynı şey için bir diğer adıdır) ve -allgüncellemeler Info.plistYeni inşa numarası ile.

  8. Sürüm ve Derleme'yi görüntülediğiniz bir Ayarlar paketiniz varsa, sürümü güncellemek ve derlemek için aşağıdakileri komut dosyasının sonuna ekleyebilirsiniz. Not: PreferenceSpecifiersDeğerleri ayarlarınıza uyacak şekilde değiştirin . PreferenceSpecifiers:2anlamına gelir PreferenceSpecifiersplist dosyanızdaki dizinin altındaki dizin 2'deki öğeye bakın , bu nedenle 0 tabanlı bir dizin için dizideki 3. tercih ayarıdır.

    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

    Doğrudan agvtoolokumak yerine kullanıyorsanız Info.plistbetiğinize aşağıdakileri ekleyebilirsiniz:

    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. İPad ve iPhone için evrensel bir uygulamanız varsa, iPhone dosyasının ayarlarını da yapabilirsiniz:

    /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

17
"Projelerimde, her inşa ettiğimde otomatik olarak yapı numarasını artıran bir senaryom var" - bunu nasıl yapabileceğinizi paylaşabilir misiniz? detaylar ve orijinal soru için teşekkürler.
Zsolt

2
@Andrews - Cevabımı yapı komut dosyasındaki ayrıntılarla güncelledim.
nekno

9
Onaltılık sayıları artırmak için kullanabilirsinizbuildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") dec=$((0x$buildNumber)) buildNumber=$(($dec + 1)) hex=$(printf "%X" $buildNumber) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $hex" "$INFOPLIST_FILE"
Alon Amir

8
Kısacası: AppStore'da HEX'e izin verilmiyor.
Nicolas Miari

3
(Xcode 5 kullanıcıları) Aşağıdakileri okumak için 5. adımı değiştirmeniz gerekebilir: "Menü Çubuğu'ndan Düzenleyici -> Derleme Aşaması Ekle -> Komut Dosyası Çalıştırma Komut
Dizisi

72

(Bunu kendi referansım için burada bırakarak.) Bu, Xcode hedefinde gördüğünüz "sürüm" ve "derleme" alanları için sürümü gösterecek ve oluşturacaktır:

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

Swift'te

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

2
OT: Metodunuzda bir sızıntı var - siz alloc/ initstring, ipi koruyor, ama serbest bırakmıyorsunuz. Bir yöntemden döndürdüğünüz bir nesnede, dizenin otomatik olarak otomatik olarak yayınlanması veya çağrılması için genellikle bir kolaylık yöntemi kullanmalısınız autorelease. İkisinden biri: return [NSString stringWithFormat:@"%@ build %@", version, build]; OR return [[[NSString alloc] initWithFormat:@"%@ build %@", version, build] autorelease];
nekno

1
Teşekkürler @nekno, cevap değiştirildi, bu yüzden ARC veya ARC dostu değil.
Dan Rosenstark

2
Yazım hatalarını önlemek için sabitleri (örneğin, kCFBundleVersionKey) kullanmak daha iyi olabilir. Yine de, "CFBundleShortVersionString" için bir tane bulamadım :)
DannyA

Hızlı kodda bir hata var - CFBundleShortVersionString'i iki kez çağırıyorsunuz
Yariv Nissim

Teşekkürler @ yar1vn, düzelttim ve HAYIR geriye değil.
Dan Rosenstark

53

Derleme numarası, uygulamanın geçerli durumunu gösteren dahili bir numaradır. Sürüm numarası, tipik olarak kullanıcının karşılaşmadığı için farklıdır ve genellikle sürüm numarası gibi herhangi bir fark / özellik / yükseltmeyi belirtmez.

Şöyle düşünün:

  • Build ( CFBundleVersion): Derlemenin sayısı. Genellikle buna 1'den başlar ve uygulamanın her yapısıyla 1 artarsınız. Hızlı bir şekilde hangi yapının daha yeni olduğu karşılaştırmalarına izin verir ve kod tabanının ilerleme hissini gösterir. Bunlar, KG ile çalışırken ve hataların doğru yapılara karşı günlüğe kaydedildiğinden emin olmak gerektiğinde çok değerli olabilir.
  • Pazarlama Sürümü ( CFBundleShortVersionString): Uygulamanızın bu sürümünü belirtmek için kullandığınız kullanıcıya dönük numara. Genellikle bu, kullanıcıların hangi sürümlerin daha küçük bakım güncellemeleri ve hangilerinin büyük yeni özellikler olduğunu bildirmek için bir Major.minor sürüm şemasını (örn. MyAwesomeApp 1.2) izler.

Bunu projelerinizde etkili bir şekilde kullanmak için Apple adlı harika bir araç sunuyor agvtool. Çok plist değişiklikleri komut dosyası daha çok daha basit olduğu için bu kullanmanızı tavsiye ederim. Hem yapı numarasını hem de pazarlama sürümünü kolayca ayarlamanıza olanak tanır. Komut dosyası oluştururken özellikle yararlıdır (örneğin, her derleme üzerindeki derleme numarasını kolayca güncelleştirmek veya hatta geçerli derleme numarasının ne olduğunu sorgulamak). Yapı numarasını güncellediğinizde SVN'nizi etiketlemek gibi daha egzotik şeyler bile yapabilir.

Kullanmak için:

  • Projenizi Xcode'da Sürümlendirme altında "Apple Generic" i kullanmak için ayarlayın.
  • Terminalde
    • agvtool new-version 1 (Derleme numarasını 1 olarak ayarlayın)
    • agvtool new-marketing-version 1.0 (Pazarlama sürümünü 1.0 olarak ayarlayın)

agvtoolBir ton iyi bilgi için man sayfasına bakınız.



25

Yapı numarası bir kayan nokta değeri ise yukarıdaki cevapta yapı numarasını otomatik olarak birleştiren komut dosyası benim için çalışmadı, bu yüzden biraz değiştirdim:

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

21

Pazarlama sürüm numarası, sürüm numarası adı verilen müşteriler içindir . 1.0 ile başlar ve 2.0 , 3.0'a yapılan büyük güncellemeler , 1.1 , 1.2'ye yapılan küçük güncellemeler ve 1.0.1 , 1.0.2'ye yapılan hata düzeltmeleri için yükselir . Bu sayı sürümlere ve yeni özelliklere yöneliktir.

Yapı numarası çoğunlukla inşa dahili numarası o zamana kadar yapılmıştır. Ancak bazılarında deponun şube numarası gibi başka sayılar kullanılır. Bu sayı, hemen hemen aynı yapıları ayırt etmek için benzersiz olmalıdır .

Gördüğünüz gibi, yapı numarası gerekli değildir ve hangi yapı numarasını kullanmak istediğiniz size bağlıdır. Eğer Xcodebüyük bir sürüme güncellerseniz , yapı alanı boştur. Versiyon alan boş olmayabilir !.


Yapı numarasını NSStringdeğişken olarak almak için :

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

Sürüm numarasını NSStringdeğişken olarak almak için :

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

İkisini de bir arada istiyorsanız NSString:

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

Bu, Xcode Sürüm 4.6.3 (4H1503) ile test edilmiştir . Derleme numarası genellikle parantez / parantez içinde yazılır. Derleme numarası onaltılı veya ondalıktır.

buildandversion


In Xcode Otomatik artımlı olarak yazabilir yapı numarasını bir şekilde ondalık sayı halinde aşağıdaki yerleştirerek Run scriptproje ayarlarında yapım aşamasından

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

İçin onaltılık yapı numarası Bu komut dosyasını kullanmak

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"

proje ayarları


6

Harika cevaplar için @nekno ve @ ale84'e teşekkürler.

Ancak, @ ale84'ün komut dosyasını, kayan nokta için sayıları arttırmak için biraz değiştirdim.

incl değeri kayan biçim gereksinimlerinize göre değiştirilebilir. Örneğin: eğer dahil = .01 ise, çıktı biçimi ... 1.19, 1.20, 1.21 ... olacaktır.

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
incl=.01
buildNumber=`echo $buildNumber + $incl|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

1

Başka bir yol da sürüm numarasını şu şekilde ayarlamaktır 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];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.