xcode - down - sign in to app store connect
¿Hay alguna forma de pasar las opciones de la línea de comandos a mi aplicación iOS desde Xcode? (4)
Además de los escalares, los argumentos de la línea de comando pueden ser referencias a NSData, NSArray o NSDictionary. La documentación de Apple sobre "Listas de propiedades ASCII de estilo antiguo" 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 debería decodificarse en un NSDictionary:
MyApplication -aLocation "{latitude = 37.40089; longitud = -122.109428;}"
Espero encontrar un método para pasar cierta información a mi aplicación cuando la inicie durante las pruebas, para poder realizar tareas de depuración especiales. Xcode tiene una sección "Argumentos pasados en el lanzamiento", y asumí que aparecerían en la aplicación de mi UIApplicationDelegate: didFinishLaunchingWithOptions: pero el diccionario que se pasa siempre es nulo.
¿Voy por esto de la manera incorrecta?
Otra forma más fácil es usar los NSUserDefaults.
http://perspx.com/archives/parsing-command-line-arguments-nsuserdefaults/
Del artículo:
Los argumentos de la línea de comando que se pueden analizar y utilizar por el
NSArgumentDomain
deben tener el formato:
-name value
El argumento se almacena como predeterminado con clave de
name
y valor devalue
. En este punto, el acceso a los valores que se pasan en la línea de comando es el mismo proceso para acceder a cualquier otro valor predeterminado.Por ejemplo ejecutando una aplicación como tal:
MyApplication -aString "Hello, World" -anInteger 10
permite que los argumentos de la línea de comando se recuperen como tales:
NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; NSString *aString = [standardDefaults stringForKey:@"aString"]; NSInteger anInteger = [standardDefaults integerForKey:@"anInteger"];
Para aquellos que tropezaron con esta pregunta como yo :) Quería tener un logLevel
de logLevel
para mi logLevel
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);
}
Puedes acceder a ellos usando el objeto NSProcessInfo
como este,
NSArray * arguments = [[NSProcessInfo processInfo] arguments];