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