iPhoneアプリはどのようにして独自のバージョン番号を検出できますか?


254

iPhoneアプリを書いています。公開済みですが、バージョン番号が表示される機能を追加したいと思います。

リリースするバージョンごとに手動でこれを行う必要はありません...

Objective-Cに私のアプリのバージョンを確認する方法はありますか?


1
この質問はすでにstackoverflow.com/a/16888788/2890157で回答されています。
Akshat Singhal 2013

1
..リンクされた質問は4年後なので、ここでの本当の問題は、cmosが回答を受け入れなかっことです。いずれにしても、リンクされた質問の回答は役に立ちます。ここでの回答も同様です。両方のスレッドで、最初の回答を超えて見てください-時々、後の回答に関するより最新の情報があります。
ToolmakerSteve 2017年

回答:


222

ここ説明するように、スクリプトを使用して、ヘッダーファイルを現在のSubversionリビジョン番号で書き換えます。そのリビジョン番号はkRevisionNumber定数に格納されます。次に、次のようなものを使用してバージョンとリビジョン番号にアクセスできます。

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

これは、「バージョン1.0(51)」形式の文字列を作成します。


152
ビルドバージョンが返されたので、これを使用しました。[[[NSBundle mainBundle] infoDictionary] objectForKey:@ "CFBundleShortVersionString"]
jspooner 2012年

6
Xcodeが誤ってplistエントリにバージョン番号ではなくビルド番号を入力するため、CFBundleVersionは正しくありません。jspoonerは正しいです。
オスカー

4
バージョン番号とビルド番号の詳しい説明については、stackoverflow.com / questions / 6851660 / version-vs -build-in-xcode-4をご覧ください。CFBundleShortVersionString「バージョン」とCFBundleVersionビルド番号に通常必要なものを確認します。
Rory

3
kRevisionNumberは私にはうまくいかないようです。指定された出力を取得するために、@ jspoonerの修正を使用してこれを行いました:[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam

147

Brad Larsonの答えに基づいて、(特定のプロジェクトで行ったように)info plistにメジャーバージョン情報とマイナーバージョン情報が格納されている場合、これは私にとってうまくいきました:

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                appDisplayName, majorVersion, minorVersion];
}

マイナーバージョンを手動で改訂するのは面倒なので、ソースリポジトリの改訂番号トリックを使用するのが理想的です。(私がしなかったように)それを関連付けていない場合は、上記のスニペットが役立ちます。また、アプリの表示名を引き出します。


59

両方のSwiftバージョンを個別に:

スウィフト3

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

スウィフト2

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

このレポに含まれています、チェックしてください:

https://github.com/goktugyil/EZSwiftExtensions


42

これは私のアプリケーションでやったことです

NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

うまくいけば、この簡単な答えが誰かを助けるでしょう...


1
私のニーズにとって、これは素晴らしいことです。ありがとう。+1
デビッドデルモンテ2014年

1
これはバージョンではなくビルド名を返します
chancyWu

@ chancyWu、CFBundleShortVersionStringがバージョンを示しているようです。
ブライアンFレイティ


30

ビルドバージョンとアプリバージョンの2つがあります。

  1. アプリのバージョンを取得するには:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. ビルドバージョンを取得するには:

    NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

これら2つの間に違いはありますか?どちらも同じように返します。
jjnevis 2015年

はい、ビルド番号とアプリのバージョンが設定で同じである可能性があります。
Shaik Riyaz 2015年

わかりました。RAKEFILEにはapp.versionの設定が1つしかありません(RubyMotionを使用しています)。私はどちらかが私のニーズに合うと思います。ありがとう
jjnevis

どうも。スムーズに働いた。
フェリペ

1
前者はローカライズされた値(ある場合)を返すため、objectForInfoDictionaryKey:代わりにを使用することをお勧めしinfoDictionary] objectForKey:ます。おそらくここでも違いはありません;)
deanWombourne

17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

1
まさに私が必要としたもの!
ジュリアス

16

XYZ形式のバージョン文字列を取得する簡単な方法は次のとおりです。

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

または、XYのみの場合:

[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]

これらのスニペットはどちらも、ラベルオブジェクトのtextプロパティに割り当てる文字列を返します。たとえば、

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];

7

あなたは辞書を次のように使ってみることができます:-

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]

4

アプリのinfo.plistファイルを読み取り、キーCFBundleShortVersionStringの値を取得します。info.plistを読むとNSDictionaryオブジェクトが得られます


4

アプリのinfo.plistからバージョンの詳細を取得するinfoDictionaryを使用できます。このコードはSwift 3で機能します。このメソッドを呼び出して、任意の優先UI要素にバージョンを表示するだけです。

Swift-3  

func getVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "v\(version).\(build)"
}

3

スウィフト5:

アプリバージョンとビルドバージョンの2つがあります。

  • アプリのバージョンを取得するには:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • ビルドバージョンを取得するには:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

おかげで@Brad Larson♦たくさんの


1

バージョンビルド番号の両方の組み合わせが必要な場合は、Swift 3を使用する簡単な方法を次に示します。

let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"

追加as! Stringのいずれかの終わりにappVersionまたはbuildNumとしてその部分のみを取得する行Stringオブジェクト。フルを探しているならそれは必要ありませんversionInfo

これが役に立てば幸いです!


1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

@rajat chauhanの回答に基づいており、強制的ににキャストされていませんString


0

これはリビジョン管理システムで扱うのに良いことです。そうすれば、ユーザーからバグレポートを受け取ったときに、そのコードのリビジョンをチェックアウトして、(できれば)ユーザーとまったく同じコードを実行してバグを再現できます。

アイデアは、ビルドを実行するたびに、コードの現在のリビジョン番号を取得し、プロジェクト内のファイルを更新するスクリプトを実行することです(通常、何らかの形のトークンの置換を使用)。次に、エラー出力にリビジョン番号を常に含めるエラー処理ルーチンを作成するか、「About」ページに表示できます。


0

この方法を試すことができます:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.