development

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

big-blog 2020. 3. 3. 23:03
반응형

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


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

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


편집하다

스위프트 4.2 업데이트

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

편집하다

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

let nsObject: AnyObject? = NSBundle.mainBundle().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에 입력 된 빌드 번호입니다.


Xcode 9.4.1 스위프트 4.1

localizedInfoDictionary를 사용하여 번들 표시 이름의 올바른 언어 버전을 선택하십시오.

var displayName: String?
var version: String?
var build: String?

override func viewDidLoad() {
    super.viewDidLoad()

    // Get display name, version and build

    if let displayName = Bundle.main.localizedInfoDictionary?["CFBundleDisplayName"] as? String {
        self.displayName = displayName
    }
    if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        self.version = version
    }
    if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
        self.build = build
    }
}

Xcode 8, 스위프트 3 :

let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

스위프트 4, 번들을위한 유용한 확장

import Foundation

public extension Bundle {

    public var shortVersion: String {
        if let result = infoDictionary?["CFBundleShortVersionString"] as? String {
            return result
        } else {
            assert(false)
            return ""
        }
    }

    public var buildVersion: String {
        if let result = infoDictionary?["CFBundleVersion"] as? String {
            return result
        } else {
            assert(false)
            return ""
        }
    }

    public var fullVersion: String {
        return "\(shortVersion)(\(buildVersion))"
    }
}

Swift가 계속 진화하고 있음을 감안할 때 (2015 년 8 월 현재) 내 대답 :

let version = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String

번들 + 확장명 .swift

import Foundation

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

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

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

용법:

someLabel.text = Bundle.main.versionNumber

설명서를 살펴본 결과 다음이 더 깨끗하다고 ​​생각합니다.

let version = 
NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") 
as? String

출처 : "사용 가능한 키의 현지화 된 값을 반환하므로이 방법을 다른 액세스 방법보다 선호합니다."


Swift 1.2의 경우 다음과 같습니다.

let version = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String
let build = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String

스위프트 3 :

버전 번호

if let versionNumberString = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { // do something }

빌드 번호

if let buildNumberString = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // do something }

스위프트 4

func getAppVersion() -> String {
    return "\(Bundle.main.infoDictionary!["CFBundleShortVersionString"] ?? "")"
}

Bundle.main.infoDictionary! [ "CFBundleShortVersionString"]

신속한 이전 구문

let appVer: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]

OP는 버전 번호와 빌드 번호를 모두 요청했습니다. 불행히도 대부분의 답변은 이러한 옵션을 모두 제공하지는 않습니다. 또한 불필요한 확장 방법을 추가하는 것도 있습니다. 다음은 매우 간단하고 OP의 문제를 해결하는 것입니다.

// Example output: "1.0 (234)"
private func versionAndBuildNumber() -> String {
  let versionNumber = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
  let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
  if let versionNumber = versionNumber, let buildNumber = buildNumber {
    return "\(versionNumber) (\(buildNumber))"
  } else if let versionNumber = versionNumber {
    return versionNumber
  } else if let buildNumber = buildNumber {
    return buildNumber
  } else {
    return ""
  }
}

extension UIApplication {

    static var appVersion: String {
        if let appVersion = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") {
            return "\(appVersion)"
        } else {
            return ""
        }
    }

    static var build: String {
        if let buildVersion = NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) {
            return "\(buildVersion)"
        } else {
            return ""
        }
    }

    static var versionBuild: String {
        let version = UIApplication.appVersion
        let build = UIApplication.build

        var versionAndBuild = "v\(version)"

        if version != build {
            versionAndBuild = "v\(version)(\(build))"
        }

        return versionAndBuild
    }

}

주의 : 앱 버전이나 빌드가 설정되어 있지 않으면 사용하려고하면 충돌이 발생할 수 있습니다! 풀다.


public var appVersionNumberString: String {
get {
    return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
}
}

Swift 3.2의 업데이트 버전은 다음과 같습니다.

extension UIApplication
{
    static var appVersion:String
    {
        if let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
        {
            return "\(appVersion)"
        }
        return ""
    }

    static var buildNumber:String
    {
        if let buildNum = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String)
        {
            return "\(buildNum)"
        }
        return ""
    }

    static var versionString:String
    {
        return "\(appVersion).\(buildNumber)"
    }
}

스위프트 4

// 선택적 AnyObject로 정의하여 먼저 nsObject를 가져옵니다.

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

// 그냥 객체를 String으로 캐스팅하지만 nil을 다시 확인해야 할 수도 있습니다.

let version = nsObject as! String

관심있는 사람이라면 누구나 githubSwifterSwift 에서 사용할 수 있는 멋지고 깔끔한 라이브러리가 있으며 모든 버전의 swift 버전에 대해 완벽하게 문서화되어 있습니다 ( swifterswift.com 참조 ).

이 라이브러리를 사용하면 앱 버전과 빌드 번호를 읽는 것이 다음과 같이 쉽습니다.

import SwifterSwift

let buildNumber = SwifterSwift.appBuild
let version = SwifterSwift.appVersion

if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        lblVersion.text = "Version \(version)"

    }

스위프트 5 업데이트

다음은 "앱 업데이트"페이지를 표시할지 여부를 결정하는 데 사용하는 기능입니다. 빌드 번호를 반환합니다.이 숫자는 Int로 변환 중입니다.

if let version: String = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
        guard let intVersion = Int(version) else { return }

        if UserDefaults.standard.integer(forKey: "lastVersion") < intVersion {
            print("need to show popup")
        } else {
            print("Don't need to show popup")
        }

        UserDefaults.standard.set(intVersion, forKey: "lastVersion")
    }

전에 사용하지 않으면 현재 빌드 번호보다 낮은 0을 반환합니다. 새로운 사용자에게 이러한 화면을 표시하지 않으려면 첫 번째 로그인 후 또는 온 보딩이 완료된 후 빌드 번호를 추가하십시오.


이전과 같이 문자열 형식의 코드를 사용하지 않고 상수를 사용할 수 있으므로 훨씬 편리합니다.

var appVersion: String {
    return Bundle.main.infoDictionary![kCFBundleVersionKey as String] as! String
}

앱 버전을 Int 로 반환하는 간단한 유틸리티 기능

func getAppVersion() -> Int {

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

            let appVersionClean = appVersion.replacingOccurrences(of: ".", with: "", options: NSString.CompareOptions.literal, range:nil)

            if let appVersionNum = Int(appVersionClean) {
                return appVersionNum
            }
        }
        return 0
    }

대한 스위프트 2.0

//First get the nsObject by defining as an optional anyObject

let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
let version = nsObject as! String

대한 스위프트 5.0 :

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

참고 URL : https://stackoverflow.com/questions/25965239/how-do-i-get-the-app-version-and-build-number-using-swift



반응형