Xcodeでのバージョンとビルド


660

Xcode 3で開発し、最近Xcode 4で編集を開始したアプリがあります。ターゲットの概要には、iOSアプリケーションターゲットフォームのフィールド(識別子、バージョン、ビルド、デバイス、デプロイメントターゲット)があります。バージョンフィールドは空白で、ビルドフィールドは3.4.0です(これは、まだXcode 3で編集していたときのアプリのバージョンと一致しています)。

私の質問は:

  1. バージョンフィールドとビルドフィールドの違いは何ですか?

  2. Xcode 4にアップグレードした後、バージョンフィールドが空白になったのはなぜですか?


1つには、Xcodeオーガナイザーのアーカイブリストに表示されるのはビルド番号だと思います。それ以外は、それが何に使われるのかわかりません。
ダニエルディキソン

回答:


1224

Appleはフィールドを並べ替え/転用した。

今後、アプリケーションターゲットの[情報]タブを確認する場合は、バージョンとして「バンドルバージョン文字列、短い」(例:3.4.0)、ビルドとして「バンドルバージョン」(例:500または1A500)を使用する必要があります)。両方が表示されない場合は、追加できます。これらは、[概要]タブの適切なバージョンとビルドのテキストボックスにマッピングされます。それらは同じ値です。

[情報]タブを表示しているときに、右クリックして[ 未加工のキー/値を表示 ]を選択すると、実際の名前はCFBundleShortVersionString(バージョン)とCFBundleVersion(ビルド)になります。

バージョンは通常、Xcode 3で使用していたように見えますが、バージョン/ビルドの違いについてどのレベルを求めているのかわからないので、哲学的に回答します。

あらゆる種類のスキームがありますが、人気のあるスキームは次のとおりです。

{MajorVersion}。{MinorVersion}。{Revision}

  • メジャーバージョン -主要な変更、再設計、機能の変更
  • マイナーバージョン -マイナーな改善、機能の追加
  • リビジョン -バグ修正のパッチ番号

次に、ビルドは個別に使用され、リリースまたは製品ライフタイム全体のビルドの総数を示します。

多くの開発者はビルド番号を0から開始し、ビルドするたびに番号を1つ増やし、永久に増やします。私のプロジェクトでは、ビルドするたびにビルド番号を自動的に増やすスクリプトがあります。以下の手順を参照してください。

  • リリース1.0.0はビルド542の可能性があります。1.0.0リリースに到達するには542のビルドが必要でした。
  • リリース1.0.1はビルド578になる可能性があります。
  • リリース1.1.0はビルド694である可能性があります。
  • リリース2.0.0はビルド949の可能性があります。

Appleを含む他の開発者は、メジャーバージョン+マイナーバージョン+リリースのビルド数で構成されるビルド番号を持っています。これらは、マーケティングに使用される値とは対照的に、実際のソフトウェアバージョン番号です。

Xcodeメニュー> Xcodeについてに移動すると、バージョン番号とビルド番号が表示されます。あなたがヒットした場合詳細... ]ボタンを使用するには、異なるバージョンの束が表示されます。以来詳細...ボタンをXcodeの5で除去して、この情報には、から入手可能であるソフトウェア>開発のセクションシステム情報開くことで利用できるアプリ、アップルメニュー> このMacについて > ...システムレポートを

たとえば、Xcode 4.2(4C139)。マーケティングバージョン4.2はビルドメジャーバージョン4、ビルドマイナーバージョンC、ビルド番号139です。次のリリース(おそらく4.3)はビルドリリース4Dであり、ビルド番号は0から始まり、そこから増加します。

iPhoneシミュレータのバージョン/ビルド番号は、iPhone、Macなどと同じです。

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

更新:リクエストに応じて、Xcodeでアプリをビルドするたびに実行されるスクリプトを作成して、ビルド番号を読み取り、インクリメントして、アプリの{App}-Info.plistファイルに書き戻す手順を次に示します。Settings.bundle/Root*.plistファイルにバージョン/ビルド番号を書き込む場合は、オプションの追加手順があります。

これは、こちらのハウツー記事から拡張されています

