Ответ 1
Вы можете получить к ним доступ, используя NSProcessInfo
объект, подобный этому,
NSArray * arguments = [[NSProcessInfo processInfo] arguments];
Я надеюсь найти способ передачи определенной информации в мое приложение, когда я запускаю его во время тестирования, чтобы я мог выполнять специальные задачи отладки. Xcode имеет раздел "Аргументы, переданные при запуске", и я предположил, что они появятся в моем приложении UIApplicationDelegate: didFinishLaunchingWithOptions: но словарь, который прошел, всегда равен нулю.
Я иду об этом неправильно?
Вы можете получить к ним доступ, используя 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
для моей статической библиотеки. То, как я это сделал,
static NSUInteger logLevel = 1;
/** This argument should be passed from XCode 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 "{latitude = 37.40089; longitude = -122.109428;}"