CFBundleVersionおよびCFBundleShortVersionStringにはどの値を使用すればよいですか?


98

これは私の最初のiOSアプリの提出であり、私のアプリを拒否したくありません。

これはApple Docsによるものです。

CFBundleVersion(文字列-iOS、OS X)は、バンドルのビルドバージョン番号を指定します。これは、バンドルの反復(リリース済みまたは未リリース)を識別します。ビルドバージョン番号は、ピリオドで区切られた3つの非負の整数で構成される文字列で、最初の整数はゼロより大きい必要があります。文字列には、数字(0-9)とピリオド(。)のみを含める必要があります。先頭のゼロは各整数から切り捨てられ、無視されます(つまり、1.02.3は1.2.3と同等です)。このキーはローカライズできません。

CFBundleShortVersionString(文字列-iOS、OS X)は、アプリのリリースされたイテレーションを識別するバンドルのリリースバージョン番号を指定します。リリースバージョン番号は、ピリオドで区切られた3つの整数で構成される文字列です。最初の整数は、新機能や主要な変更を実装するリビジョンなど、アプリの主要なリビジョンを表します。2番目の整数は、目立たない機能を実装するリビジョンを示します。3番目の整数は、メンテナンスリリースを表します。

このキーの値は、アプリの反復(リリース済みまたは未リリース)を識別する「CFBundleVersion」の値とは異なります。このキーは、InfoPlist.stringsファイルに含めることでローカライズできます。

しかし、少し奇妙に思えます。これに対する私の解釈は、両方の値を同じに置くことです、すなわち:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

誰かが私が置くことになっているものを100%確認できますか?


1
それによると、CFBundleShortVersionStringはローカライズできます。しかし、ピリオドで区切られた3つの整数でなければならない場合、どのローカライズが可能でしょうか。
Rick

@リックアラビア語のように、実際に異なる数字を持つ言語に変換できると思いますか?
2015

@shiser単刀直入に言うと、「アラビア数字」は実際には私たちが西洋の世界で使用している数字であり、他のほとんどの場所でもそうです。しかし、私はあなたが何を意味するのかを理解し、アラビア語の世界には「アラビア数字」を使用しない部分があります。en.wikipedia.org/wiki/Arabic_numerals
RenniePet 16

1
ここで別の答え。stackoverflow.com/q/21125159/419348
AechoLiu

回答:


77

このように考えてください。「ショートバージョン」(CFBundleShortVersionString)はパブリックバージョン番号です。「バージョン」(CFBundleVersion)は、パブリックの「ショートバージョン」よりもはるかに頻繁に変更される可能性のある内部バージョン番号です。個人的に私は両方に同じものを使用していますが、多くの人がすべてのビルドで「バージョン」を更新しています。どちらの方法でも、Appleにリリースするときに通常は「ショートバージョン」を更新します。「バージョン」を更新する頻度は、あなたとあなたのニーズ次第です。


14
バンドルバージョン(CFBundleVersion)は、数値的に前のアプリのバンドルバージョンを超える必要があることに注意してください。そうしないと、App Storeに送信するときにエラーが発生します。stackoverflow.com/questions/4933093/…を参照してください。
Phil

3
Philが上記のように言ったように、最近では、失敗した(App Storeで承認されていない)ビルドを再送信すると、送信ごとにCFBundleVersionをバンプする必要があるようです。または、App Storeへの送信を成功させるために必要な変更があったときに、パブリック(CFBundleShortVersionString)バージョン番号をぶつけてもかまいません。
likethesky 2015

106

CFBundleShortVersionStringは、アプリのバージョンを提供します。通常、アプリをApp Storeに公開するたびに増加します。これは、アプリケーションのApp Storeページの「バージョン」セクションに表示されるバージョンです。

CFBundleVersionは、開発とテスト、つまり「技術」目的で使用されるビルド番号を提供します。エンドユーザーがビルド番号に関心を持つことはめったにありませんが、開発中には、各ビルドで何が開発および修正されているかを知る必要がある場合があります。これは通常、内部リリースの反復ごとに増分されます。また、Jenkinsなどの継続的インテグレーションツールを使用して、ビルドごとにビルド番号を自動インクリメントできます。

バージョンとビルド番号

2つの数値は相互に依存しませんが、混乱を避けるために、それらを平行に保つことをお勧めします。アプリがApp Storeレビューに合格したら、公開するかどうかにかかわらず、PhilやlikeTheSkyのようにビルド番号を増やす必要があることに注意してください。

ユースケース:十分にテストされたビルドがあり、提出の準備ができているとしましょう。バージョン番号は1.0.0で、ビルド番号は1.0.0.32です。アプリを送信したら、バージョンを1.0.1に、ビルド番号を1.0.1.0に更新する必要があります。


4
それで、CFBundleVersionが「3」のピリオドで区切られた値であることについてのドキュメント(質問で引用)のそのビットを無視しても安全ですか?
big_m

それはあなた次第だと思います。リリースを頻繁に公開しない場合、または頻繁なテストサイクルを通じてバグ修正に厳密に従う必要がない場合。両方に3桁を使用することもできます。
Yunus Nedim Mehel

アプリストアのビルドでCFBundleVersionを0にすることはできますか?アップルはそれを拒否しますか?
kraftydevil 2016年

3
はい、句読点付きの3つの数字以外の値を使用できます。201606070620出荷中のiOSアプリなどで日時の値を使用しました。
バジルブルク

3
@BasilBourque、ガイドラインに従わない場合、アプリ内購入を使用すると問題が発生する可能性があります。テクニカルノート2413を
DanSkeel 2017

16

rmaddy答えは正しいです。さらに2つの考えを追加します。

3番目のバージョン番号

iTunesConnect Webサイトでアプリの定義の一部として指定されている3番目のバージョン番号に注意してください。その数がXcodeの2つと異なる場合、Appleは警告を出します。警告は表示ストッパーではない(「エラー」ではない)ため、無視できます。

バージョンとしての日時

また、句読点で3つの数字を使用する必要はありません。これは、一部のアプリでは感知される場合があります。従来、最初の数値の変更は、通常、互換性に影響を与えるある種の劇的な変更を示していました。

他のアプリでは、ISO 8601標準形式スタイル(YYYYMMDDHHMM)の日付時刻値を使用することもできます。たとえば、201606070620。year-month-date-hour-minuteの順序は、増加する数値をレンダリングします。ゼロが埋め込まれるため、常に同じ長さになります。これは、アルファベット順に並べ替えた場合も時系列です。

私はiOS 7、8、9で動作する出荷中のiOSアプリでこのスタイルのバージョン番号を正常に使用しました。

この値の生成を自動化することもできます。プロジェクトの中にTarget> Build Phases> Run Scriptパネル:

  1. Shellフィールドで指定:/bin/sh
  2. 以下の5行のスクリプトを貼り付けます。
  3. (オプション)チェックShow environment variables in build logボックスをオンにします。
  4. チェックRun script only when installingボックスをオフにします。

ビルドを行うたびに、現在の日時がUTCタイムゾーンでキャプチャされます。-uスクリプトのフラグは、現在のデフォルトのタイムゾーンではなくUTCを使用します。一般的に、プログラマーやシステム管理者は、ローカルタイムゾーンではなくUTCを使用して考えるのが最善です。

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

または1.2.3、バージョン番号の従来型とビルド番号として日時を使用して、ハイブリッドを実行します。ハイブリッドを行うには、CFBundleShortVersionString行の#前にコメントを付けます。


7

私にとって最も賢明なスキームCFBundleShortVersionStringは、実際のバージョン番号にバージョン番号(つまり)を使用し、次にビルド番号(つまりCFBundleVersion)を使用してApp Storeへの送信を表すことです。したがって、問題が発生して再送信されない限り、この数は常に1です。新しいリリースでは、以前のバージョンにTestFlightテストまたはレビューで問題があった場合、1にリセットします。

ビルド番号は、特定のリリースに対して提供する各提出物に名前を付ける方法を提供します。上記の定義で説明したように、アプリの特定のバージョンに提供するすべてのビルドのコレクションは、そのバージョンの「リリーストレイン」と呼ばれます。iOSアプリの場合、ビルド番号は各リリーストレイン内で一意である必要がありますが、異なるリリーストレイン全体で一意である必要はありません [私の強調点]。つまり、iOSアプリの場合、必要に応じて、異なるリリーストレインで同じビルド番号を再び使用できます。

以下からのテクニカルノートTN2420:バージョン番号とビルド番号


1
このページの他の回答で提示された解釈を確認する公式のリファレンスを提供する回答を確認してください。
user2067021 2017

6

私は使用のCFBundleVersionのための内部ビルドを示すために、CFBundleShortVersionStringを。私はテストフライトを使用してテスターのビルドを送信しているので、それらの違いは非常に役に立ちました。

