Azure arka uçlu bir IOS uygulamam var ve girişler ve uygulama kullanıcılarının hangi sürümlerinin çalıştığı gibi belirli olayları günlüğe kaydetmek istiyorum.
Swift'i kullanarak sürümü ve derleme numarasını nasıl döndürebilirim?
Azure arka uçlu bir IOS uygulamam var ve girişler ve uygulama kullanıcılarının hangi sürümlerinin çalıştığı gibi belirli olayları günlüğe kaydetmek istiyorum.
Swift'i kullanarak sürümü ve derleme numarasını nasıl döndürebilirim?
Yanıtlar:
DÜZENLE
Swift 4.2 için güncellendi
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
DÜZENLE
@ Azdev'in Xcode'un yeni sürümünde işaret ettiği gibi, önceki çözümümü denemek için bir derleme hatası alacaksınız, bunu çözmek için bir paket sözlüğü kullanarak bir paket!
let nsObject: AnyObject? = Bundle.main.infoDictionary!["CFBundleShortVersionString"]
Düzenlemeyi Sonlandır
Objective-C ile aynı mantığı kullanın, ancak bazı küçük değişikliklerle
//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
Umarım bu sana yardımcı olur.
David
infoDictionary
çıkarılmalıdır !
. Ben Globals.swift dosyasına yerleştirilen bu kullanıyorum:let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as String
let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
Bunun zaten cevaplandığını biliyorum ama kişisel olarak bunun biraz daha temiz olduğunu düşünüyorum:
Swift 3.0:
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
self.labelVersion.text = version
}
Swift <2.3
if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
self.labelVersion.text = version
}
Bu şekilde, eğer izin sürümü koşullu işlemeyi halleder (benim durumumda etiket metnini ayarlar) ve infoDictionary veya CFBundleShortVersionString nil ise isteğe bağlı açma işlemi kodun atlanmasına neden olur.
self.labelVersion.text
İsteğe bağlı türdür, bu nedenle doğrudan atayabilirsinizNSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String
let
, sadece neden gerekli olabileceğini merak etti. Teşekkürler!
Swift 3.0 için güncellendi
NS
-Prefixes şimdi Swift 3.0 gitti ve birkaç özellikleri / yöntemleri daha Swifty olmaya isimleri değişti. İşte şimdi böyle görünüyor:
extension Bundle {
var releaseVersionNumber: String? {
return infoDictionary?["CFBundleShortVersionString"] as? String
}
var buildVersionNumber: String? {
return infoDictionary?["CFBundleVersion"] as? String
}
}
Bundle.main.releaseVersionNumber
Bundle.main.buildVersionNumber
Eski Güncellenmiş Yanıt
Orijinal yanıtımdan bu yana Frameworks ile çok çalışıyorum, bu yüzden çözümümü çok paketli bir ortamda hem daha basit hem de çok daha kullanışlı bir şeye güncellemek istedim:
extension NSBundle { var releaseVersionNumber: String? { return self.infoDictionary?["CFBundleShortVersionString"] as? String } var buildVersionNumber: String? { return self.infoDictionary?["CFBundleVersion"] as? String } }
Şimdi bu uzantı, uygulamalarda hem ana paketi hem de dahil edilen diğer paketleri (uzantı programlama için paylaşılan bir çerçeve veya AFNetworking gibi üçüncü çerçeveler gibi) tanımlamak için yararlı olacaktır:
NSBundle.mainBundle().releaseVersionNumber NSBundle.mainBundle().buildVersionNumber // or... NSBundle(URL: someURL)?.releaseVersionNumber NSBundle(URL: someURL)?.buildVersionNumber
Orijinal Yanıt
Daha önce gönderilen cevapların bazılarında gelişmek istedim. Bunu daha mantıklı bir şekilde ele almak için takım zincirinize eklenebilecek bir sınıf uzantısı yazdım.
extension NSBundle { class var applicationVersionNumber: String { if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"]
gibi? String {return version} return "Sürüm Numarası Mevcut Değil"}
class var applicationBuildNumber: String { if let build = NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String { return build } return "Build Number Not Available" } }
Artık buna kolayca erişebilirsiniz:
let versionNumber = NSBundle.applicationVersionNumber
Bunun zaten cevaplanmış olduğunu biliyorum ama önceki cevapları tamamladım:
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")"
}
}
Kullanımı:
someLabel.text = Bundle.main.releaseVersionNumberPretty
Hızlı 3.1 :
class func getVersion() -> String {
guard let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else {
return "no version info"
}
return version
}
Eski sürümler için :
class func getVersion() -> String {
if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
return version
}
return "no version info"
}
Etiket metni ayarlamak veya başka bir yerde kullanmak istiyorsanız;
self.labelVersion.text = getVersion()
İçin Swift 4.0
let version = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let build = Bundle.main.infoDictionary!["CFBundleVersion"]!
Paket Üzerinde Eklenti Yaptım
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
}
}
ve sonra kullan
versionLabel.text = "\(Bundle.main.appName) v \(Bundle.main.versionNumber) (Build \(Bundle.main.buildNumber))"
Swift 3.0 NSBundle için çalışmıyor, Aşağıdaki kod mükemmel çalışıyor.
let versionNumberString =
Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
as! String
ve sadece yapı numarası için:
let buildNumberString =
Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
as! String
Kafa karıştırıcı bir şekilde 'CFBundleVersion', General-> Identity'de Xcode'da girildiği gibi yapı numarasıdır.
Xcode 9.4.1 Hızlı 4.1
Paket görünen adının doğru dil sürümünü almak için localizedInfoDictionary kullanımına dikkat edin.
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
}
}
Swift 4, Paket için kullanışlı Uzantı
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))"
}
}
Paketi + Extensions.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
}
}
Kullanımı:
someLabel.text = Bundle.main.versionNumber
OP hem sürüm numarasını hem de yapı numarasını istedi. Maalesef cevapların çoğu bu seçeneklerin ikisini de sağlamaz. Ayrıca, diğerleri gereksiz genişletme yöntemleri ekler. İşte oldukça basit ve OP'nin problemini çözen:
// 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 ""
}
}
Swift'in gelişmeye devam etmesi nedeniyle cevabım (Ağustos 2015'te olduğu gibi):
let version = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
UIApplication için bir uzantı oluşturdum.
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"
}
}
Belgelere baktığımda, aşağıdakilerin daha temiz olduğuna inanıyorum:
let version =
NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")
as? String
Kaynak : "Bu yöntem, bir anahtar kullanılabilir olduğunda bir anahtarın yerelleştirilmiş değerini döndürdüğü için diğer erişim yöntemlerine göre tercih edilir."
Swift 1.2 için:
let version = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String
let build = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
Hızlı 3:
Versiyon numarası
if let versionNumberString = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { // do something }
Yapı numarası
if let buildNumberString = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // do something }
Hızlı 4
func getAppVersion() -> String {
return "\(Bundle.main.infoDictionary!["CFBundleShortVersionString"] ?? "")"
}
Bundle.main.infoDictionary! [ "CFBundleShortVersionString"]
Hızlı eski sözdizimi
let appVer: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
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
}
}
Dikkat: Eğer uygulama sürümü veya derlemesi ayarlanmadıysa, eğer kullanmaya çalışırsanız çökmeye neden olacaksa burada kullanmalısınız! açmak için.
İşte Swift 3.2 için güncellenmiş bir sürüm:
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
}
}
SWIFT 4
// Önce isteğe bağlı AnyObject olarak tanımlayarak nsObject'i edinin
let nsObject: AnyObject? = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as AnyObject
// Sonra nesneyi bir String olarak yayınlayın, ancak dikkatli olun, nil'i iki kez kontrol etmek isteyebilirsiniz
let version = nsObject as! String
ilgilenen herkes için, adlı güzel ve düzgün kütüphane var SwifterSwift
mevcut github ve de tam Swift her sürümü için belgelenmiş (bkz swifterswift.com ).
bu kütüphaneyi kullanarak, uygulama sürümünü ve derleme numarasını okumak şu kadar kolay olurdu:
import SwifterSwift
let buildNumber = SwifterSwift.appBuild
let version = SwifterSwift.appVersion
"uygulama güncellendi" sayfasını gösterip göstermemeye karar vermek için kullandığım bir işlev var. Bir Int dönüştürdüğüm yapı numarasını döndürür:
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")
}
Daha önce hiç kullanılmamışsa, mevcut yapı numarasından daha düşük olan 0 değerini döndürür. Böyle bir ekranı yeni kullanıcılara göstermemek için, ilk girişten sonra veya yerleşik tamamlandığında derleme numarasını eklemeniz yeterlidir.
Uygulama sürümünü Int olarak döndürmek için basit yardımcı işlev
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
}
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
self.lblAppVersionValue.text = version
}
Paket + Uzantı.swift (SwiftUI, Swift 5, Xcode 11)
Birkaç cevaptan gelen fikirleri birleştirdim ve biraz genişlettim:
ithalat Vakfı
uzantı Paketi {
public var appVersionShort: String? {
if let result = infoDictionary?["CFBundleShortVersionString"] as? String {
return result
} else {
return "⚠️"
}
}
public var appVersionLong: String? {
if let result = infoDictionary?["CFBundleVersion"] as? String {
return result
} else {
return "⚠️"
}
}
public var appName: String? {
if let result = infoDictionary?["CFBundleName"] as? String {
return result
} else {
return "⚠️"
}
}
}
SwiftUI örnek kullanımı
VStack {
Text("Version: \(Bundle.main.appVersionShort!) (\(Bundle.main.appVersionLong!))")
.font(.subheadline)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
lblVersion.text = "Version \(version)"
}