Domanda

Sto cercando di aggiornare un'app ( Clarke ) per fornire la compatibilità 10.6.

Il mio piano è di usare due percorsi di codice diversi a seconda della versione di OSX in uso.

Su 10.5 utilizzerà un controller, che consiste in un codice completamente personalizzato che non dipende da alcuna API Cocoa specifica. Su 10.6 utilizzerà un altro controller, che avvolge la nuova API CoreLocation in un'interfaccia identica, basata sulla stessa classe astratta. In fase di esecuzione l'app passerà da un controller all'altro rilevando la versione del sistema operativo.

Funziona bene su 10.6 creato per l'SDK 10.6, ma la stessa build esplode su 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 

Se costruisco per l'SDK 10.5 non è in grado di compilare il materiale CoreLocation, ovviamente.

Speravo di essere in grado di fornire un singolo binario per questa applicazione. C'è un modo per "nascondere" l'API CoreLocation dalla 10.5?

È stato utile?

Soluzione

Dovresti essere in grado di risolvere questo problema modificando le impostazioni di costruzione del tuo obiettivo:

  1. Imposta l'SDK di base su 10.6
  2. Imposta l'SDK di distribuzione su 10.5

Altri suggerimenti

Il trucco dell'SDK di distribuzione funziona solo quando si ha lo stesso framework su entrambe le piattaforme ma nuove chiamate in quella più recente. Per CoreLocation, l'intero framework non è presente su 10.5, quindi l'app non verrà caricata perché non può essere associata in modo dinamico al framework.

Devi fare quanto sopra, oltre ad aggiungere CoreLocation come framework debole. Seleziona la tua fase di costruzione di Link Frameworks e Binaries, trova CoreLocation nella vista Dettagli e nella colonna centrale cambia " Richiesto " a "debole".

Quando crei la tua app, Xcode passerà -weak_framework CoreLocation al linker e la tua app verrà caricata su tutti i sistemi 10.5 e 10.6 indipendentemente dalla presenza di CoreLocation. Sta a te assicurarti di non chiamare alcun metodo CoreLocation a meno che tu non stia effettivamente eseguendo su 10.6.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top