アップル文書のCFBundleVersionは、「で構成される文字列でなければならないと言う3非負、期間で区切られた整数」しかし、実際にそれができるMORE THAN 3部(上記の回答が示すように)。これを使用して開発ビルドを示します。たとえば、CFBundleShortVersionStringが1.0.0だとします。CFBundleVersionに1.0.0.11を使用して、リリース1.0.0の11番目のビルドであることを示すことができます。

アプリストアに送信される各CFBundleVersionは以前より大きくする必要があります。そうしないと、エラーITMS-90478: "無効なバージョンです。新しいビルドの送信のために新しいバージョンが閉じられているため、バージョン" xxx "のビルドをインポートできません。選択してください。別のバージョン番号。」

CFBundleShortVersionStringは3つの部分のみを持つことができます。そうでない場合、エラーが発生しますITMS-90060:Info.plistファイルのキーCFBundleShortVersionString 'xxx'の値は、最大 3つの負でない整数のピリオド区切りリストである必要があります。

第三の数すなわち上のバージョン番号を示しバジルボークが言及したことを、iTunesConnectは物事が複雑になることがあり場所です。

私がCFBundleShortVersionStringとは異なるiTunesConnect番号を使用しているのは、最初にアプリをアプリストアに送信したとき、内部リリースのラウンドがすでに何回かあったためです。そのため、iTunesConnect番号には1.0、CFBundleShortVersionStringには5.xを使用しました。App Storeの次のリリースで、App Storeに新しいバージョンがあるかどうかを確認する機能を提供し、iTunesConnect番号しか取得できないために問題が発生したことに気づきました(を使用してhttp://itunes.apple.com/lookup?bundleId=)、それを比較する前にいくつかの計算を行う必要がありますCFBundleShortVersionString番号。

iTunesConnect番号をCFBundleShortVersionStringとして使用して修正しようとしましたが、エラーERROR ITMS-90062:「このバンドルは無効です。Info.plistファイルのキーCFBundleShortVersionString [xxx]の値には、それよりも新しいバージョンが含まれている必要があります以前に承認されたバージョン[xxx]の。」

したがって、常に同じにすることをお勧めします。


5

CFBundleVersionの各フィールドの最大数は何ですか。

アプリのCFBundleVersionを1.1.1に設定し、「lsregister -dump」でバージョンの16進値を確認すると、最初のフィールドの最大値は(2 ^ 22)-1または4194303であり、最大値は2番目と3番目のフィールドの値は(2 ^ 21)-1または2097151です。

3つのフィールドの合計は64ビットです。

これは、日時に基づいてCFBundleVersionを使用する私たちに影響を与えます。

最初のフィールドをYYYYMMDDに設定していました。これは常に最大許容バージョンよりも大きく、複数のバージョンがインストールされていて、 'open -a Appname 'コマンドラインから。

これを広く広げてください。きっと多くの人が行き詰まっていると思います。


4番目のフィールド(1.1.1.20191201)が追加された場合に何が行われ、代わりに何を使用するかを思い出しますか?私は本当にAppleがandroidがここでしたのと同じ数値を使用したいのですが。PSこれを調べてくれてありがとう!
spacesuitdiver

制限はここに文書化されており、ここで述べられているものよりもかなり制限的だと思います。
saagarjha

3

現在のところ、州向けのAppleドキュメントCFBundleVersion [強調は私のもの]:

バンドルのイテレーションを識別するビルドバージョン。

...

このキーは、10.4のように、1〜3 個のピリオドで区切られた整数で構成される、機械で読み取り可能な文字列です。文字列には、数字(0〜9)とピリオドのみを含めることができます。

...

さらに多くの整数を含めることができますが、システムはそれらを無視します。

以下のためのCFBundleShortVersionString[重点鉱山]:

バンドルのリリースまたはバージョン番号。

...

このキーは、バンドルのバージョンユーザーに表示される文字列です。必須の形式は、10.14.1など、ピリオドで区切られた3つの整数です。文字列には、数字(0〜9)とピリオドのみを含めることができます。

CFBundleVersionビルドごとに(またはTestFlightのリリースごとに)自動的に増分し、変更するたびに0にリセットすることをお勧めしますCFBundleShortVersionString

でユーザーに表示されるバージョンを更新するには、明示的に計画するか、一貫した手段を考案する必要がありますCFBundleShortVersionString

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.