Swiftでバージョンとビルド情報を取得する


92

メインNSBundleにアクセスして、バージョンとビルドの情報を取得しようとしています。物事は、私はそれを迅速に試したい、私はObjective-Cでそれを取得する方法を知っていますBuild.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];。それでも、swiftをどこから始めればよいのかわからないので、新しい構文でそれを書き込もうとしましたが、役に立ちませんでした。


2
すでに行った試みを表示します。これは、Objective-Cの実装と非常によく似ています。
Mick MacCallum 2014

2017年1月swift2.3:sVer = NSBundle.mainBundle()。infoDictionary?["CFBundleShortVersionString"] as?文字列letsBuild = NSBundle.mainBundle()。infoDictionary?["CFBundleVersion"] as?String self.myVersionLabel.text = String(format: "Version%@ Build%@"、sVer!、sBuild!)
Matthew Ferguson

回答:


167

Swift構文の何が問題になっていますか?これはうまくいくようです:

if let text = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
    print(text)
}

2
なぜこれが反対票を投じられたのですか?としてはもっと自然かもしれませんがlet、それ以外は正しいように見えます。
トミー

ああ、「as String」を忘れたので、変数はそれを文字列として受け入れます。ありがとうございました。
Ken-UbiDex 2014

2
XCodeの6ベータ3で破壊されるように思われる
フレデリック・ダッダ

2
これは、Xcode 6ベータ5で私のために機能しました:let text = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]! as String
E. Barnes

@Deanオプションを返すようにinfoDictionaryを変更したようです。私は答えを編集しました
コナー

118

Swift3 / 4バージョン

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

Swift2.xバージョン

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

ここに見られるよう


1
同じキーを2回取得します。バージョンには、「CFBundleVersion」を使用する必要があります。私はそれがコピー/過去のタイプミスだと思います:)
foOg 2015

@foOgに感謝します。タイプミスでした。実際、それは逆です。短いものはバージョンであり、通常のものはビルドです。奇妙な、私は知っています。
ダンローゼンスターク2015

Swift3バージョン。infoPath = Bundle.main.path(forResource: "Info.plist"、ofType:nil)の場合、infoAttr = try?FileManager.default.attributesOfItem(atPath:infoPath)、infoDate = infoAttr [.creationDate] as?Date {return infoDate} return Date()
Ryan X

18

Xcode6の最終リリースには

NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String

「?」infoDictionaryの後の文字はここで重要です


1
くそー。私はこの「オプション?、アンラップ!」全体が大好きです。システム、それはクリスタルクリアでとても読みやすいです!
Jeroen Bouma 2015年

14

ビルドとバージョンを取得する簡単な方法は次のとおりです。

Swift4.Xの場合

 if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
     print(version)
   }

 if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
     print(build)
   }

ObjectiveCの場合

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

NSString * currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

問題があれば教えてください。これは私のために働いています。


13

のための迅速な方法AppNameAppVersionおよびBuildNumber..。

if let dict = NSBundle.mainBundle().infoDictionary {
   if let version = dict["CFBundleShortVersionString"] as? String,
       let bundleVersion = dict["CFBundleVersion"] as? String,
       let appName = dict["CFBundleName"] as? String {
           return "You're using \(appName) v\(version) (Build \(bundleVersion))."
   }
}

なぜ値をアンラップする必要があるのですか?私の知る限り、これらの値をゼロにすることは不可能です
Michael

@Michael一部の人々は常にオプションの値をアンラップします。あなたが正しいと言う人もいます。
ダンローゼンスターク2016

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

7

迅速に、次のようにUIApplicationの拡張機能として作成します。

extension UIApplication {

    func applicationVersion() -> String {

        return NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
    }

    func applicationBuild() -> String {

        return NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) as! String
    }

    func versionBuild() -> String {

        let version = self.applicationVersion()
        let build = self.applicationBuild()

        return "v\(version)(\(build))"
    }
}

