Azure 백엔드를 사용하는 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
이것이 도움이되기를 바랍니다.
데이비드
infoDictionary
는을 사용하여 래핑 해제 해야합니다 !
. 이것이 내가 사용하고 Globals.swift 파일에 배치 한 것입니다 :let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as String
let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] 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 인 경우 선택적 언 래핑으로 인해 코드가 생략됩니다.
self.labelVersion.text
선택적 유형이므로 직접 할당 할 수 있습니다NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String
let
왜 필요한지 궁금해하는 것에 대해 더 조심스럽게 동의했습니다 . 감사!
스위프트 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
스위프트 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()
번들에 확장 프로그램을 만들었습니다
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
}
}
스위프트 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
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
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 ""
}
}
UIApplication에 대한 확장을 만들었습니다.
extension UIApplication {
static var appVersion: String {
let versionNumber = Bundle.main.infoDictionary?[IdentifierConstants.InfoPlist.versionNumber] as? String
let buildNumber = Bundle.main.infoDictionary?[IdentifierConstants.InfoPlist.buildNumber] as? String
let formattedBuildNumber = buildNumber.map {
return "(\($0))"
}
return [versionNumber,formattedBuildNumber].compactMap { $0 }.joined(separator: " ")
}
}
struct IdentifierConstants {
struct InfoPlist {
static let versionNumber = "CFBundleShortVersionString"
static let buildNumber = "CFBundleVersion"
}
}
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 }
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
}
}
주의 : 앱 버전이나 빌드가 설정되어 있지 않으면 사용하려고하면 충돌이 발생할 수 있습니다! 풀다.
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)"
}
}
public var appVersionNumberString: String {
get {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") 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
}
관심있는 사람이라면 누구나 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)"
}
다음은 "앱 업데이트"페이지를 표시할지 여부를 결정하는 데 사용하는 기능입니다. 빌드 번호를 반환합니다.이 숫자는 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을 반환합니다. 새로운 사용자에게 이러한 화면을 표시하지 않으려면 첫 번째 로그인 후 또는 온 보딩이 완료된 후 빌드 번호를 추가하십시오.
UIApplication 확장으로서의 Swift 5
extension UIApplication {
static var release: String {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String? ?? "x.x"
}
static var build: String {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String? ?? "x"
}
static var version: String {
return "\(release).\(build)"
}
}
사용 예 :
print("release: \(UIApplication.release)")
print("build: \(UIApplication.build)")
print("version: \(UIApplication.version)")