Подтвердить что ты не робот

Есть ли способ передать параметры командной строки для моего приложения iOS из Xcode?

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

Я иду об этом неправильно?

4b9b3361

Ответ 1

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

NSArray * arguments = [[NSProcessInfo processInfo] arguments];

Ответ 2

Еще один простой способ - использовать 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"];

Ответ 3

Для тех, кто наткнулся на этот вопрос, как я:) Я хотел иметь 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);
}

Ответ 4

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