2011-06-07 21 views
17

Espero encontrar un método para pasar cierta información a mi aplicación cuando la lance durante la prueba, para que pueda realizar tareas especiales de depuración. Xcode tiene una sección "Argumentos aprobados en el lanzamiento", y asumí que se mostrarían en mi aplicación UIApplicationDelegate: didFinishLaunchingWithOptions: pero el diccionario que se pasa es siempre nulo.¿Hay alguna manera de pasar opciones de línea de comandos a mi aplicación iOS desde Xcode?

¿Voy por esto de la manera incorrecta?

Respuesta

20

Puede acceder a ellos utilizando NSProcessInfo objeto como éste,

NSArray * arguments = [[NSProcessInfo processInfo] arguments]; 
+1

Jolly buen señor, muy buena – Claudiu

11

Otra forma más fácil es usar los NSUserDefaults.

http://perspx.com/archives/parsing-command-line-arguments-nsuserdefaults/

Desde el artículo:

argumentos de línea de comandos que pueden ser analizadas y utilizadas por el NSArgumentDomain debe tener el formato:

-name value 

El argumento se almacena como una predeterminado con clave de name y valor de value. En este punto, el acceso a los valores ingresados ​​en la línea de comando es el mismo proceso para acceder a cualquier otro valor predeterminado, .

Por ejemplo se ejecuta una aplicación como tal:

MyApplication -aString "Hello, World" -anInteger 10 

permite a los argumentos de línea de comandos para que sea recuperado como tal:

NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; 
NSString *aString = [standardDefaults stringForKey:@"aString"]; 
NSInteger anInteger = [standardDefaults integerForKey:@"anInteger"]; 
1

Para los que tropezó a esta pregunta como yo :) Quería tener un logLevel para mi lib estática. La forma en que lo hice es,

static NSUInteger logLevel = 1; 
/** This argument should be passed from XCode's build scheme configuration option, Arguments passed on launch */ 
static const NSString *kIdcLogLevelArgument = @"-com.mycompany.IDCLogLevel"; 

@implementation IDCLogger 

+ (instancetype)sharedInstance { 
    static id sharedInstance = nil; 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 

    return sharedInstance; 
} 

+(void)initialize 
{ 
    logLevel = 1; 
    NSArray *arguments = [[NSProcessInfo processInfo] arguments]; 
    NSUInteger value = 0; 

    if ([arguments containsObject:kIdcLogLevelArgument]) { 
     NSUInteger index = [arguments indexOfObject:kIdcLogLevelArgument]; 
     if (arguments.count > index) { 
      NSString *valueStr = [arguments objectAtIndex:index + 1]; 
      NSCharacterSet* notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; 
      if ([valueStr rangeOfCharacterFromSet:notDigits].location == NSNotFound) 
      { 
       value = [valueStr integerValue]; 
       logLevel = value; 
      } 
     } 
    } 
    NSLog(@"%@:logLevel = %lu", [self class], (unsigned long)logLevel); 
} 

+ (void)setLogLevel:(NSUInteger)l 
{ 
    logLevel = l; 
    NSLog(@"[%@]: Log level set to: %lu", [self class], (unsigned long)l); 
} 
0

Además de los escalares, argumentos de línea de comando puede ser un NSData, NSArray o referencias NSDictionary. La documentación de Apple sobre "Listas de propiedades ASCII antiguas" explica cómo hacerlo. https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/OldStylePlists/OldStylePLists.html#//apple_ref/doc/uid/20001012-BBCBDBJE

Por ejemplo, esta sintaxis debe descodificar en un NSDictionary:

-aLocation MyApplication "{latitud = 37,40089; longitud = -122,109428;}"

Cuestiones relacionadas