簡體   English   中英

相關過程目標C之間的溝通

[英]communication between related process objective C

我正在嘗試編寫一個可以啟動另一個應用程序並向其發送消息(json數據)的應用程序。

我可以通過NSTask和NSPipe啟動任務,但是似乎只有這樣才能啟動任務並在Parent中讀取其輸出。 否則的最佳方法是什么? 即啟動任務並向該任務發送消息?

Objective-C中同一台機器上相關/不相關進程之間的最佳通信方式是什么?

提前致謝。

macOS上當前的進程間通信(IPC)的金標准是XPC。 XPC是一種快速,可靠的服務,(相對)易於在Objective-C / Swift中進行設置和使用。 連接后,您的應用程序將獲得一個連接到服務過程中實際對象的代理對象。 在服務中運行代碼所需要做的就是向代理服務器發送一條消息(即[remoteService doSomething:@"with this data"] -消息被神奇地編碼,發送到服務進程並執行。

需要說明的是:這一切很容易,如果你創建一個XPC服務來使用。 XPC服務是您編譯並與應用程序捆綁在一起的子程序。 如果這樣做,那么launchd啟動服務,創建XPC連接並將其連接到應用程序。 您所要做的就是告訴XPC Services API啟動服務並開始調用方法。

您可以在“ 守護程序和服務編程指南”的“ 創建XPC服務”部分中閱讀有關創建XPC服務的全部信息。 還有幾個示例項目說明了如何完成此工作。

如果這符合您的需求,那么您就很好了。

另一方面,如果要啟動任意進程並建立一個XPC連接,事情肯定會變得更加復雜。 實際上,我花了一年的大部分時間來研究這個問題,直到找到解決方案。 蘋果公司沒人會直接告訴我,有一種方法可以做到這一點。 我懷疑這會帶來安全隱患,這是(a)為什么Apple僅使捆綁的XPC服務和命名的XPC服務(已在launchd注冊)易於使用,以及(b)Apple員工不會談論替代連接方法的原因。

我的建議是研究XPC服務。 如果那可以解決您的問題,那么到目前為止,這是最好的解決方案。

如果您絕對必須與通過其他方式(未launchd )啟動的任意進程進行通信,請再次發布,我可以分享詳細信息。 警告:這並非易事,您仍然必須創建已啟動的服務,因此,如果您要避免這種情況,那就很不幸了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM