ฉันจะรับเวอร์ชั่นแอพและหมายเลขบิลด์ด้วย Swift ได้อย่างไร


387

ฉันมีแอพ IOS ที่มี Azure back-end และต้องการบันทึกกิจกรรมบางอย่างเช่นการเข้าสู่ระบบและเวอร์ชันของผู้ใช้แอปที่กำลังทำงานอยู่

ฉันจะคืนเวอร์ชันและหมายเลขบิลด์ด้วย Swift ได้อย่างไร



6
นั่นคือวัตถุประสงค์ -C ไม่ใช่ Swift
Øyvind Vik

10
อย่าสับสนCFBundleVersion& CFBundleShortVersionString` ที่แรกก็คือรุ่นบิลด์ของคุณ อีกรุ่นคือหมายเลข ดูที่นี่สำหรับข้อมูลเพิ่มเติม
น้ำผึ้ง

1
@ ØyvindVikคนส่วนใหญ่คิดว่าคุณสามารถแปล Objective-C เป็น Swift โดยไม่ต้องถือมือ
gnasher729

คำตอบ:


424

แก้ไข

อัปเดตสำหรับ Swift 4.2

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

แก้ไข

ดังที่ @azdev ชี้ให้เห็นในเวอร์ชันใหม่ของ Xcode คุณจะได้รับข้อผิดพลาดในการรวบรวมสำหรับลองใช้วิธีแก้ไขปัญหาก่อนหน้าของฉันเพื่อแก้ไขสิ่งนี้เพียงแก้ไขมันตามที่แนะนำให้แกะพจนานุกรมมัดโดยใช้!

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

ฉันหวังว่านี่จะช่วยคุณได้

เดวิด


เมื่อฉันใช้สิ่งนี้ฉันได้รับข้อผิดพลาดของคอมไพเลอร์ "[NSObject: AnyObject]? ไม่มีสมาชิกชื่อ 'subscript'"
andreas

คุณสามารถลองแทนที่ AnyObject หรือไม่ โดย AnyObject! โดยไม่ทราบว่ารหัสที่คุณใช้นั้นยากที่จะคาดเดาสิ่งที่ผิดนอกจากนี้โปรดทราบว่า Swift สามารถเปลี่ยนจากรุ่นหนึ่งของ Xcode ไปเป็นรุ่นอื่นได้ดังนั้นจึงจะเกี่ยวข้องกับรุ่น Xcode ของคุณด้วย
David

18
@andreas ควรจะยังไม่ได้เปิดใช้infoDictionary !นี่คือสิ่งที่ฉันกำลังใช้วางลงในไฟล์ Globals.swift:let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as String
azdev

1
ฉันต้องเพิ่มอีกหนึ่ง "!" หลังจาก "เป็น" let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
yosei

3
คุณควรหลีกเลี่ยงการใช้การบังคับแกะ "!" เนื่องจากพวกเขาจะทำให้แอปของคุณพังเมื่อใดก็ตามที่หนึ่งในค่าเหล่านั้นเป็นศูนย์
Julius

278

ฉันรู้ว่าคำตอบนี้ได้รับการตอบแล้ว แต่โดยส่วนตัวฉันคิดว่ามันสะอาดกว่านี้เล็กน้อย:

สวิฟท์ 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 เป็นศูนย์การคลายการเลือกจะทำให้รหัสถูกข้าม


6
self.labelVersion.textเป็นประเภทที่เป็นตัวเลือกดังนั้นคุณสามารถกำหนดได้โดยตรงNSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String
Jonauz

8
มีเหตุผลที่จะไม่ตั้งค่าหรือไม่? เห็นด้วยมันระมัดระวังมากขึ้นด้วยletเพียงแค่สงสัยว่าทำไมมันอาจจำเป็น ขอบคุณ!
Crashalot

@Crashalot แม้จะมีชื่อของคุณ;) คุณไม่ต้องการให้แอปของคุณขัดข้องถ้าพูดว่าคุณพิมพ์ผิด แต่มีหมายเลขเวอร์ชันว่า "มีบางอย่างผิดปกติ"
Daniel Springer

OP: คุณสามารถแทนที่ ด้วย! และลบ "as String" ถ้าไม่มีมันก็ไม่ผิดพลาด
Daniel Springer

245

อัปเดตสำหรับ Swift 3.0

NS-prefixes จะหายไปตอนนี้อยู่ในสวิฟท์ 3.0 และคุณสมบัติหลาย / วิธีการที่มีการเปลี่ยนแปลงชื่อจะมีมากขึ้น Swifty นี่คือสิ่งที่ดูเหมือนว่าตอนนี้:

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

Bundle.main.releaseVersionNumber
Bundle.main.buildVersionNumber

คำตอบที่อัปเดตเก่า

ฉันทำงานกับ Frameworks มากตั้งแต่คำตอบดั้งเดิมของฉันดังนั้นฉันจึงต้องการอัปเดตโซลูชันเป็นสิ่งที่ง่ายและมีประโยชน์มากขึ้นในสภาพแวดล้อมแบบหลายกลุ่ม:

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} ส่งคืน "หมายเลขเวอร์ชันไม่พร้อมใช้งาน"}

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

}

ดังนั้นตอนนี้คุณสามารถเข้าถึงสิ่งนี้ได้อย่างง่ายดายโดย:

let versionNumber = NSBundle.applicationVersionNumber

CFBundleVersionKey ไม่ทำงานใน Swift 3, Xcode 8 อีกต่อไปคุณรู้รหัสใหม่ที่จะใช้หรือไม่?
Crashalot

71

ฉันรู้ว่าสิ่งนี้ได้รับการตอบแล้ว แต่ฉันได้ตอบคำถามก่อนหน้านี้แล้ว:

(*) อัปเดตสำหรับส่วนขยาย

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()

1
หรือ: class func getVersion () -> String {return NSBundle.mainBundle (). infoDictionary? ["CFBundleShortVersionString"] เป็น? สตริง "ไม่มีข้อมูลรุ่น"}
tapmonkey

ฉันคิดว่าการคัดลอกคำตอบอื่น ๆ ไม่สมเหตุสมผล หากคำตอบของคุณไม่ถูกต้องอีกต่อไปคุณจะมีความเป็นไปได้ที่จะลบมันออกไปและทำให้มีที่ว่างสำหรับคำตอบอื่น ๆ :)
carmen_munich

1
@carmen_munich เนื่องจากคุณใส่ร้ายที่นี่ฉันต้องตอบคุณ ก่อนอื่นคำตอบนี้โพสต์มีนาคม 2015 และคำตอบของคุณโพสต์กุมภาพันธ์ 2560 ดังนั้นแรงบันดาลใจของคุณจะต้องมาจากคำตอบก่อนหน้า ประการที่สองฉันไม่เห็นคำตอบของคุณเลยฉันอัปเดตคำตอบของฉันเพราะฉันใช้วิธีนี้ทุกวันนี้ ฉันคิดว่าการใช้ส่วนขยายนั้นไม่ซ้ำใคร จริง ๆ โปรดพยายามเป็นผู้ใหญ่และเคารพผู้พัฒนารายอื่น ฉันไม่ได้อะไรเลยที่นี่ ฉันต้องการช่วยเหลือผู้คน โปรดอย่าพยายามกีดกันผู้ที่พยายามช่วยเหลือในเรื่องนี้
Gunhan

ฉันได้ยินเสียงตอบรับมากมายจากมือใหม่ว่าพวกเขาโพสต์คำตอบและต้องการเห็นว่ามีคนคลิกที่ "up" ซึ่งเป็นเรื่องที่ดีมากที่ได้เห็นและกระตุ้นผู้คน แต่ถ้ามีคนคัดลอกคำตอบในคำตอบที่ล้าสมัยของเขาคนที่พยายามโพสต์นั้นจะไม่ได้รับแรงจูงใจที่มีคนโหวต ดังนั้นมือใหม่รู้สึกผิดหวังจริงๆและรู้สึกว่าพวกเขาไม่ได้นำคุณค่ามาสู่ชุมชนและหยุดโพสต์ และอย่าเข้าใจผิดฉันหมายถึงสิ่งนี้โดยทั่วไป หวังว่าคุณจะไม่รู้สึกขุ่นเคืองและเข้าใจในตอนนี้ดีขึ้นว่าทำไมฉันจึงทำตามคำแนะนำนี้
carmen_munich

@carmen_munich หากคุณเรียงลำดับตามคำตอบของคำถามนี้คุณจะสังเกตเห็นว่ามีคนอื่นได้รับคำตอบเดียวกับที่คุณเคยทำมาก่อน! ดังนั้นคุณโทษฉันว่าคุณทำเอง เนื่องจากฉันมีประวัติเกี่ยวกับคำถามนี้ฉันจึงแบ่งปันการตั้งค่าการใช้งานใหม่ในการอัปเดต นั่นคือทั้งหมดที่
Gunhan


29

ฉันทำส่วนต่อขยายกับชุดรวม

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))"

จริง ๆ แล้วมันต่างกันเล็กน้อย ฉันใช้กำลังการแกะห่อตัวอย่างเช่น คุณอาจคิดว่าการบังคับให้แกะโดยทั่วไปนั้นไม่ดีกรณีนี้เป็นของหายากที่มันโอเค เพื่ออธิบายเพิ่มเติมอีกเล็กน้อยค่าเหล่านี้ควรอยู่ในพจนานุกรมมิฉะนั้นมีบางอย่างผิดปกติกับไฟล์โครงการ นั่นเป็นสาเหตุที่วิธีการนี้ใช้กำลังเปิด :-)
carmen_munich

การเปลี่ยนชื่อและบังคับให้เปิดเครื่องใหม่ไม่ใช่การเปลี่ยนการโพสต์เป็นคำตอบใหม่ นอกจากนี้ผู้คนอาจเรียนรู้การบังคับเปิดโปงสามารถใช้ได้ทุกที่เมื่อเห็นคำตอบของคุณ สำหรับผู้อ่านอย่าถือว่ากุญแจอยู่ตรงนั้นมันจะดีกว่าเสมอในการจัดการตัวเลือกการคลายตัวเองมากกว่าการบังคับแกะ
Gunhan

เพื่อความเป็นธรรมมีบางกรณีที่หาได้ยากซึ่งการบังคับปล่อยกำลังไม่เป็นไร โพสต์นี้หนึ่งโพสต์แสดงกรณีเดียวที่สามารถใช้ได้ หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับคดีที่กำลังเปิดโปงมีคำอธิบายและแบบฝึกหัดที่ดีจาก Paul Hudson ฉันสามารถแนะนำให้กับมือใหม่ทั้งหมดได้ที่ www.hackingwithswift.com
carmen_munich

มันเป็นคำแนะนำที่ดีสำหรับมือใหม่ บางทีคุณสามารถอ่านเพิ่มเติมและเรียนรู้เพิ่มเติมได้ นอกจากนี้คุณควรปรับปรุงความเข้าใจของคุณเกี่ยวกับความคิดเห็นและสิ่งที่พวกเขาหมายถึง เช่นไม่มีใครบอกว่าคุณไม่เคย / เคยใช้กำลังบังคับ แต่สำหรับข้อมูลนั้นสามารถลบคีย์เหล่านั้นออกได้และการบังคับให้แกะอาจทำให้เกิดความผิดพลาดได้ มันปลอดภัยกว่าที่จะจัดการกับการแกะที่นี่
Gunhan

บางทีคุณสามารถอธิบายได้ว่าในกรณีใดพวกเขาจะถูกลบและไม่มีอะไร? สิ่งที่ฉันได้เรียนรู้จากแหล่งข้อมูลที่กล่าวถึงมันไม่ได้อยู่ในกรณีนี้ พวกเขาควรจะอยู่ที่นั่นเสมอเว้นแต่ไฟล์โครงการจะพังในกรณีนั้นโครงการอาจจะไม่คอมไพล์อยู่ดี
carmen_munich

16

สำหรับ Swift 3.0 NSBundle ไม่ทำงานรหัสต่อไปนี้ทำงานได้อย่างสมบูรณ์

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

และสำหรับหมายเลขบิลด์ก็คือ:

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

พลุกพล่าน 'CFBundleVersion' คือสร้างจำนวนที่ป้อนไว้ใน Xcode ในงานทั่วไปซึ่ง> เอกลักษณ์


16

Xcode 9.4.1 Swift 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
    }
}

14

Xcode 8, Swift 3:

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

13

Swift 4 ส่วนขยายที่มีประโยชน์สำหรับ Bundle

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))"
    }
}

ในการใช้สิ่งนี้คุณต้องพูดว่า Bundle.main.fullVersion ตัวอย่าง
Joseph Astrahan

12

Bundle + 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
    }
}

การใช้งาน:

someLabel.text = Bundle.main.versionNumber

11

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 ""
  }
}

9

คำตอบของฉัน (ณ วันที่สิงหาคม 2015) ได้รับ Swift พัฒนาอย่างต่อเนื่อง:

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

8

ฉันสร้างส่วนขยายสำหรับ 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"
    }
}

6

เมื่อดูที่เอกสารฉันเชื่อว่าสิ่งต่อไปนี้สะอาดกว่า:

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

แหล่งที่มา : "การใช้วิธีนี้เป็นที่ต้องการมากกว่าวิธีการเข้าถึงอื่น ๆ เพราะมันจะส่งกลับค่าการแปลของคีย์เมื่อมีอยู่"


1
นั่นคือวิธีที่รวดเร็วที่เหมาะสมไม่มีแรงคลี่คลายไม่ว่าที่ไหน
Juan Boero

5

สำหรับ Swift 1.2 มันคือ:

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

1
คุณสามารถใช้? เช่นกัน
Dan Rosenstark

4

สวิฟท์ 3:

หมายเลขรุ่น

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

สร้างหมายเลข

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

หมายเลขบิลด์ล่ะ? ขอบคุณ! CFBundleVersionKey ไม่ทำงาน
Crashalot

@Crashalot ฉันอัพเดตด้วยหมายเลขบิลด์ด้วย นี่คือรายการของ Core Foundation Keys ทั้งหมด: developer.apple.com/library/content/documentation/General/
......

3

สวิฟต์ 4

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

Bundle.main.infoDictionary! [ "CFBundleShortVersionString"]

ไวยากรณ์เก่าที่รวดเร็ว

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

2
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
    }

}

ข้อควรระวัง: คุณควรใช้หากปล่อยไว้ที่นี่ในกรณีที่ไม่ได้ตั้งค่าเวอร์ชันแอพหรือบิลด์ซึ่งจะทำให้เกิดปัญหาถ้าคุณลองใช้! เพื่อแกะ


2

นี่คือเวอร์ชั่นที่อัปเดตสำหรับ 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)"
    }
}

2

ตอนนี้คุณสามารถใช้ค่าคงที่สำหรับสิ่งนี้แทนที่จะต้องใช้รหัสที่พิมพ์อย่างเข้มงวดเหมือน แต่ก่อนซึ่งทำให้สิ่งต่าง ๆ สะดวกยิ่งขึ้น

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


1

SWIFT 4

// ขั้นแรกรับ nsObject โดยกำหนดเป็น AnyObject ที่เป็นตัวเลือก

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

// จากนั้นเพียงแค่โยนวัตถุเป็น String แต่ระวังคุณอาจต้องการตรวจสอบศูนย์

let version = nsObject as! String

1

สำหรับผู้ที่สนใจมีห้องสมุดที่สวยงามและประณีตที่SwifterSwiftมีให้ที่githubและยังมีเอกสารสำหรับ swift ทุกรุ่น (ดูswifterswift.com )

การใช้ไลบรารีนี้การอ่านเวอร์ชันแอปและหมายเลขบิลด์จะเป็นเรื่องง่ายเช่นนี้:

import SwifterSwift

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

1

อัพเดทสำหรับ Swift 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 ซึ่งต่ำกว่าหมายเลขบิลด์ปัจจุบัน หากไม่ต้องการแสดงหน้าจอดังกล่าวให้กับผู้ใช้ใหม่เพียงเพิ่มหมายเลขบิลด์หลังจากล็อกอินครั้งแรกหรือเมื่อการขึ้นเครื่องเสร็จสมบูรณ์



1

ฟังก์ชั่นยูทิลิตี้ง่าย ๆ เพื่อกลับรุ่นแอปเป็น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
    }



0

Swift 5 เป็นส่วนขยาย UIApplication

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)")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.