2012-03-25 46 views
3

我有一個Cocoa應用程序(.app),我想從另一個Cocoa應用程序啓動它,這裏沒有問題,但有什麼方法可以啓動第二個應用程序傳遞它的一些參數嗎?也許在主函數中使用argv []數組?如何在可可應用程序之間傳遞參數

回答

3

我這樣做是使用NSWorkspace啓動應用程序和NSDistributedNotificationCenter來傳遞數據。這顯然沒有完全開發,但它的工作。文檔中的一個警告 - 我用參數發送的字典(本例中只是一個字符串)不能在沙盒應用中使用(字典必須爲零)。

這是在打開的其他應用程序的應用程序:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
ws = [NSWorkspace sharedWorkspace]; 
NSNotificationCenter *center = [ws notificationCenter]; 
[center addObserver:self selector:@selector(poster:) name:NSWorkspaceDidLaunchApplicationNotification object:nil]; 
[ws launchApplication:@"OtherApp.app"]; 

}

-(void)poster:(NSNotification *) aNote { 
NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter]; 
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"theDataToSend" forKey:@"startup"]; 
[center postNotificationName:@"launchWithData" object:nil userInfo:dict]; 
NSLog(@"Posted notification"); 

}

這是在打開的應用程序:

-(void)awakeFromNib { 
NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter]; 
[center addObserver:self selector:@selector(doStartup:) name:@"launchWithData" object:nil]; 

}

-(void)doStartup:(NSNotification *) aNote { 
NSLog(@"%@",aNote.userInfo); 

}

+0

請注意,欺騙分佈式通知是微不足道的。任何進程都可以發佈任何數據。不要依賴他們的任何安全。 – 2012-03-25 21:17:40

+0

感謝您的信息庫爾特。你有什麼建議以更安全的方式來做到這一點? – rdelmar 2012-03-25 21:21:28

+0

不幸的是,這不是一個容易解決的問題。沒有別的東西幾乎如此方便。也許嘗試UNIX域套接字或命名管道。 XPC如果你可以要求10.7。您仍然必須確保與您交談的其他應用程序是您認爲的那個應用程序 - 實際上並沒有任何解決方法。 – 2012-03-25 21:34:08

1

你如何啓動第二個可可應用程序?

當我這樣做時,我通常通過NSAppleScript使用AppleScript與其他應用程序進行通信。您也可以啓動應用程序。當然,其他應用程序必須支持AppleScript。

如果您可以控制這兩個應用程序,也可以使用分佈式對象,但它更復雜。

如果您曾經需要使用命令行程序,那麼NSTask很有用。

+0

您也可以使用自定義URL方案。 – paulmelnikow 2012-03-25 13:48:09

+0

好吧我使用的方法openURL你知道這是eaiser的方式來啓動一個應用程序,它工作正常,我正在尋找你提到的兩種方法,非常感謝。 – willyMon 2012-03-25 18:50:42

相關問題