在MacOSX下的.app是一個程序包(實際上是個目錄),雙擊該目錄時系統會根據包的目錄結構啟動相應的可執行程序。.app的程序默認是單實例運行的,所以從.app啟動的程序實例只有一個(可執行程序不受該規則影響),操作系統根據Bundle identifier 做互斥處理。
如果你的.app支持多個參數啟動不同的模塊且都是跟窗口相關,那么在啟動第二個.app的時候會自動激活第一個程序實例的窗口而不是再啟動一個程序實例。
在Google查閱相關資料,得出的結論是
open -n /Applications/xxx.app
沒有辦法解決鼠標雙擊啟動的問題,比如已經有個后台界面(不顯示)程序在運行。雙擊后.app包后,已運行的程序會接收到applicationShouldHandleReopen消息,第二個程序並不啟動。通過參考TeamViewer的二進制程序,通過不斷的調試終於了解一點MacOSX的程序啟動原理:
1. 程序包(Bundle)啟動時互斥的,也就是正常的啟動是只啟動一個唯一實例,如果想啟動多個只能通過以上的方式啟動多個。
2. 即使給同一個程序包下的不同程序指定一個不同的Bundle identifier,如果都在同一Contents/MacOSMacOS下,正常啟動結果還是唯一實例。
3. 即使給同一個程序包下的不同程序指定一個不同的Bundle identifier,且不在同一Contents/MacOS目錄下,啟動OK。
如何給程序指定不同的Bundle identifier?
增加鏈接選項(Other Link flags):
-sectcreate __TEXT __info_plist $(INFOPLIST_FILE)
參考:https://red-sweater.com/blog/2083/the-power-of-plist
記錄!