Aplicación iOS, obtenga la versión de compilación mediante programación

Respuestas:

283

El valor que establece en el campo "Versión" del resumen de destino de Xcode está aquí:

Swift 3

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

ObjC

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

Swift 2

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

y el "Build":

Swift 3

let build = Bundle.main.infoDictionary?[kCFBundleVersionKey as String] as? String

ObjC

NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey];

Swift 2

let build = NSBundle.mainBundle().infoDictionary?[kCFBundleVersionKey as String] as! String
e1985
fuente
55
Usar el literal de cadena y no la constante no es a prueba de futuro; Vea la respuesta de Anupdas para las claves constantes.
Aaron Brager
9
Tienes razón para la @ "CFBundleVersion": he editado mi respuesta. Sin embargo, para @ "CFBundleShortVersionString" no hay AFAIK constante.
e1985
Para Swift, NSBundle.mainBundle()ahora esBundle.main
Todd
85

Puedes intentar usar infoDictionary

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *version = infoDictionary[@"CFBundleShortVersionString"];
NSString *build = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]; 
Anupdas
fuente
13
kCFBundleVersionKey es la 'compilación' no 'versión'
powerj1984
11

Cuando lo uso MFMailComposeViewControllerpara un botón "Contáctenos", utilizo este código para obtener un HTML formateado en el correo electrónico del usuario. Me da toda la información que necesito para comenzar a ayudar a resolver cualquier problema:

struct utsname systemInfo;
uname(&systemInfo);

NSDateFormatter *formatter = [[NSDateFormatter alloc]  init];
NSDate  *date = [NSDate date];
[formatter setDateFormat:@"MM/dd/yyyy 'at' hh:mm a"];
NSString *dateString = [formatter stringFromDate:date];

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width - 65.0;

NSString *comments = NSLocalizedString(@"Please write your comments below:", nil);
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSString *iOSVersion = [[UIDevice currentDevice] systemVersion];

NSString *emailBody = [NSString stringWithFormat:@"<!DOCTYPE html><html><style> .div {background-color: lightgrey; width: %fpx; padding: 10px; border: 5px solid navy; margin: 2px;}</style><body><div class='div'><p><b>App:</b> %@</p><b><p>Device:</b> %@</p><b><p>iOS Version:</b> %@</p><b><p><p>App Version and Build:</b> %@ (%@)</p><b><p>Date:</b> %@</p> </p></div><font color='red'><b>%@</b></font><br><br></body></html>",screenWidth,appName,deviceModel,iOSVersion,version,build,dateString,comments];

[self setMessageBody:emailBody isHTML:YES];

Este es el resultado al recibir el mensaje:

ingrese la descripción de la imagen aquí

Neowinston
fuente
3

Versión rápida para ambos por separado:

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Está incluido en este repositorio, échale un vistazo:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
fuente
Debe dejar en claro que es el propietario de ese repositorio. No quieres salir como spammer.
JAL
2

Detalles

  • Xcode versión 10.3 (10G8), Swift 5

Solución

class Info {
    static let dictionary = Bundle.main.infoDictionary ?? [:]
    enum Value {
        case build, version
    }
}

extension Info.Value {

    var key: String {
        switch self {
            case .build: return kCFBundleVersionKey as String
            case .version: return kCFBundleInfoDictionaryVersionKey as String
        }
    }

    var string: String? { return Info.dictionary[key] as? String }
}

Uso

if let value = Info.Value.version.string { print("Version: \(value)") }
if let value = Info.Value.build.string { print("Build: \(value)") }

Resultado

Configuración del proyecto

ingrese la descripción de la imagen aquí

Vasily Bodnarchuk
fuente
1

He escrito este proyecto de código abierto precisamente para este propósito. Mi proyecto publica notificaciones cuando ocurren eventos importantes, como cuando un usuario abre la aplicación por primera vez o abre la aplicación después de la actualización (completa con información sobre la versión desde la que se actualizó el usuario). La fuente es sencilla y debe ser fácil de entender. Avíseme si tiene alguna pregunta / solicitud.

También he escrito recientemente una publicación de blog al respecto.

Persona maravillosa
fuente
1

1) Para obtener la versión de la aplicación, debe utilizar:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

2) Para obtener la versión Build, debe usar:

NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Vaibhav Shiledar
fuente