CFBundleVersion ve CFBundleShortVersionString için hangi değerleri kullanmalıyım?


100

Bu benim ilk iOS uygulaması gönderimim ve uygulamamın reddedilmesini istemiyorum.

Bu, Apple Dokümanlar'dan:

CFBundleVersion (String - iOS, OS X), paketin bir yinelemesini (yayımlanmış veya yayımlanmamış) tanımlayan paketin derleme sürüm numarasını belirtir. Derleme sürüm numarası, ilk tamsayı sıfırdan büyük olan üç negatif olmayan, noktayla ayrılmış tamsayıdan oluşan bir dize olmalıdır. Dize yalnızca sayısal (0-9) ve nokta (.) Karakterleri içermelidir. Baştaki sıfırlar her tam sayıdan kesilir ve yok sayılır (yani 1.02.3, 1.2.3'e eşdeğerdir). Bu anahtar yerelleştirilemez.

CFBundleShortVersionString (String - iOS, OS X), uygulamanın yayımlanan bir yinelemesini tanımlayan paketin yayın sürüm numarasını belirtir. Yayın sürüm numarası, noktayla ayrılmış üç tam sayıdan oluşan bir dizedir. İlk tam sayı, yeni özellikler veya büyük değişiklikler uygulayan revizyonlar gibi uygulamada yapılan önemli revizyonları temsil eder. İkinci tam sayı, daha az belirgin özellikleri uygulayan revizyonları gösterir. Üçüncü tam sayı, bakım sürümlerini temsil eder.

Bu anahtarın değeri, uygulamanın bir yinelemesini (yayımlanan veya yayınlanmayan) tanımlayan "CFBundleVersion" değerinden farklıdır. Bu anahtar, InfoPlist.strings dosyalarınıza dahil edilerek yerelleştirilebilir.

Ama biraz tuhaf görünüyor. Bunun için yorumum, her iki değeri de aynı koymaktır, yani:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

Birisi benim koymam gereken şeyin% 100 olduğunu onaylayabilir mi?


1
Buna göre CFBundleShortVersionString yerelleştirilebilir. Ancak noktalarla ayrılmış üç tam sayı olması gerekiyorsa, hangi yerelleştirme mümkündür?
Rick

@Rick Sanırım bu, Arapça gibi farklı sayılara sahip dillere dönüştürebileceğiniz anlamına mı geliyor?
shiser

@shiser Bilgiçlik taslamak için, "arap rakamları" aslında batı dünyasında ve diğer birçok yerde kullandığımız rakamlardır. Ama ne demek istediğini anlıyorum ve Arap dünyasının "Arap rakamları" kullanmayan bazı kısımları var. en.wikipedia.org/wiki/Arabic_numerals
RenniePet

1
Burada başka bir cevap var. stackoverflow.com/q/21125159/419348
AechoLiu

Yanıtlar:


79

Şöyle düşünün: "Kısa versiyon" ( CFBundleShortVersionString) genel versiyon numarasıdır. "Sürüm" ( CFBundleVersion), genel "kısa sürümden" çok daha sık değişebilen dahili bir sürüm numarasıdır. Şahsen ben her ikisi için de aynısını kullanıyorum, ancak birçok kişi her yapıda "sürümü" güncelliyor. Her iki şekilde de Apple'a yayınladığınızda "kısa sürümü" güncellersiniz. "Sürümü" ne sıklıkla güncelleyeceğiniz size ve ihtiyaçlarınıza bağlıdır.


14
Paket sürümünün (CFBundleVersion) önceki uygulamanızın paket sürümünü sayısal olarak aşması gerektiğini veya App Store'a gönderirken bir hata alacağını unutmayın. Bkz stackoverflow.com/questions/4933093/... .
Phil

3
Phil'in yukarıda söylediğine benzer şekilde, bugünlerde, başarısız bir (App Store tarafından onaylanmayan) bir derlemeyi yeniden gönderirseniz , şimdi her gönderimde CFBundleVersion'ı çarpmanız gerekiyor gibi görünüyor , bu nedenle bu sayılar her zaman mükemmel olmadığınız sürece büyük olasılıkla farklı olacaktır. veya App Store'a başarılı bir şekilde gönderim için gerekli herhangi bir değişikliğin ardından genel (CFBundleShortVersionString) sürümünüzü # çarpmaktan çekinmezsiniz.
likethesky

107

CFBundleShortVersionString size uygulamanızın sürümünü verir . Genellikle, uygulamanızı App Store'da her yayınladığınızda artar. Bu, uygulamanızın App Store sayfasının "Sürüm" bölümünde görünen sürümdür.

CFBundleVersion size geliştirme ve test için, yani "teknik" amaçlarla kullanılan yapı numarasını verir . Son kullanıcı nadiren yapı numarasıyla ilgilenir, ancak geliştirme sırasında her yapıda neyin geliştirildiğini ve düzeltildiğini bilmeniz gerekebilir. Bu, genellikle dahili sürümün her yinelemesinde artırılır. Ayrıca, her derlemede derleme numarasını otomatik olarak artırmak için Jenkins gibi sürekli entegrasyon araçlarını kullanabilirsiniz.

Sürüm ve Yapı numaraları

İki sayı birbirine bağlı değildir, ancak karışıklığı önlemek için bunları paralel tutmak iyi bir fikirdir. Uygulamanız App Store incelemesini geçtikten sonra Phil ve LikeTheSky gibi uygulama numarasını yayınlasanız da yayınlamasanız da artırmanız gerektiğini unutmayın.

Kullanım örneği: Diyelim ki, teslim edilmeye hazır, iyi test edilmiş bir yapınız var. Sürüm numarası 1.0.0 ve yapı numarası 1.0.0.32'dir . Uygulamanızı gönderdikten sonra, sürümü 1.0.1 olarak güncellemeniz ve derleme numarasını 1.0.1.0 olarak güncellemeniz gerekir .


4
Öyleyse, belgelerde CFBundleVersion'ın " üç " noktayla ayrılmış değerler olduğu hakkındaki biti (soruda alıntılanan) göz ardı etmek güvenli midir?
big_m

Sanırım size kalmış. Bir sürümü sık sık yayınlamıyorsanız veya sık sık test döngüleri boyunca hata düzeltmelerini sıkı bir şekilde takip etmeniz gerekmiyorsa; her ikisi için de 3 hane kullanabilirsiniz.
Yunus Nedim Mehel

bir uygulama mağazası derlemesi için CFBundleVersion 0 olabilir mi? Apple bunu reddedecek mi?
kraftydevil

3
Evet, noktalama işaretiyle 3 sayı dışında değerler kullanabilirsiniz. 201606070620Gönderim iOS uygulamasında olduğu gibi bir tarih-saat değeri kullandım .
Basil Bourque

3
@ BasilBourque, yönergelere uymazsanız, uygulama içi satın alımlar kullanırsanız bir sorunla karşılaşabilirsiniz. Teknik Not
2413'e

16

Rmaddy tarafından cevap doğrudur. İki düşünce daha ekleyeceğim.

Üçüncü Sürüm Numarası

İTunesConnect web sitesinde uygulamanızın tanımının bir parçası olarak belirtilen üçüncü sürüm numarasına dikkat edin. Bu sayı Xcode'daki ikiden farklıysa, Apple size bir uyarı verir. Bu bir gösteri durdurucu olmadığı için (bir "hata" değil) uyarıyı göz ardı edebilirsiniz.

Sürüm olarak Tarih-Saat

Ayrıca noktalama işaretli üç sayı kullanmanıza gerek yoktur. Bu, ilk sayıdaki geleneksel değişikliklerin genellikle uyumluluğu etkileyen bir tür dramatik değişikliği gösterdiği bazı uygulamalar için anlamlı olabilir.

Diğer uygulamalar için, yalnızca ISO 8601 standart biçim stilinde (YYYYAAGGSHMM) bir tarih-saat değeri kullanmak isteyebilirsiniz . Örneğin 201606070620,. Yıl-ay-tarih-saat-dakika sıralaması, alfabetik olarak sıralandığında da kronolojik olan, sıfır dolgusu nedeniyle her zaman aynı uzunlukta, sürekli artan bir sayı oluşturur.

İOS 7, 8 ve 9'da çalışan bir nakliye iOS uygulamasında bu tarzdaki sürüm numaralarını başarıyla kullandım.

Hatta bu değerin üretilmesini otomatikleştirebilirsiniz. Projenizin olarak Target> Build Phases> Run Scriptpanele:

  1. ShellAlanda belirtin :/bin/sh
  2. Aşağıda görülen 5 satırlık komut dosyasını yapıştırın.
  3. (isteğe bağlı) Show environment variables in build logOnay kutusunu işaretleyin.
  4. Run script only when installingOnay kutusunun işaretini kaldırın .

Her derleme yaptığınızda, UTC zaman diliminde geçerli tarih-saat yakalanır. -uKomut bayrak yerine varsayılan mevcut saat diliminden daha UTC yararlanır. Programcılar ve sistem yöneticilerinin yerel saat dilimleri yerine UTC'yi kullanması ve düşünmesi genellikle en iyisidir.

#!/bin/bash
buildNumber=$(date -u "+%Y%m%d%H%M")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildNumber" "$INFOPLIST_FILE"  # Version number
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"  # Build number
echo "DateTime for app version number: $buildNumber"

Veya 1.2.3Sürüm numarası için geleneksel bir ve Yapı numarası olarak bir tarih-saat ile bir karma yapın . Melez yapmak için, önündeki CFBundleShortVersionStringçizgiyi basitçe yorumlayın #.


9

Benim için en mantıklı şema CFBundleShortVersionString, gerçek sürüm numarası için sürüm numarasını (yani ) kullanmak ve ardından CFBundleVersionApp Store'a gönderimi temsil etmek için yapı numarasını (yani ) kullanmaktır. Dolayısıyla, herhangi bir sorun olmadığı ve dolayısıyla yeniden gönderilmediği sürece, bu sayı her zaman 1'dir. Yeni bir sürüm için, önceki sürümde TestFlight testinde veya incelemede sorunlar varsa 1'e sıfırlarım.

Derleme numaraları, belirli bir sürüm için sağladığınız gönderilerin her birini adlandırmanın bir yolunu sağlar. Yukarıdaki tanımlarda açıklandığı gibi, uygulamanızın belirli bir sürümü için sağladığınız tüm yapıların koleksiyonuna bu sürümün 'yayın treni' denir. İOS uygulamaları için, derleme numaraları her sürüm dizisinde benzersiz olmalıdır, ancak farklı sürüm dizileri arasında benzersiz olmaları gerekmez [vurgu]. Diğer bir deyişle, iOS Uygulamaları için, isterseniz aynı yapı numaralarını farklı sürüm trenlerinde tekrar kullanabilirsiniz.

Gönderen Sürüm Numaraları ve Yapı Numaraları: Teknik Not TN2420 .


1
Bu sayfadaki diğer cevaplarda sunulan yorumları onaylayan resmi bir referans sağlayan bir cevabı görmek güzel.
user2067021

6

Kullandığım CFBundleVersion iç yapı belirtmek için CFBundleShortVersionString . Test kullanıcılarına derleme göndermek için test uçuşunu kullanıyorum, bu nedenle aralarındaki fark son derece yararlı oldu.

Elma belgeler CFBundleVersion "oluşan bir dizi olmalıdır diyor 3 negatif olmayan, noktayla ayrılan tamsayılar" Ama aslında olabilir FAZLA (yukarıdaki cevap gösterildiği gibi) 3 parça. Bunu geliştirme yapımı belirtmek için kullanıyorum, benim CFBundleShortVersionString'in 1.0.0 olduğunu varsayalım, 1.0.0.11 sürümü 1.0.0 için 11. sürümüm olduğunu belirtmek için CFBundleVersion için 1.0.0.11 kullanabilirim

Uygulama mağazasına gönderilen her CFBundleVersion öncekinden daha büyük olmalıdır, aksi takdirde HATA ITMS-90478 alırsınız : "Geçersiz Sürüm. Yeni derleme gönderimleri için daha sonraki bir sürüm kapatıldığı için" xxx "sürümüne sahip derleme içe aktarılamaz. Seçin farklı bir sürüm numarası. "

CFBundleShortVersionString yalnızca 3 parçaya sahip olabilir veya HATA ITMS-90060 alırsınız: Info.plist dosyasındaki anahtar CFBundleShortVersionString 'xxx' değeri, en fazla üç negatif olmayan tamsayıdan oluşan noktayla ayrılmış bir liste olmalıdır . "

3 numara yani üzerinde sürüm numarası gösterileri Basil Bourque bahsettiği, iTunesConnect şeyler karışmaya nerelerde olduğunu.

CFBundleShortVersionString'den farklı bir iTunesConnect numarası kullanıyorum çünkü uygulamamı uygulama mağazasına ilk gönderdiğimde zaten çok sayıda dahili sürümümüz var. Bu yüzden iTunesConnect numarası için 1.0 ve CFBundleShortVersionString için 5.x kullandım. Uygulama mağazasının bir sonraki sürümünde, uygulama mağazasında daha yeni bir sürüm olup olmadığını kontrol etmek için bir işlev sağladım ve şimdi sorun yaşadığımı fark ettim çünkü yalnızca iTunesConnect numarasını (kullanarak http://itunes.apple.com/lookup?bundleId=) alabiliyorum, bu yüzden karşılaştırmadan önce biraz hesaplama yapmam gerekiyor CFBundleShortVersionString numarası ile.

Bunu, CFBundleShortVersionString olarak iTunesConnect numarasını kullanarak düzeltmeye çalıştım, ancak şu hatayı aldım, ERROR ITMS-90062 : "Bu paket geçersiz. Info.plist dosyasındaki CFBundleShortVersionString [xxx] anahtarının değeri bundan daha yüksek bir sürüm içermelidir önceden onaylanmış sürümün [xxx]. "

Bu yüzden her zaman aynı şekilde yapılmasını önereceğim.


5

Hiçbir yerde tartıştığımı hiç görmediğim bir şey, bir CFBundleVersion'daki her alan için maksimum sayı nedir?

Bir uygulamada CFBundleVersion'ı 1.1.1'e ayarlayarak ve "lsregister -dump" içindeki sürüm için onaltılık değere bakarak, ilk alan için maksimum değerin (2 ^ 22) -1 veya 4194303 ve maksimum değer olduğunu belirledim ikinci ve üçüncü alanlar için değerler (2 ^ 21) -1 veya 2097151'dir.

3 alanın toplamı 64 bittir.

Bunun, tarih ve saate dayalı olarak CFBundleVersion kullananlarımız için etkileri vardır.

İlk alanı YYYYAAGG olarak ayarlıyordum. Bu, her zaman izin verilen maksimum sürümden daha büyüktür ve en azından Başlatma Hizmetleri, birden çok sürüm yüklediğinizde ve 'açık -a Uygulama adı komut satırından.

Lütfen bunu geniş çapta yayın. Eminim pek çok insan bununla başa çıkacaktır.


Dördüncü bir alan eklenirse (1.1.1.20191201) ne yapıldığını ve bunun yerine ne kullandığınızı hatırlıyor musunuz? Gerçekten Apple'ın android'in burada yaptığı aynı sayısal değeri kullanmasını diliyorum. PS, bunu aradığınız için teşekkürler!
spaceuitdiver

Kısıtlamanın burada belgelendiğine ve burada bahsedilenden biraz daha kısıtlayıcı olduğuna inanıyorum .
saagarjha

3

Şu an itibariyle, eyaletler için Apple belgeleriCFBundleVersion [vurgu benim]:

Paketin yinelemesini tanımlayan derleme sürümü.

...

Bu anahtar, 10.14.1 gibi bir ila üç noktayla ayrılmış tamsayıdan oluşan, makine tarafından okunabilir bir dizedir . Dize yalnızca sayısal karakterler (0-9) ve nokta içerebilir.

...

Daha fazla tamsayı ekleyebilirsiniz ancak sistem bunları yok sayar.

İçin CFBundleShortVersionString[vurgu madeni]:

Paketin yayın veya sürüm numarası.

...

Bu anahtar, paket sürümü için kullanıcı tarafından görülebilen bir dizedir . Gerekli biçim, 10.14.1 gibi noktayla ayrılmış üç tam sayıdır. Dize yalnızca sayısal karakterler (0-9) ve nokta içerebilir.

CFBundleVersionHer derleme (veya TestFlight'a yapılan her sürüm) için otomatik olarak artırmanızı ve her değiştirdiğinizde 0'a sıfırlamanızı öneririm CFBundleShortVersionString.

İçinde kullanıcının gördüğü sürümü güncellemek için açık bir şekilde planlamalı veya tutarlı bir yöntem geliştirmelisiniz CFBundleShortVersionString.

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.