2012-09-01 8 views
6

Ho fatto esattamente come l'esempio di Sandboxed Helper App fornito da Apple e tutto sembra funzionare correttamente. Sono in grado di creare correttamente un oggetto NSXPCConnection e anche di recuperare il mio oggetto remoto (tramite remoteObjectProxyWithErrorHandler).Helper mac app (Login Item), impossibile comunicare con

Tuttavia quando chiamo un metodo sull'oggetto proxy (definito nella definizione Protocol), torno questo errore:

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

In sostanza, non importa quello che faccio io non sono in grado di comunicare con la mia app di supporto Non sto facendo niente di speciale, sto solo cercando di fare una semplice chiamata all'app helper su NSLog() qualcosa. Ma non funziona. Stranamente anche io non vedo alcuna uscita da dentro:

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

Cosa potrei fare male?

AGGIORNAMENTO: Apparentemente se deseleziono 'Abilita applicazione sandboxing' sulla mia app principale, funziona! Quindi c'è qualcosa di sbagliato nell'abilitare il sandboxing dopo il quale non vuole comunicare con la mia app helper. Ho bisogno di più diritti? Li ho provati tutti con xcode!

+0

Se si apre la console, si ottiene una violazione della ricerca della sandbox mach? – Samir

+0

No, ma ho trovato una soluzione, spiegata sotto – strange

risposta

12

L'applicazione di supporto è in modalità sandbox. Pertanto, non può registrare un servizio mach in modo dinamico, sebbene Xcode lo consenta per scopi di debug.

Tuttavia, quando si aggiunge l'applicazione di supporto agli elementi di accesso (utilizzando SMLoginItemSetEnabled()), launchd registrerà automaticamente un servizio Mach per il proprio nome con il relativo identificatore del gruppo.

Ora l'applicazione principale è in modalità sandbox. Pertanto, la comunicazione casuale a macchina non è consentita. L'unico modo per farlo funzionare era aggiungere un permesso di ricerca mach temporaneo.

Dal 10.7.4. Apple ha introdotto i diritti dei gruppi di applicazioni come soluzione per questo caso, in cui un'applicazione deve comunicare con un'app helper.

Entrambe le applicazioni devono condividere gli stessi diritti dei gruppi di applicazioni. Può essere qualsiasi valore, ma Apple richiede che questo valore debba iniziare con il tuo ID di squadra (ad esempio Team-id.myApp). Quindi, l'identificatore del bundle dell'applicazione di supporto deve iniziare con la stessa autorizzazione (ad esempio Team-id.myApp.myHelperApp). Successivamente, l'applicazione principale può comunicare liberamente con l'applicazione di supporto utilizzando una comunicazione XPC con il servizio denominato con l'identificativo del bundle dell'applicazione di supporto (ad esempio Team-id.myApp.myHelperApp). Inoltre, le due applicazioni condivideranno l'accesso a una cartella contenitore di gruppo denominata con diritto al gruppo di applicazioni (ad es. ~/Libreria/Contenitori di gruppo/ID team.myApp), che devi creare manualmente se ne hai bisogno.

+0

Ho contrassegnato la tua risposta come la risposta corretta al problema. Sebbene i miei sforzi mi portino alla stessa scoperta, tu l'hai spiegato molto bene. L'unico problema ora è che con Xcode 5.0 non codificherà la mia app di supporto e si lamenterà che TEAM-ID.com.mycompany.myapp NON corrisponde al profilo di provisioning 'com.mycompany.myapp'. Non ho idea di come risolvere questo problema. – strange

+0

Sono un po 'più lontano, posso firmare il codice dell'helper in Xcode 5, e si avvia e posso comunicare tramite XPC, ma il kernel pubblica errori di firma del codice nonostante il codesign mostri una firma valida sull'eseguibile. Inoltre, tenta di associare l'helper al crash Xcode (già segnalato a bugreporter) – ctpenrose

4

Okay, quindi ho imparato a fondo: ci sono un sacco di problemi con Sandboxing e XPC per non parlare delle app helper e dei database di condivisione usando la cosiddetta "directory di gruppo condivisa" che non viene creata automaticamente (come la documentazione in modo errato dice) né lo NSURL offre il metodo che afferma nella documentazione.

Sebbene la documentazione dice che i diritti è possibile specificare qualsiasi stringa come 'identificatore applicazione condivisa' nel formato <TEAM_ID>.whatever, a quanto pare sarà solo funziona se si utilizza il formato: <TEAM_ID>.com.yourcompany

Tutto il resto e ha vinto lavorare Si compilerà, verrà archiviato, verrà eseguito ma non ti consentirà di parlare con l'app di supporto. Dopo aver passato circa 30 ore ho pensato di provare quell'ultima modifica e apparentemente era così! Presentando un radar sulla documentazione sandboxing orribilmente scritta (che molto sul Forum degli sviluppatori Apple si lamenta) successiva ...

+2

Una preziosa fonte di informazioni sulle connessioni xpc è la pagina man (digita man xpc_connection_create nel tuo terminale) – Samir

+0

@strange puoi guardare la mia domanda su SO su questo stesso problema e vedere se puoi aiutarmi - vedi: AVPlayer non mi consente di accedere all'URL –

Problemi correlati