Swift로 버전 및 빌드 정보 얻기


92

버전 및 빌드 정보를 검색하기 위해 Main NSBundle에 대한 액세스 권한을 얻으려고합니다. 문제는 신속하게 시도하고 싶습니다 .Objective-C에서 Build.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];. 그러나 나는 신속하게 시작해야 할 곳을 모르고 새로운 구문으로 작성하려고 시도했습니다.


2
이미 시도한 내용을 보여줍니다. Objective-C 구현과 매우 유사합니다.
Mick MacCallum

2017 년 1 월 신속한 2.3 : let sVer = NSBundle.mainBundle (). infoDictionary? [ "CFBundleShortVersionString"] as? String let sBuild = 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있지만 그렇지 않으면 정확 해 보입니다.
Tommy

아, "as String"을 잊어 버려서 변수가 그것을 문자열로 받아들입니다. 감사합니다.
Ken-UbiDex

2
즉 6 베타 3 엑스 코드와 함께 깨진 것 같다
프레데릭 다다

2
이것은 Xcode 6 베타 5에서 저에게 효과적이었습니다.let text = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]! as String
E. Barnes

@Dean 선택 사항을 반환하기 위해 infoDictionary를 변경 한 것 같습니다. 나는 대답을 편집 한
코너

118

Swift 3/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)"
} 

Swift 2.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
동일한 키를 두 번 받게되며 버전에 "CFBundleVersion"을 사용해야합니다. 나는 그것이 복사 / 과거 오타라고 생각한다 :)
foOg

감사합니다 @foOg 오타였습니다. 사실 그것은 거꾸로입니다. 짧은 것은 버전이고, 일반적인 것은 빌드입니다. 이상 해요, 알아요.
Dan Rosenstark 2015

Swift 3 버전. 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 ()
Ryan X

18

Xcode 6의 최종 릴리스를 위해

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

"?" 여기서 infoDictionary 뒤의 문자가 중요합니다.


1
제길. 이 모든 "선택 사항?, 풀기!" 시스템은 맑고 읽기 쉽습니다!
Jeroen Bouma

14

다음은 빌드 및 버전을 얻는 간단한 방법입니다.

Swift 4.X의 경우

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

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

Objective C의 경우

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

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

문제가 있으면 알려주세요. 이것은 나를 위해 일하고 있습니다.


13

AppName, AppVersionBuildNumber...에 대한 신속한 방법

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 어떤 사람들은 항상 선택적 값을 풉니 다. 어떤 사람들은 당신이 옳다고 말합니다.
Dan Rosenstark

2
Bundle.maininfoDictionary나를 위해 비어 있었다; 아마도 실행 파일이나 앱이 아닌 프레임 워크 내에서 수행하고 있기 때문일까요? Bundle(for: MyClass.self)예상 값을 포함합니다.
Raphael

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

스위프트 5.0

AppInfo 라는 모든 앱의 한곳에서 앱 관련 문자열 을 가져 오기 위해 Swift 5 용 래퍼를 만들었습니다 .

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을 반환해야합니다.
Luca Angeletti

그것이 래퍼 인 이유입니다. 항상 무언가를 되 찾는 것입니다. nil-situation은 실제로 "파괴"된 것이 아니라 여전히 존재하지만 이미 미리 처리되어 있습니다. 그렇지 않으면 앱의 다른 위치에서 "nil"상황을 처리해야합니다.
LukeSideWalker

고마워요. 또한 마지막 중괄호는 코드 블록 밖에 있습니다. :)
Mark Perkins

2
앱 이름도 가능합니다CFBundleDisplayName
gondo

2

이 코드는 Swift 3, Xcode 8에서 작동합니다.

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

스위프트 3 :

let textVersion
 = Bundle.main.infoDictionary?["CFBundleVersion"] as? String

0

SWIFT 3 버전

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.