我希望在测试期间启动它时找到将某些信息传递到我的应用程序的方法,以便我可以执行特殊的调试任务。 Xcode有一个部分“在启动时传递的参数”,我假设它们将显示在我的UIApplicationDelegate的应用程序中:didFinishLaunchingWithOptions:但是传入的字典总是为零。
我是以错误的方式解决这个问题吗?
答案 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; }"