¿Construyendo una aplicación OS X compatible con versiones anteriores, cuando hay una nueva API presente?

StackOverflow https://stackoverflow.com/questions/1406645

Pregunta

Estoy intentando actualizar una aplicación ( Clarke ) para proporcionar compatibilidad con 10.6.

Mi plan es usar dos rutas de código diferentes dependiendo de la versión de OSX en uso.

En 10.5 usará un controlador, que consiste en un código completamente personalizado que no depende de ninguna API específica de Cocoa. En 10.6 usará otro controlador, que envuelve la nueva API CoreLocation en una interfaz idéntica, basada en la misma clase abstracta. En el tiempo de ejecución, la aplicación cambiará entre los controladores al detectar la versión del sistema operativo.

Esto funciona bien en 10.6 creado para el SDK 10.6, pero la misma compilación explota en 10.5 con:

10/09/2009 18:30:50 [0x0-0x12f12f].uk.co.tomtaylor.Clarke[4575] dyld: unknown required load command 0x80000022 
10/09/2009 18:30:51 com.apple.launchd[403] ([0x0-0x12f12f].uk.co.tomtaylor.Clarke[4575]) Exited abnormally: Trace/BPT trap 

Si compilo para 10.5 SDK, obviamente no puede compilar las cosas de CoreLocation.

Esperaba poder proporcionar un único binario para esta aplicación. ¿Hay alguna forma de "ocultar" la API CoreLocation de 10.5?

¿Fue útil?

Solución

Debería poder resolver este problema cambiando la configuración de compilación de su objetivo:

  1. Establezca el SDK base en 10.6
  2. Establezca el SDK de implementación en 10.5

Otros consejos

El truco de Deployment SDK funciona solo cuando tienes el mismo marco en ambas plataformas pero nuevas llamadas en la más reciente. Para CoreLocation, falta el marco completo en 10.5, por lo que la aplicación no se cargará porque no puede vincularse dinámicamente con el marco.

Debe hacer lo anterior, además de agregar CoreLocation como un marco débil. Seleccione la fase de compilación de marcos de enlaces y binarios, busque CoreLocation en la vista de detalles y, en la columna central, cambie " Requerido " a " Débil "

Cuando construyas tu aplicación, Xcode pasará -weak_framework CoreLocation al vinculador, y tu aplicación se cargará en todos los sistemas 10.5 y 10.6, independientemente de si CoreLocation está presente. Depende de usted asegurarse de no llamar a ningún método de CoreLocation a menos que esté ejecutando la versión 10.6, sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top