Xcode 4.2-5.0の場合:

  1. Xcodeプロジェクトをロードします。
  2. 左側のペインで、階層の最上部にあるプロジェクトをクリックします。プロジェクト設定エディターが読み込まれます。
  3. 中央のウィンドウペインの左側で、[ TARGETS]見出しの下のアプリをクリックします。プロジェクトのターゲットごとにこの設定を構成する必要があります。
  4. [ ビルドフェーズ ]タブを選択します。
    • Xcode 4では、右下の[ ビルドフェーズ追加 ]ボタンをクリックし、[ 実行スクリプトの追加 ]を選択します。
    • Xcodeの5では、選択エディタのメニューを> ビルドフェーズを追加 > [スクリプトの実行ビルドフェーズを追加します
  5. 新しいスクリプト実行フェーズをドラッグアンドドロップして、バンドルリソースコピーフェーズ(app-info.plistファイルがアプリにバンドルされるとき)の直前に移動します。
  6. 新しいスクリプトの実行フェーズで、Shellを設定します/bin/bash
  7. 以下をコピーして、整数ビルド番号のスクリプト領域に貼り付けます。

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

    @Bdebeezが指摘したように、Apple Generic Versioning Toolagvtool)も利用できます。代わりに使用する場合は、最初に変更する点がいくつかあります。

    • [ ビルド設定 ]タブを選択します。
    • [ バージョン管理]セクションで、[ 現在のプロジェクトバージョン]を、使用する最初のビルド番号(1など)に設定します。
    • [ ビルドフェーズ ]タブに戻り、[ バンドルリソースコピー]フェーズの後に[ スクリプトの実行 ] フェーズをドラッグアンドドロップして、ビルドとビルド番号を含むソースファイルの両方を更新しようとするときの競合状態を回避します。

    このagvtoolメソッドを使用しても、エラーなしで定期的に失敗/キャンセルされたビルドを取得できることに注意してください。このため、agvtoolこのスクリプトでの使用はお勧めしません。

    それでも、スクリプトの実行フェーズでは、次のスクリプトを使用できます。

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

    next-version引数には、ビルド番号は(インクリメントbumpも同じことの別名である)、および-all更新のInfo.plist新しいビルド番号を持ちます。

  8. また、バージョンとビルドを表示する設定バンドルがある場合は、スクリプトの最後に以下を追加して、バージョンとビルドを更新できます。注:PreferenceSpecifiers設定に合わせて値を変更します。PreferenceSpecifiers:2PreferenceSpecifiers、plistファイルの配列の下にあるインデックス2の項目を参照することを意味します。0ベースのインデックスの場合、これは配列の3番目の設定です。

    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

    直接agvtool読み取る代わりにを使用している場合は、代わりにInfo.plist次のコードをスクリプトに追加できます。

    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. また、iPadとiPhone向けのユニバーサルアプリがある場合は、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

17
「私のプロジェクトでは、ビルドするたびにビルド番号を自動的に増やすスクリプトがあります」-どのようにそれを行うのか共有できますか?詳細な回答と元の質問に感謝します。
Zsolt、2011年

2
@Andrews-ビルドスクリプトの詳細で回答を更新しました。
nekno

9
使用できる16進数でインクリメントするにはbuildNumber=$(/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
つまり、HEXはAppStoreでは許可されていません。
Nicolas Miari

3
(Xcode 5のユーザー)手順5を変更して、「メニューバーから、エディター->ビルドフェーズの追加->実行スクリプトビルドフェーズの追加」を選択する必要がある場合があります
Greg M. Krsak

72

(これは私の参照用にここに残します。)これにより、Xcodeターゲットに表示される「バージョン」フィールドと「ビルド」フィールドのバージョンとビルドが表示されます。

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

スウィフトで

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:メソッドにリークがあります-あなたalloc/ init文字列は文字列を保持しますが、解放していません。メソッドから返されるオブジェクトでは、通常、文字列が自動的に自動解放されるように便利なメソッドを使用するか、を呼び出しますautorelease。いずれか: return [NSString stringWithFormat:@"%@ build %@", version, build]; または return [[[NSString alloc] initWithFormat:@"%@ build %@", version, build] autorelease];
nekno

1
@neknoに感謝します。回答がARCまたはARCに対応しないよう変更されました
Dan Rosenstark、2011

2
タイプミスを避けるために、可能であれば定数(kCFBundleVersionKeyなど)を使用する方が良いでしょう。しかし、「CFBundleShortVersionString」の1つを見つけることができませんでした:)
DannyA '20

