2012-09-01 6 views
6

He hecho exactamente como el ejemplo de aplicación Sandboxed Helper proporcionado por Apple y todo parece funcionar correctamente. Puedo crear con éxito un objeto NSXPCConnection y también recuperar mi objeto remoto (a través de remoteObjectProxyWithErrorHandler).Aplicación Helper mac (elemento de inicio de sesión), no se puede comunicar con

Sin embargo cuando llamo a un método en el objeto proxy (definido en la definición del Protocolo), le regreso este error:

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

Esencialmente no importa lo que hago, no soy capaz de comunicarse con mi aplicación de ayuda No estoy haciendo nada sofisticado, solo trato de hacer una simple llamada a la aplicación de ayuda para NSLog() algo. Pero no funciona. Curiosamente, tampoco veo ninguna salida desde adentro:

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

¿Qué podría estar haciendo mal?

ACTUALIZACIÓN: Aparentemente, si desactivo 'Habilitar aplicación Sandboxing' en mi aplicación principal, ¡funciona! Por lo tanto, hay algo mal con la habilitación de sandboxing después de lo cual no quiere comunicarse con mi aplicación de ayuda. ¿Necesito más derechos? ¡Los he probado todos bajo xcode!

+0

Si abre la consola, ¿obtiene una violación de búsqueda mach de espacio aislado? – Samir

+0

No, pero encontré una solución, explicada a continuación – strange

Respuesta

12

Su aplicación de ayuda es sandbox. Por lo tanto, no puede registrar un servicio mach dinámicamente, aunque Xcode lo permite para fines de depuración.

Sin embargo, cuando agrega su aplicación auxiliar a los elementos de inicio de sesión (utilizando SMLoginItemSetEnabled()), launchd registrará automáticamente un servicio mach para usted nombrado con su identificador de paquete.

Ahora su aplicación principal es sandboxed. Por lo tanto, la comunicación al azar no está permitida. La única forma de hacerlo funcionar era agregar un derecho de búsqueda mach temporal.

Desde 10.7.4. Apple presentó los derechos de los grupos de aplicaciones como una solución para este caso, donde una aplicación necesita comunicarse con una aplicación de ayuda.

Ambas aplicaciones tienen que compartir la misma autorización de grupos de aplicaciones. Puede tener algún valor, pero Apple requiere que este valor comience con su ID de equipo (por ejemplo: Team-id.myApp). Luego, el identificador del paquete de aplicaciones de ayuda debe comenzar con ese mismo derecho (por ejemplo, Team-id.myApp.myHelperApp). Después de eso, su aplicación principal puede comunicarse libremente con su aplicación de ayuda utilizando una comunicación XPC con el servicio nombrado con el identificador del paquete de aplicación auxiliar (es decir, Team-id.myApp.myHelperApp). Además, las dos aplicaciones compartirán el acceso a una carpeta de contenedor de grupo nombrada con el derecho del grupo de aplicaciones (por ejemplo, ~/Library/Group Containers/Team-id.myApp), que debe crear manualmente si lo necesita.

+0

He marcado su respuesta como la respuesta correcta al problema. Aunque mis esfuerzos me llevaron al mismo descubrimiento, lo has explicado muy bien. El único problema ahora es que con Xcode 5.0 no codificará mi aplicación de ayuda y se queja de que TEAM-ID.com.mycompany.myapp NO coincide con el perfil de aprovisionamiento 'com.mycompany.myapp'. No tengo idea de cómo arreglar esto. – strange

+0

Estoy un poco más lejos, puedo firmar con código el ayudante en Xcode 5, y se inicia y puedo comunicarme a través de XPC, pero el núcleo publica errores de firma de código a pesar de que el signo de código muestra una firma válida en el ejecutable. Además, intenta adjuntar al helper Xrash (reportado a bugreporter ya) – ctpenrose

4

De acuerdo, he aprendido por las buenas razones: hay un montón de problemas con Sandboxing y XPC, por no mencionar las aplicaciones de ayuda y el uso compartido de bases de datos utilizando el llamado "directorio de grupos compartidos" que tampoco se crea automáticamente (como la documentación incorrectamente dice) ni NSURL ofrecen el método que reclama en la documentación.

Aunque la documentación dice que en los derechos puede especificar cualquier cadena como el 'identificador de aplicación compartida' en el formato <TEAM_ID>.whatever, al parecer sólo funcionará si se utiliza el formato: <TEAM_ID>.com.yourcompany

Cualquier otra cosa y ganado no funciona Se compilará, se archivará, se ejecutará pero no le permitirá hablar con su aplicación de ayuda. Después de pasar alrededor de 30 horas, pensé que iba a intentar ese último cambio y aparentemente ¡eso fue todo! Presentando un radar en la documentación de sandboxing horriblemente escrita (que se está quejando mucho en el foro de desarrolladores de Apple) próxima ...

+2

Una valiosa fuente de información acerca de las conexiones xpc es la página man (tipo man xpc_connection_create en su terminal) – Samir

+0

@strange podría ver mi pregunta en SO sobre este mismo problema y ver si me puede ayudar - ver: AVPlayer no me deja acceder a la URL –

Cuestiones relacionadas