次に、以下を使用して、必要なものをすべて取得できます。

let version = UIApplication.sharedApplication.applicationVersion() // 1
let build = UIApplication.sharedApplication.applicationBuild() // 80
let both = UIApplication.sharedApplication.versionBuild() // 1(80)

7

//アプリのバージョン番号を返します

public static var appVersion: String? {
    return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
}

//アプリのビルド番号を返します

public static var appBuild: String? {
    return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as? String
}

6

Swift 5.0

Swift 5のラッパーを作成して、AppInfoと呼ばれるすべてのアプリの1か所でアプリ関連の文字列を取得しました

struct AppInfo {

var appName : String {
    return readFromInfoPlist(withKey: "CFBundleName") ?? "(unknown app name)"
}

var version : String {
    return readFromInfoPlist(withKey: "CFBundleShortVersionString") ?? "(unknown app version)"
}

var build : String {
    return readFromInfoPlist(withKey: "CFBundleVersion") ?? "(unknown build number)"
}

var minimumOSVersion : String {
    return readFromInfoPlist(withKey: "MinimumOSVersion") ?? "(unknown minimum OSVersion)"
}

var copyrightNotice : String {
    return readFromInfoPlist(withKey: "NSHumanReadableCopyright") ?? "(unknown copyright notice)"
}

var bundleIdentifier : String {
    return readFromInfoPlist(withKey: "CFBundleIdentifier") ?? "(unknown bundle identifier)"
}

var developer : String { return "my awesome name" }

// lets hold a reference to the Info.plist of the app as Dictionary
private let infoPlistDictionary = Bundle.main.infoDictionary

/// Retrieves and returns associated values (of Type String) from info.Plist of the app.
private func readFromInfoPlist(withKey key: String) -> String? {
    return infoPlistDictionary?[key] as? String
     }
}

あなたはそれを次のように使うことができます:

print("The apps name = \(AppInfo.appname)")

Swiftで値が使用できない場合、nilが使用されます。IMOでは、カスタムプレースホルダー文字列の代わりにnilを返す必要があります。
ルカアンジェレッティ

それがラッパーである理由です。常に何かを取り戻すためです。ゼロの状況は実際には「破壊」されておらず、まだ存在していますが、すでに事前に処理されています。そうしないと、アプリの別の場所で「nil」の状況を処理する必要があります。
LukeSideWalker

ありがとう芽。また、最後の中括弧はコードブロックの外側にあります。:)
マークパーキンス

2
アプリ名も可能ですCFBundleDisplayName
ゴンド

2

このコードはSwift3、Xcode8で機能します。

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let build = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

2

Swift 3の場合、NSBundleをBundleに置き換え、mainBundleを単にmainに置き換えます。

let AppVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String

1

[更新:Xcode 6.3.1]上記のすべてを試しましたが、Xcode 6.3.1ではこれらの機能はありませんでしたが、次のことがわかりました。

(NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String)!

1

別のオプションは、AppDelegateで変数を定義することです。

var applicationVersion:String {
    return NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
}
var applicationBuild:String  {
    return NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) as! String
}
var versionBuild:String  {
    let version = self.applicationVersion
    let build = self.applicationBuild
    return "version:\(version) build:(\(build))"
}

AppDelegateで変数として参照できます



0

SWIFT3バージョン

if let infoPath = Bundle.main.path(forResource: "Info.plist", ofType: nil),
        let infoAttr = try? FileManager.default.attributesOfItem(atPath: infoPath),
        let infoDate = infoAttr[.creationDate] as? Date
{
    return infoDate
}
return Date()

0

フレームワークの結果を得るには、次を使用できます

let version = Bundle(for: type(of: self)).infoDictionary?["CFBundleShortVersionString"] as? String

またはテスト中

let version = Bundle(for: <SomeClass>.self).infoDictionary?["CFBundleShortVersionString"] as? String
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.