Como obtenho a versão atual do meu projeto iOS no código?
151
Gostaria de obter a versão atual do meu projeto / aplicativo iOS como um NSStringobjeto sem precisar definir uma constante em um arquivo em algum lugar. Não quero alterar meu valor de versão em dois lugares.
O valor precisa ser atualizado quando eu colidir com minha versão no resumo de destino do projeto.
Você pode obter a versão e criar números da seguinte maneira:
let version =Bundle.main.object(forInfoDictionaryKey:"CFBundleShortVersionString")as!Stringlet build =Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey asString)as!String
ou no Objective-C
NSString* version =[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];NSString* build =[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString*)kCFBundleVersionKey];
Eu tenho os seguintes métodos em uma categoria em UIApplication:
extension UIApplication{staticvar appVersion:String{returnBundle.main.object(forInfoDictionaryKey:"CFBundleShortVersionString")as!String}staticvar appBuild:String{returnBundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey asString)as!String}staticvar versionBuild:String{let version = appVersion, build = appBuild
return version == build ?"v\(version)":"v\(version)(\(build))"}}
Você poderia usar este [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] em vez de [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey]. ]; Então, agora tornou-se fácil para manter na memória
Durai Amuthan.H
4
@Duraiamuthan eu recomendo usar em (NSString *)kCFBundleVersionKeyvez de @"CFBundleVersion". Embora seja mais longo para digitar (a conclusão automática ajudará aqui), como uma constante é verificada no momento da compilação.
Ashley Mills
Aliás, seria mais preciso ativar essa extensão, em NSBundlevez UIApplicationdisso, também permitirá substituir chamadas estáticas pelas chamadas de instância.
Zapko
@ Zapko - eu discordo respeitosamente. Conceitualmente, isso se encaixa UIApplication, pois as informações retornadas são sobre o aplicativo. Além disso, isso se aplica apenas ao mainpacote configurável - não faria sentido transformar esse método de instância em qualquer pacote configurável.
Ashley Mills
Você quis dizer buildquando disse appBundle(na segunda linha do seu código)?
user1046037
14
Aqui está o que funcionou no Xcode 8, Swift 3:
let gAppVersion =Bundle.main.object(forInfoDictionaryKey:"CFBundleShortVersionString")??"0"let gAppBuild =Bundle.main.object(forInfoDictionaryKey:"CFBundleVersion")??"0"print("Version: \(gAppVersion)")print("Build: \(gAppBuild)")
No Swift, você pode obter a versão do pacote usando:
let info:NSDictionary=NSBundle.mainBundle().infoDictionary!let version:String= info.objectForKey("CFBundleShortVersionString")as!String
versionLabel.text ="Version:"+ version
Para obter o valor localizado de qualquer chave, você deve usar CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
Então, aqui está uma versão Swift para ambos separadamente:
let versionNumber =NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")as!Stringlet buildNumber =NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion")as!String
(NSString *)kCFBundleVersionKey
vez de@"CFBundleVersion"
. Embora seja mais longo para digitar (a conclusão automática ajudará aqui), como uma constante é verificada no momento da compilação.NSBundle
vezUIApplication
disso, também permitirá substituir chamadas estáticas pelas chamadas de instância.UIApplication
, pois as informações retornadas são sobre o aplicativo. Além disso, isso se aplica apenas aomain
pacote configurável - não faria sentido transformar esse método de instância em qualquer pacote configurável.build
quando disseappBundle
(na segunda linha do seu código)?Aqui está o que funcionou no Xcode 8, Swift 3:
fonte
No objetivo C:
1) Para obter a versão do aplicativo, você deve usar um:
2) Para obter a versão Build, você deve usar:
fonte
No Swift, você pode obter a versão do pacote usando:
fonte
Um projeto meu de código aberto, o App Update Tracker , oferece essa funcionalidade (e mais) na forma de métodos de classe:
+ (NSString *)getShortVersionString
+ (NSString *)getLongVersionString
Você usaria assim:
fonte
Apenas para nota
Para obter o valor localizado de qualquer chave, você deve usar
CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
fonte
Então, aqui está uma versão Swift para ambos separadamente:
Está incluído neste repositório, confira:
https://github.com/goktugyil/EZSwiftExtensions
fonte