有没有办法将命令行选项从Xcode传递到我的iOS应用程序?

时间:2011-06-07 23:17:42

标签: xcode ios uiapplicationdelegate

我希望在测试期间启动它时找到将某些信息传递到我的应用程序的方法,以便我可以执行特殊的调试任务。 Xcode有一个部分“在启动时传递的参数”,我假设它们将显示在我的UIApplicationDelegate的应用程序中:didFinishLaunchingWithOptions:但是传入的字典总是为零。

我是以错误的方式解决这个问题吗?

4 个答案:

答案 0 :(得分:21)

您可以使用NSProcessInfo这样的对象

来访问它们
NSArray * arguments = [[NSProcessInfo processInfo] arguments];

答案 1 :(得分:11)

另一种更简单的方法是使用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"];

答案 2 :(得分:1)

对于那些像我这样偶然发现这个问题的人:) 我希望我的静态库有一个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);
}

答案 3 :(得分:0)

除了标量之外,命令行参数可以是NSData,NSArray或NSDictionary引用。关于"旧式ASCII属性列表"的Apple"讲述了如何做到这一点。 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;经度= -122.109428; }"