2013-03-18 74 views
1

在Xcode 4.6中,我創建了一個基於「命令行工具」項目模板的新應用程序。 如何以編程方式從該「命令行工具」應用程序啓動另一個應用程序(.app應用程序包)?MacOsX:如何從「命令行工具」類型的應用程序啓動應用程序(.app)

+0

可以使用'系統(爲const char *命令)'(包括在stdlib.h)並運行「open /path/to/application.app」 – 2013-03-18 18:42:36

+0

不使用系統,NSGod的答案看起來不錯 – 2013-03-18 20:27:02

回答

3

有很多方法可以實現這一點,使用啓動服務和或NSWorkspace

標識捆綁應用程序的更靈活方法之一是通過其捆綁標識符(CFBundleIdentifier),這是一個像com.apple.TextEdit這樣的字符串。這使您可以識別應用程序,而不必硬編碼找到應用程序的假定路徑,或者通過對應用程序包的名稱進行硬編碼(兩者都可以輕鬆更改)。您可以使用NSWorkspacelaunchAppWithBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifier:來啓動應用程序。如果您還不知道它,可以通過檢查其AppName.app/Contents/Info.plist文件來獲取應用程序包的包標識符。然後使用下面的代碼:

if (![[NSWorkspace sharedWorkspace] 
     launchAppWithBundleIdentifier:@"com.apple.TextEdit" 
          options:NSWorkspaceLaunchDefault 
     additionalEventParamDescriptor:NULL 
        launchIdentifier:NULL]) { 
     NSLog(@"launching app failed!); 
} 

重要:NSWorkspaceAppKit.framework框架,它最初沒有包含在「命令行工具」項目模板的一部分。要將其添加到您的項目中,請選擇目標列表中的目標,如下圖所示,然後單擊+按鈕添加其他框架。

enter image description here

添加兩個AppKit.frameworkCocoa.framework

這將導致所有3列在鏈接二進制庫存步驟。在這一點上,你可以刪除這兩個從連接階段Foundation.frameworkAppKit.framework,並且只留下Cocoa.framework,象下面這樣:

enter image description here

+0

要使用這種語法([[NSWorkspace sharedWorkspace]),創建新的「命令行工具」項目時應該爲Type選項(C/C++/Core Data/Core Foundation/Core Services/Foundation)選擇什麼? – ytw 2013-03-18 20:56:18

+1

@ytw:您可以使用'Foundation'模板,但您需要添加我提到的其他框架。你使用過什麼樣的模板(我剛剛假設'基金會',對此感到抱歉)。如果您對Objective-C感到不舒服,請告訴我,我可以添加代碼以使用Launch Services(這是基於C的,並且是CoreServices框架的一部分)。 – NSGod 2013-03-18 21:59:28

+0

謝謝,NSGod。您提供的代碼大部分時間都正常工作。有一種情況似乎不起作用,那就是命令行應用程序是以root身份啓動的。我看到「啓動應用程序失敗!」在日誌文件中。任何想法可能會造成這種情況?謝謝。 – ytw 2013-03-19 23:19:55

0

你試過「開放」嗎?至少在終端「打開」運行文件和/或應用程序。

+0

「Open」在終端中工作,但我如何從代碼調用open? – ytw 2013-03-18 18:43:59

相關問題