[ios] Swift를 사용하여 앱 버전과 빌드 번호를 어떻게 얻습니까?

Azure 백엔드를 사용하는 IOS 앱이 있고 로그인 및 실행중인 앱 버전과 같은 특정 이벤트를 기록하고 싶습니다.

Swift를 사용하여 버전 및 빌드 번호를 어떻게 반환합니까?



답변

편집하다

스위프트 4.2 업데이트

let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String

편집하다

새로운 버전의 Xcode에서 @azdev가 지적한 것처럼 이전 솔루션을 시도하는 데 컴파일 오류가 발생합니다.이 문제를 해결하려면!

let nsObject: AnyObject? = Bundle.main.infoDictionary!["CFBundleShortVersionString"]

편집 종료

Objective-C에서와 동일한 논리를 사용하지만 약간의 변경이 있습니다.

//First get the nsObject by defining as an optional anyObject
let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary["CFBundleShortVersionString"]

//Then just cast the object as a String, but be careful, you may want to double check for nil
let version = nsObject as! String

이것이 도움이되기를 바랍니다.

데이비드


답변

나는 이것이 이미 답변되었지만 개인적으로 이것이 조금 더 깨끗하다고 ​​생각합니다.

스위프트 3.0 :

 if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
    self.labelVersion.text = version
}

스위프트 <2.3

if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
    self.labelVersion.text = version
}

이렇게하면 if let 버전이 조건부 처리를 처리하고 (필자의 경우 레이블 텍스트 설정) infoDictionary 또는 CFBundleShortVersionString이 nil 인 경우 선택적 언 래핑으로 인해 코드가 생략됩니다.


답변

스위프트 3.0 업데이트

NS-prefixes 지금 스위프트 3.0에 사라와 몇 가지 특성 / 방법이 더 스위프 티 ‘로 이름이 변경되었습니다. 다음은 현재 모습입니다.

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

Bundle.main.releaseVersionNumber
Bundle.main.buildVersionNumber

이전 업데이트 된 답변

나는 원래의 대답 이후로 프레임 워크를 많이 사용하여 솔루션을 여러 번들 환경에서 더 간단하고 훨씬 유용한 것으로 업데이트하고 싶었습니다.

extension NSBundle {

    var releaseVersionNumber: String? {
        return self.infoDictionary?["CFBundleShortVersionString"] as? String
    }

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

}

이제이 확장은 앱에서 기본 번들과 포함 된 다른 번들 (확장 프로그래밍을위한 공유 프레임 워크 또는 AFNetworking과 같은 세 번째 프레임 워크)을 모두 식별하는 데 유용합니다.

NSBundle.mainBundle().releaseVersionNumber
NSBundle.mainBundle().buildVersionNumber

// or...

NSBundle(URL: someURL)?.releaseVersionNumber
NSBundle(URL: someURL)?.buildVersionNumber

원래 답변

이미 게시 된 답변 중 일부를 개선하고 싶었습니다. 더 논리적 인 방식으로 처리하기 위해 도구 체인에 추가 할 수있는 클래스 확장을 작성했습니다.

extension NSBundle {

class var applicationVersionNumber: String {
    if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"]

같이? 문자열 {return version} return “버전 번호를 사용할 수 없음”}

class var applicationBuildNumber: String {
    if let build = NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String {
        return build
    }
    return "Build Number Not Available"
}

}

이제 다음을 통해 쉽게 액세스 할 수 있습니다.

let versionNumber = NSBundle.applicationVersionNumber

답변

또한 이것이 이미 답변되었지만 이전 답변을 마무리했습니다.

(*) 확장 프로그램 업데이트

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }
    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }
    var releaseVersionNumberPretty: String {
        return "v\(releaseVersionNumber ?? "1.0.0")"
    }
}

용법:

someLabel.text = Bundle.main.releaseVersionNumberPretty

@Deprecated : 이전 답변

스위프트 3.1 :

class func getVersion() -> String {
    guard let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else {
        return "no version info"
    }
    return version
}

이전 버전의 경우 :

class func getVersion() -> String {
    if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
        return version
    }
    return "no version info"
}

레이블 텍스트를 설정하거나 다른 곳에서 사용하려면

self.labelVersion.text = getVersion()


답변

대한 스위프트 4.0

let version = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let build = Bundle.main.infoDictionary!["CFBundleVersion"]!


답변

번들에 확장 프로그램을 만들었습니다

extension Bundle {

    var appName: String {
        return infoDictionary?["CFBundleName"] as! String
    }

    var bundleId: String {
        return bundleIdentifier!
    }

    var versionNumber: String {
        return infoDictionary?["CFBundleShortVersionString"] as! String
    }

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

}

그런 다음 사용하십시오

versionLabel.text = "\(Bundle.main.appName) v \(Bundle.main.versionNumber) (Build \(Bundle.main.buildNumber))"


답변

Swift 3.0 NSBundle이 작동하지 않으면 다음 코드가 완벽하게 작동합니다.

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

빌드 번호의 경우 다음과 같습니다.

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

혼란스럽게도 ‘CFBundleVersion’은 일반 -> ID의 Xcode에 입력 된 빌드 번호입니다.