MacOSX 下.app支持同時運行多個實例

在MacOSX下的.app是一個程序包(其實是個目錄),雙擊該目錄時系統會根據包的目錄結構啓動相應的可執行程序。.app的程序默認是單實例運行的,因此從.app啓動的程序實例只有一個(可執行程序不受該規則影響),操做系統根據Bundle identifier 作互斥處理。app

若是你的.app支持多個參數啓動不一樣的模塊且都是跟窗口相關,那麼在啓動第二個.app的時候會自動激活第一個程序實例的窗口而不是再啓動一個程序實例。ide

在Google查閱相關資料,得出的結論是操作系統

open -n /Applications/xxx.app

 

沒有辦法解決鼠標雙擊啓動的問題,好比已經有個後臺界面(不顯示)程序在運行。雙擊後.app包後,已運行的程序會接收到applicationShouldHandleReopen消息,第二個程序並不啓動。經過參考TeamViewer的二進制程序,經過不斷的調試終於瞭解一點MacOSX的程序啓動原理:調試

1. 程序包(Bundle)啓動時互斥的,也就是正常的啓動是隻啓動一個惟一實例,若是想啓動多個只能經過以上的方式啓動多個。code

2. 即便給同一個程序包下的不一樣程序指定一個不一樣的Bundle identifier,若是都在同一Contents/MacOSMacOS下,正常啓動結果仍是惟一實例。blog

3. 即便給同一個程序包下的不一樣程序指定一個不一樣的Bundle identifier,且不在同一Contents/MacOS目錄下,啓動OK。io

 

如何給程序指定不一樣的Bundle identifier?class

增長連接選項(Other Link flags):後臺

-sectcreate __TEXT __info_plist $(INFOPLIST_FILE)

 

參考:https://red-sweater.com/blog/2083/the-power-of-plist原理

記錄!

相關文章
相關標籤/搜索