2014-02-25 83 views
0

我有兩個可可應用程序。 Application1調用Application2(abc.app),如下所示 -單實例應用程序 - 激活窗口 - 可可

if ([[NSWorkspace sharedWorkspace] respondsToSelector:@selector(launchApplicationAtURL:options:configuration:error:)]) 
    return nil != [[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL fileURLWithPath:@"abc.app" isDirectory:NO] options:NSWorkspaceLaunchDefault configuration:nil error:NULL]; 

這應該打開Application2(abc.app)。現在,如果應用程序1再次調用應用程序2,我想激活abc.app(如果這在碼頭中被最小化)。我想確保有單個abc.app實例在運行。我們怎樣才能做到這一點?

回答

1

可以檢查你的第二個應用程序正在運行,並檢查它是否是活動的應用程序(最前端)與NSRunningApplication類。

// check if abc.app is running 
NSArray *apps = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.youApplication.abc"]; 
if ([apps count] == 0) 
{ 
    // not running, launch it 
    [[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL fileURLWithPath:@"abc.app" isDirectory:NO] options:NSWorkspaceLaunchDefault configuration:nil error:NULL]; 
} 



// check if abc.app is frontmost 
NSArray *apps = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.youApplication.abc"]; 
if ([apps count]) 
{ 
    // abc.app is running, check if active 
    if (![(NSRunningApplication*)[apps objectAtIndex:0] isActive]) 
    { 
     // not active, activate it 
     [(NSRunningApplication*)[apps objectAtIndex:0] activateWithOptions: NSApplicationActivateAllWindows]; 
    } 
} 
0

你不能從App1中獲得。您可以檢查,如果你的應用2從應用2發起了類似的通知here

2

不太清楚你的問題。 Mac OS X默認只啓動一個應用程序的一個實例。 (除非磁盤上有多個可執行文件的物理副本,但即使這種情況下,如果具有相同捆綁ID的應用程序已經在運行,也會有一個Info.plist鍵禁止啓動應用程序。

另外,默認情況下,如果應用程序沒有打開其他窗口,NSWorkspace應該將其展開並解除應用程序(它應該表現得好像您在Finder中再次雙擊它,或者在點擊了它的停靠圖標時它已經在運行),它會調用第二個應用程序的「重新打開應用程序」處理程序。

如果不這樣做,你可以嘗試從'reopen'委託方法中明確地取消折疊主窗口,或者如果你不希望這種情況一般發生(但你爲什麼不呢? ),你可以考慮在兩個應用程序之間發送Apple事件。

此外,還可以檢查第二個應用程序已經通過查看runningApplications並尋找與同捆ID的條目運行。