Respostas:
Existem 2 números!
O número da liberação de marketing é para os clientes, chamado número da versão . Começa com 1.0 e sobe para as principais atualizações para 2.0 , 3.0 , para pequenas atualizações para 1.1 , 1.2 e para as correções para 1.0.1 , 1.0.2 . Esse número é orientado sobre lançamentos e novos recursos. Não precisa parar em 9, 1.11.23 é um número de versão razoável.
O número da compilação é principalmente o número interno de compilações que foram feitas até então. Mas alguns usam outros números, como o número da ramificação do repositório ou seu número de confirmação. Esse número deve ser exclusivo para distinguir as diferentes construções, que possuem apenas pequenas alterações incrementais.
Objetivo-C:
NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
Swift <3.0:
let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
Swift 3.0+ (testado com 5.0):
let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
Objetivo-C:
NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
Swift <3.0:
let buildNumber: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Swift 3.0+ (testado até 5.0):
let buildNumber: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
Primeiro use as linhas acima e depois a seguinte.
Objetivo-C:
NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];
Swift (testado até 5.0):
let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"
Os valores no pacote principal nem sempre estão presentes; por exemplo, em um aplicativo de linha de comando, não existe CFBundleShortVersionString
ou CFBundleVersion
, portanto, os métodos retornamnil
e travam porque o código causa um downcast incorreto. Porém, nos aplicativos normais para iOS e Mac da Cocoa, esses valores são definidos e não serão excluídos.
Isso é testado com o Xcode versão 7.3 (7D175) . O número da compilação geralmente é escrito entre parênteses / chaves. O número da compilação está em hexadecimal ou decimal.
No Xcode, você pode incrementar automaticamente o número da compilação como um número decimal , colocando o seguinte na Run script
fase de compilação nas configurações do projeto
#!/bin/bash
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
Para número de compilação hexadecimal, use este script
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber))
buildNumber=$(($buildNumber + 1))
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
Para Xcode
fazer o seguinte:
Bundle.main.object(forInfoDictionaryKey: "...")
agora.
Você não precisa alterar nada no seu projeto ou no Xcode. Aqui está a versão Swift para os dois separadamente:
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Está incluído neste repositório, confira:
Bundle.main.object(forInfoDictionaryKey: "...")
agora.
Aqui está o mesmo código para o Swift 3 :
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
Bundle.main
tinha um vazio infoDictionary
para mim; talvez porque eu esteja fazendo isso de dentro de uma estrutura, não de um executável ou aplicativo? Bundle(for: MyClass.self)
contém os valores esperados.
Exibir programaticamente a versão e o número da versão - Swift 4.0
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"
let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"
Você também pode usar como
var appVersion: String {
//versionNumber
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"
//buildNumber
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"
return "Version: #\(versionNumber) (#\(buildNumber))"
}
Então você pode usar em qualquer lugar quando declarar Globalmente.
print(appVersion)
Resultado:
Version: #1.0 (#1.0.3)
Fiz uma extensão para o Bundle, para que seja fácil de usar
extension Bundle {
var releaseVersionNumber: String? {
return infoDictionary?["CFBundleShortVersionString"] as? String
}
var buildVersionNumber: String? {
return infoDictionary?["CFBundleVersion"] as? String
}
var applicationName: String {
return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
}
var applicationReleaseDate: String {
return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
}
var applicationReleaseNumber: Int {
return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
}
var releaseVersionNumberPretty: String {
return "\(releaseVersionNumber ?? "1.0.0")"
}
var buildVersionNumberPretty: String {
return "\(buildVersionNumber ?? "1")"
}
}