2012-09-01 58 views
6

進行通信我已經完全按照Apple提供的Sandboxed Helper App示例進行操作,並且所有程序似乎都運行良好。我能夠成功創建一個NSXPCConnection對象,並且還可以取回我的遠程對象(通過remoteObjectProxyWithErrorHandler)。幫助者mac應用程序(登錄項)無法與

然而,當我打電話代理對象(在協議定義中定義)上的方法,我回來這個錯誤:

Failed to connect to launch agent: Error Domain=NSCocoaErrorDomain Code=4099 "Couldn’t communicate with a helper application. 

基本上沒有不管我做什麼,我不能與溝通我幫手應用程序。我沒有做任何事情,只是試圖簡單地調用幫助器應用程序到NSLog()。但它不起作用。奇怪的是我也沒有看到任何內部輸出:

- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection 

我可能會做錯什麼?

更新: 顯然,如果我取消選中「啓用應用程序沙盒」我的主應用程序,它的工作原理!所以,在啓用沙盒之後,它不想與我的幫助程序通信。我需要更多權利嗎?我已經在xcode下全部嘗試過了!

+0

如果你打開控制檯,你是否得到沙盒mach查找違規? – Samir

+0

不,但我找到了一個解決方案,下面解釋 – strange

回答

12

您的幫助程序是沙盒。因此,儘管Xcode允許將其用於調試目的,但它不能動態註冊mach服務。

但是,當您將助手應用程序添加到登錄項目(使用SMLoginItemSetEnabled())時,launchd將自動爲您註冊一個名爲其包標識符的mach服務。

現在你的主應用程序是沙盒。因此,不允許隨機的馬達通訊。使其工作的唯一方法是添加一個臨時查詢權限。

自10.7.4。 Apple將這些應用程序組權利作爲解決方案引入了這種情況,應用程序需要與助手應用程序進行通信。

這兩個應用程序必須共享相同的應用程序組權利。它可以是任何值,但Apple要求此值必須以Team-ID開頭(例如:Team-id.myApp)。然後,您的幫助器應用程序包標識符必須以相同的權利(例如Team-id.myApp.myHelperApp)開頭。之後,您的主應用程序可以使用與使用助手應用程序包標識符(即Team-id.myApp.myHelperApp)命名的服務進行XPC通信來與幫助程序應用程序自由通信。此外,這兩個應用程序將共享對使用應用程序組權限(例如〜/ Library/Group Containers/Team-id)命名的組容器文件夾的訪問權限。myApp),如果您需要它,您必須手動創建。

+0

我已將您的答覆標記爲對問題的正確答案。儘管我的努力使我得到了同樣的發現,但你已經很好地解釋了它。現在唯一的問題是,使用Xcode 5.0時,它不會對我的幫助程序代碼進行編碼並且抱怨TEAM-ID.com.mycompany.myapp與'com.mycompany.myapp'預配置文件不匹配。我不知道如何解決這個問題。 – strange

+0

我有點進一步,我可以在Xcode 5中對代碼簽名,並且它可以啓動,並且可以通過XPC進行通信,但內核會發布代碼簽名錯誤,儘管代碼簽名在可執行文件上顯示有效簽名。此外,嘗試附加到助手崩潰Xcode(已報告bugr​​eporter) – ctpenrose

4

好吧,我已經學會了很難的方法 - Sandboxing和XPC有很多問題,更不用說助手應用程序和使用所謂的「共享組目錄」共享數據庫,而這些數據庫既不會自動創建(因爲文檔不正確說)也不NSURL提供它在文檔中聲稱的方法。

雖然文件說,在授權您可以指定任何字符串作爲格式<TEAM_ID>.whatever的「共享應用標識符」,顯然它只會如果你使用的格式工作:<TEAM_ID>.com.yourcompany

別的和它贏得沒有工作。它會編譯,它會存檔,它會運行,但它不會讓你談到你的幫手應用程序。花了大約30個小時後,我覺得我會嘗試最後一個變化,顯然就是這樣!在可怕的書面沙盒文件(這在蘋果的開發人員論壇上很多抱怨)提交雷達...

+2

關於xpc連接的一個有價值的信息來源是手冊頁(在您的終端中輸入man xpc_connection_create) – Samir

+0

@strange您是否可以看看我關於此問題的問題,並查看是否您可以幫助我 - 請參閱:AVPlayer不會讓我訪問網址 –