Swiftコードにバグがあります-CFBundleShortVersionStringを2回呼び出しています
Yariv Nissim

@ yar1vnに感謝します。修正しました。
Dan Rosenstark、2015

53

ビルド番号は、アプリの現在の状態を示す内部番号です。これはバージョン番号とは異なり、通常はユーザー向けではなく、バージョン番号のような違い/機能/アップグレードはありません。

次のように考えてください。

  • ビルド(CFBundleVersion):ビルドの番号。通常、これは1から始まり、アプリのビルドごとに1ずつ増加します。どのビルドがより新しいかをすばやく比較でき、コードベースの進捗状況を示します。これらは、QAを使用していて、適切なビルドに対してバグがログに記録されていることを確認する必要がある場合に、非常に価値があります。
  • マーケティングバージョン(CFBundleShortVersionString):このバージョンのアプリを示すために使用しているユーザー向けの番号。通常、これはMajor.minorバージョンスキーム(MyAwesomeApp 1.2など)に従って、どのリリースがより小さなメンテナンスアップデートで、どのリリースが大きな新機能であるかをユーザーに通知します。

これをプロジェクトで効果的に使用するために、Appleはと呼ばれる優れたツールを提供していますagvtoolこれは、plistの変更をスクリプト化するよりもはるかに簡単なので、使用することを強くお勧めします。 ビルド番号とマーケティングバージョンの両方を簡単に設定できます。これは、スクリプト作成時に特に役立ちます(たとえば、各ビルドのビルド番号を簡単に更新したり、現在のビルド番号を問い合わせたりすることもできます)。ビルド番号を更新すると、SVNにタグを付けるなど、よりエキゾチックなこともできます。

それを使用するには:

  • 「Apple Generic」を使用するように、バージョン管理の下のXcodeでプロジェクトを設定します。
  • ターミナルで
    • agvtool new-version 1 (ビルド番号を1に設定)
    • agvtool new-marketing-version 1.0 (マーケティングバージョンを1.0に設定)

agvtool大量の情報については、のmanページを参照してください



25

上記の回答でビルド番号を自動インクリメントするスクリプトは、ビルド番号が浮動小数点値の場合は機能しなかったため、少し変更しました。

#!/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

マーケティングリリース番号は、バージョン番号と呼ばれるお客様向けです。それはで始まる1.0とする主要な情報を得るために行く2.03.0、マイナーアップデートのために1.11.2とのバグ修正のための1.0.11.0.2。この数は、リリースと新機能を対象としています。

ビルド番号は、ほとんどがあるのビルドの内部番号それまで行われていること。ただし、リポジトリのブランチ番号など、他の番号を使用するものもあります。この番号は、ほぼ同じビルドを区別するために一意である必要があります。

ご覧のとおり、ビルド番号は不要で、どのビルド番号を使用するかはあなた次第です。したがってXcode、メジャーバージョンに更新した場合、ビルドフィールドは空になります。バージョンフィールドは空ではないかもしれません!


ビルド番号をNSString変数として取得するには:

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

バージョン番号をNSString変数として取得するには:

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

両方を1 つにしたい場合NSString

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

これはXcodeバージョン4.6.3(4H1503)でテストされています。ビルド番号は、括弧/中括弧で書かれることがよくあります。ビルド番号は16進数または10進数です。

buildandversion


ではXcodeのあなたは、自動インクリメントすることができますビルド番号として小数点数をで次のように配置することでRun script、プロジェクトの設定でビルドフェーズ

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

16進数のビルド番号については、このスクリプトを使用します

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"

project_settings


6

素晴らしい回答をありがとう@neknoと@ ale84。

ただし、浮動小数点のビルド番号を増やすために、@ ale84のスクリプトを少し変更しました。

inclの値は、フローティングフォーマットの要件に応じて変更できます。例:incl = .01の場合、出力形式は... 1.19、1.20、1.21 ...

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

もう1つの方法は、バージョン番号を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];
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.