iOSアプリでターゲットのバージョン/ビルド番号をプログラムで表示する方法は?


135

target version下の画像のように、プログラムでの値を取得するにはどうすればよいですか?

Xcodeプロジェクトのターゲットの[プロパティ]ウィンドウに表示されます。これをアプリのスプラッシュ画面に表示して、人々が現在使用しているバージョンを確認したいのですが。

回答:


392

2つの数字があります!

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

ビルド番号は、ほとんどがあるのビルドの内部番号それまで行われていること。ただし、リポジトリのブランチ番号やそのコミット番号など、他の番号を使用するものもあります。この番号は、マイナーな増分変更のみを持つ異なるビルドを区別するために一意である必要があります。


バージョン番号を取得するには:

Objective-C:

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

スウィフト<3.0:

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0以降(5.0でテスト済み):

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

ビルド番号を取得するには:

Objective-C:

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

スウィフト<3.0:

let buildNumber: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Swift 3.0以降(5.0までテスト済み):

let buildNumber: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String   

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

最初に上記の行を使用し、次に次の行を使用します。

Objective-C:

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

Swift(5.0までテスト済み):

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

ノート:

メインバンドルの値は常に存在するとは限りません。たとえば、コマンドラインアプリケーションではCFBundleShortVersionStringor がないため、コード内で誤ったダウンキャストを行うCFBundleVersionため、メソッドが返さnilれてクラッシュします。ただし、通常のCocoa iOSおよびMacアプリでは、これらの値は定義されており、削除されません。

これはXcodeバージョン7.3(7D175)でテストされています。ビルド番号は、括弧/中括弧で書かれることがよくあります。ビルド番号は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"

以下をXcode実行します。

ステップ1

ステップ1

ステップ2

ステップ2

ステップ3

step3


4
上記の例に追加すると、「CFBundleVersion」はBuild = 300、「CFBundleShortVersionString」はVersion = 0.41になります。ヴィクトルの答えは正しい答えでなければなりません。
justinkoh 2013年

1
16進数で一度問題が発生しました。Appleは整数を使用する状態:developer.apple.com/library/ios/documentation/general/Reference/...を
hashier

@ "CFBundleShortVersionString"と@ "CFBundleVersion"の文字列定数があるかどうか知っていますか?
igrek

CI / CDシステムはかなり一般的なので、ビルドスクリプトを使用してバージョン番号を設定する際の落とし穴を指摘した方がよいでしょう。
Sam Ballantyne 2016年

1
Swift 3.0向けに名前が変更されましたBundle.main.object(forInfoDictionaryKey: "...")
ラファエル

13

プロジェクトやXcodeを変更する必要はありません。両方のSwiftバージョンを個別に示します。

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

これはこのリポジトリに含まれています。確認してください。

https://github.com/goktugyil/EZSwiftExtensions


どの答え?見ない
Esqarrouth 2015年

唯一の答えがあります、それは彼の第二段落にあります
ダニエルGalasko

3
ええ、1。彼の答えにはノイズが多すぎて信号があまりありません。2.これは迅速です。つまり、objective-cです。3. ios5時代のこと
Esqarrouth

Swift 3.0向けに名前が変更されましたBundle.main.object(forInfoDictionaryKey: "...")
ラファエル

5

Swift 3の同じコード:

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String

Bundle.maininfoDictionary私には空がありました。実行可能ファイルやアプリではなく、フレームワーク内から実行しているためでしょうか?Bundle(for: MyClass.self)期待値が含まれています。
ラファエル

4

プログラムでバージョンとビルド番号を表示する-Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"

1

次のように使用することもできます

var appVersion: String {
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"
}

そうすれば、グローバルに宣言するときにどこでも使用できます。

print(appVersion)

出力:

Version: #1.0 (#1.0.3)

1

Bundleの拡張機能を作成したので、使いやすくなりました

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.