繁体   English   中英

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

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

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

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

您可以像这样使用NSProcessInfo object 访问它们,

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

另一种更简单的方法是使用 NSUserDefaults。

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

来自文章:

可以被 NSArgumentDomain 解析和使用的命令行NSArgumentDomain必须采用以下格式:

 -name value

该参数存储为默认值,键为name ,值为value 此时访问在命令行中传入的值与访问任何其他默认值的过程相同。

例如运行这样的应用程序:

 MyApplication -aString "Hello, World" -anInteger 10

允许这样检索命令行 arguments:

 NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; NSString *aString = [standardDefaults stringForKey:@"aString"]; NSInteger anInteger = [standardDefaults integerForKey:@"anInteger"];

对于那些像我一样偶然发现这个问题的人:) 我想为我的 static 库设置一个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);
}

除了标量,命令行 arguments 可以是 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; }"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM