2012-05-15 42 views
4

我想知道是否可以在Mac应用程序之间传递参数,以及如何可能,如何。在Objective-C应用程序之间传递参数

我知道,在Java中,可以使用以下语法在命令行:

的Java JavaApp ARG1参数3 ARG4

这是可以访问那些通过主的ARGS [ ]数组。

public static void main(String[] args) { 
     System.out.println("d"); 
     for (int i = 0; i < args.length; i++) 
      System.out.println(args[i]); 
} 

编辑:我想从命令行的Mac应用程序传递参数给可可的Mac应用

+0

只有通过'NSDistributedNotificationCenter'的URL方案和通知才浮现。 – Eimantas

+2

您展示的示例代码只是打印出java程序的命令行参数 - 这可以在任何平台上以任何语言完成。但是你的问题提到从命令行Mac程序传递参数到可可Mac程序。然而,可可只是一个编写应用程序的框架..所以目前还不清楚你真正想做什么。你在写这两个程序吗?还是你想控制现有的程序?你能给出一个更具体的例子,说明你想在OSX下做什么? –

+0

我在一家有一些命令行工具与数据库交谈的公司工作。该命令行工具非常大,非常糟糕。在某些情况下,它只是启动了一个我能捕捉到的异常,但我似乎无法将程序设置为适当的状态。他们想要一个非常快速的修复,因此我构建了一个临时Restarter应用程序,该应用程序在命令行中通过'@ catch'语句调用,并停止命令行工具,修复数据库,然后重新启动命令行工具。从命令行工具中,我需要发送Restarter的数据库字段ID的名称来修复数据库。 –

回答

0

所有的答案正确地为我工作,但我发现,适合更好的另一种解决方案我的需求。 我需要从一个命令行工具,我用下面的行实现推出Cocoa程序:

system("nohup /PATH/Arguments.app/Contents/MacOS/Arguments argument1 argument2 &"); 

nohup的是UNIX服务,它可以让你的过程,所以如果你关闭终端窗口重视自身,这个过程依然存在。

出现的下一个问题是从Cocoa应用程序中捕获参数。 “如果main.m是接收它们并只返回一个int,我将如何获得AppDelegate.m的参数。”

在Apple的框架和库中,我找到了一个完全解决问题的方法。这个库被称为crt_externs.h,它包含两个有用的变量,一个用于了解参数的数量,另一个用于获取参数本身。

extern char ***_NSGetArgv(void); 
extern int *_NSGetArgc(void); 

所以,里面的AppDelegate中的从可可应用程序,我们会写下面的代码的参数解析成的NSString的

char **argv = *_NSGetArgv(); 
NSString *argument1 = [NSString stringWithCString:argv[1] encoding:NSUTF8StringEncoding]; 
NSString *argument2 = [NSString stringWithCString:argv[2] encoding:NSUTF8StringEncoding]; 

正如我们看到的,我们直接跳到参数阵列的位置1,因为位置0包含路径本身:

argv[0] = '/PATH/Arguments.app/Contents/MacOS/Arguments' 
argv[1] = 'argument1' 
argv[2] = 'argument2' 

谢谢大家的时间和帮助。我从你们那里学到了很多东西。我也希望这个答案可以帮助别人:)

干杯和快乐的编码!

1

如果在命令行和GUI两种应用都用Objective-C您可以使用NSDistributedNotificationCenter在进程之间发送通知。有关NSDistributedNotificationCenter的文档可以在Notification Programming Guide中找到。

或者,可可GUI应用程序接受以同样的方式的命令行参数作为任何其他C程序,即main子程序argvargc参数。

+0

mttrb和JeremyP的答案帮助了我。由于我的老板想为他们的命令行工具快速修复(我没有写那个该死的工具),所以今天我不得不建立一个外部程序,而我一点一点地重写所有工具的代码。至于今晚,我会让它与NSDistributedNotificationCenter解决方案一起工作,但明天我打算深入研究[JeremyP's](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/UserDefaults/) AboutPreferenceDomains/AboutPreferenceDomains.html#// apple_ref/doc/uid/10000059i-CH2-96930)解决方案。再次感谢你们两位。 –

3

我不清楚为什么你的Restarter应用程序需要成为一个可可应用程序。但是,假设它的确,命令行参数在NSUserDefaults的参数域中可用。 This link显示如何从命令行调用程序以及如何指定默认名称。

可可方式启动一个单独的过程是使用NSTask

+0

'NSArgumentDomain'非常受限制:您只能以“-option value”形式成对访问参数。 –

+0

@Nikolai:我同意,但它是“官方的方式”,它在Cocoa框架支持 – JeremyP

1

以下是我在NSWorkspace上编写的类别,它允许将argv类型的参数数组传递给生成的应用程序。

@interface NSWorkspace (MDAdditions) 
- (BOOL)launchApplicationAtPath:(NSString *)path 
         arguments:(NSArray *)argv 
          error:(NSError **)outError; 
@end 

@implementation NSWorkspace (MDAdditions) 

- (BOOL)launchApplicationAtPath:(NSString *)path 
         arguments:(NSArray *)argv 
          error:(NSError **)outError { 
    NSParameterAssert(path != nil); 
    BOOL success = YES; 
    if (outError) *outError = nil; 
    FSRef itemRef; 
    OSStatus status = FSPathMakeRef((const UInt8 *)[path UTF8String], &itemRef, NULL); 
    if (status != noErr) { 
     if (anError) *anError = [NSError errorWithDomain:NSOSStatusErrorDomain 
         code:status userInfo:nil]; 
     return NO; 
    } 
    LSApplicationParameters appParameters = {0, kLSLaunchDefaults, &itemRef, 
     NULL, NULL, (argv ? (CFArrayRef)argv : NULL), NULL }; 
    status = LSOpenApplication(&appParameters, NULL); 
    if (status != noErr) { 
     NSLog(@"LSOpenApplication() returned %d for %@", (int)status, path); 
     if (outError) *outError = [NSError errorWithDomain:NSOSStatusErrorDomain 
         code:status userInfo:nil]; 
     return NO; 
    } 
    return YES; 
} 
@end 

更新:

正如答案提到Accessing command-line arguments in Objective-C,的_NSGetArgv()_NSGetArgc()功能“_”前缀通常是一个迹象,表明他们是私有的,应该避免,如果替代可用(哪里有)。

,以获得ARGS传递给可执行文件,你可以使用NSProcessInfo-arguments一种方法,在下面的代码:

NSArray *argv = [[NSProcessInfo processInfo] arguments]; 
NSArray *args = [argv subarrayWithRange:NSMakeRange(1, argv.count - 1)]; 
NSLog(@"args == %@", args); 
+0

有没有办法获得参数 - (void)applicationDidBecomeActive:(NSNotification *)aNotification?我得到了 - (void)applicationDidFinishLaunching中的参数:(NSNotification *)aNotification,但不在applicationDidBecomeActive中。如果是Windows重启场景,我们需要在这个事件中的参数。 –

相关问题