J'essaye de mettre à jour une application (Clarke) pour fournir la compatibilité 10.6.Construire une application OS X rétrocompatible, lorsqu'une nouvelle API est présente?
Mon plan consiste à utiliser deux chemins de code différents en fonction de la version d'OSX utilisée.
Sur 10.5 il utilisera un contrôleur, qui consiste en un code complètement personnalisé qui ne dépend d'aucune API Cocoa spécifique. Sur 10.6, il utilisera un autre contrôleur, qui enveloppe la nouvelle API CoreLocation dans une interface identique, basée sur la même classe abstraite. Au moment de l'exécution, l'application va basculer entre les contrôleurs en détectant la version du système d'exploitation.
Cela fonctionne très bien sur 10.6 construit pour le SDK 10.6, mais la même construction explose sur 10,5 avec:
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 je construis pour 10,5 SDK, il ne peut pas compiler les choses CoreLocation, évidemment.
J'avais espéré être capable de fournir un seul binaire pour cette application. Y a-t-il un moyen de «cacher» l'API CoreLocation de 10.5?
Ceci est la méthode correcte mais il y a plus: Lorsque vous devez appeler des API qui sont en 10.6 mais pas en 10.5, vous devez obtenir le nom de classe en utilisant NSClassFromString(). Ensuite, vérifiez si le nom de classe renvoyé est valide ou non. Si c'est valide, vous pouvez aller de l'avant et appeler les API dont vous avez besoin. Sinon, vous devrez basculer gracieusement. – Jasarien