Is there a way to pass command line options to my iOS app from Xcode?

后端 未结 4 2004
半阙折子戏
半阙折子戏 2021-02-19 00:37

I\'m hoping to find a method to pass certain information in to my app when I launch it during testing, so that I can perform special debug tasks. Xcode has a section \"Arguments

相关标签:
4条回答
  • 2021-02-19 00:53

    You can access them using NSProcessInfo object like this,

    NSArray * arguments = [[NSProcessInfo processInfo] arguments];
    
    0 讨论(0)
  • 2021-02-19 00:58

    For those who stumbled to this question like me :) I wanted to have a logLevel for my static lib. The way I did is,

    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 讨论(0)
  • 2021-02-19 01:04

    In addition to scalars, command line arguments can be an NSData, NSArray, or NSDictionary references. Apple's documentation on "Old-Style ASCII Property Lists" tells how to do it. https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/OldStylePlists/OldStylePLists.html#//apple_ref/doc/uid/20001012-BBCBDBJE

    For example, this syntax should decode into an NSDictionary:

    MyApplication -aLocation "{ latitude = 37.40089; longitude = -122.109428; }"

    0 讨论(0)
  • 2021-02-19 01:09

    Another easier way is to use the NSUserDefaults.

    http://perspx.com/archives/parsing-command-line-arguments-nsuserdefaults/

    From the article:

    Command line arguments that can be parsed and used by the NSArgumentDomain must take the format:

    -name value
    

    The argument is stored as a default with key of name and value of value. At this point accessing values passed in on the command line is the same process for accessing any other defaults.

    For example running an application as such:

    MyApplication -aString "Hello, World" -anInteger 10
    

    allows the command line arguments to be retrieved as such:

    NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
    NSString *aString = [standardDefaults stringForKey:@"aString"];
    NSInteger anInteger = [standardDefaults integerForKey:@"anInteger"];
    
    0 讨论(0)
提交回复
热议问题