2009-09-10 12 views
8

Sto tentando di aggiornare un'app (Clarke) per fornire la compatibilità 10.6.Creazione di un'app OS X compatibile con le versioni precedenti, quando è presente una nuova API?

Il mio piano prevede l'utilizzo di due percorsi di codice diversi a seconda della versione di OSX in uso.

Il 10.5 utilizzerà un controller, che consiste in un codice completamente personalizzato che non dipende da alcuna API Cocoa specifica. Il 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 passa da un controller all'altro rilevando la versione del sistema operativo.

Questo funziona bene su 10.6 costruito per il 10,6 SDK, ma la stessa corporatura soffia 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 io costruisco il 10,5 SDK non può compilare il programma CoreLocation, ovviamente.

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

risposta

4

Dovreste essere in grado di risolvere questo problema modificando le impostazioni di generazione del vostro target:

  1. Impostare l'SDK Base per 10,6
  2. Impostare l'SDK di distribuzione per 10,5
+4

Questo è il metodo corretto ma c'è dell'altro: Quando è necessario chiamare le API che sono in 10.6 ma non 10.5 è necessario ottenere il nome della classe utilizzando NSClassFromString(). Quindi verifica se il nome della classe restituito è valido o meno. Se è valido, puoi andare avanti e chiamare le API di cui hai bisogno. In caso contrario, dovrai eseguire il failover con grazia. – Jasarien

5

Il Deployment Il trucco dell'SDK funziona solo quando hai lo stesso framework su entrambe le piattaforme, ma le nuove chiamate in quello più recente. Per CoreLocation, l'intero framework manca in 10.5, quindi la tua app non verrà caricata perché non può legarsi dinamicamente al framework.

È necessario eseguire quanto sopra, inoltre aggiungere CoreLocation come framework debole. Seleziona la fase di costruzione dei tuoi Link Framework e dei tuoi binari, trova CoreLocation nella vista Dettagli, e nella colonna centrale cambia "Required" in "Weak".

Quando si crea l'app, Xcode passerà -weak_framework CoreLocation al linker e l'app verrà caricata su tutti i sistemi 10.5 e 10.6 indipendentemente dal fatto che CoreLocation sia presente. Spetta a te assicurarti di non chiamare alcun metodo di CoreLocation a meno che tu non stia eseguendo effettivamente il 10.6, comunque.

+0

È -weak_framework, piuttosto che -weak-framework – AlBlue

Problemi correlati