Есть ли способ передать параметры командной строки в мое приложение iOS из XCode? - PullRequest
17 голосов
/ 08 июня 2011

Я надеюсь найти способ передачи определенной информации в мое приложение при запуске его во время тестирования, чтобы я мог выполнять специальные задачи отладки.В Xcode есть раздел «Аргументы переданы при запуске», и я предположил, что они будут отображаться в приложении моего UIApplicationDelegate: didFinishLaunchingWithOptions: но переданный словарь всегда равен нулю.

Я поступаю неправильно?

Ответы [ 4 ]

21 голосов
/ 08 июня 2011

Вы можете получить к ним доступ, используя NSProcessInfo объект, подобный этому,

NSArray * arguments = [[NSProcessInfo processInfo] arguments];
11 голосов
/ 07 июля 2011

Другой более простой способ - использовать 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"];
1 голос
/ 01 февраля 2016

Для тех, кто сталкивался с таким вопросом, как я :) Я хотел иметь logLevel для моей статической библиотеки.То, как я это сделал,

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 голосов
/ 04 августа 2017

В дополнение к скалярам аргументы командной строки могут быть ссылками 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;}"

...