Есть ли способ передать параметры командной строки в мое приложение iOS из Xcode?
Я надеюсь найти способ передать определенную информацию в мое приложение, когда я запускаю его во время тестирования, чтобы я мог выполнять специальные задачи отладки. Xcode имеет раздел "аргументы, переданные при запуске", и я предположил, что они появятся в приложении моего UIApplicationDelegate:didFinishLaunchingWithOptions: но словарь, который передан, всегда равен нулю.
Я делаю это неправильно?
4 ответов
вы можете получить к ним доступ с помощью NSProcessInfo
объект такой,
NSArray * arguments = [[NSProcessInfo processInfo] arguments];
другой более простой способ-использовать NSUserDefaults.
http://perspx.com/archives/parsing-command-line-arguments-nsuserdefaults/
из статьи:
аргументы командной строки, которые могут быть проанализированы и использованы
NSArgumentDomain
должен принимать формат:-name value
аргумент сохраняется по умолчанию с ключом
name
и значениеvalue
. На этом этапе доступ к значениям, переданным по команде линия тот же процесс для доступа к любым другим значениям по умолчанию.например, запуск приложения как такового:
MyApplication -aString "Hello, World" -anInteger 10
позволяет извлекать аргументы командной строки как таковые:
NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; NSString *aString = [standardDefaults stringForKey:@"aString"]; NSInteger anInteger = [standardDefaults integerForKey:@"anInteger"];
для тех, кто наткнулся на этот вопрос, как мне :)
Я хотел иметь logLevel
для моего статического lib. То, как я это сделал,
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);
}
в дополнение к скалярам аргументы командной строки могут быть ссылками NSData, NSArray или NSDictionary. Документация Apple по "спискам свойств ASCII старого стиля" рассказывает, как это сделать. https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/OldStylePlists/OldStylePLists.html#//apple_ref/doc/uid/20001012-BBCBDBJE
например, этот синтаксис должен декодироваться в NSDictionary:
MyApplication-aLocation "{ широта = 37.40089; долгота = -122.109428; }"