2009-09-10 5 views
8

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?

Répondre

4

Vous devriez être en mesure de résoudre ce problème en modifiant les paramètres de construction de votre cible:

  1. Réglez le SDK de base à 10,6
  2. Réglez le SDK de déploiement à 10,5
+4

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

5

Le déploiement Le tour du SDK ne fonctionne que lorsque vous avez le même framework sur les deux plates-formes mais de nouveaux appels dans le nouveau. Pour CoreLocation, l'intégralité de l'infrastructure est manquante sur 10.5, de sorte que votre application ne pourra pas être chargée car elle ne peut pas être liée dynamiquement à l'infrastructure.

Vous devez faire ce qui précède, plus ajouter CoreLocation comme un cadre faible. Sélectionnez la phase de construction Link Frameworks and Binaries, recherchez CoreLocation dans la vue détaillée et, dans la colonne du milieu, remplacez «Required» par «Weak». Lorsque vous construisez votre application, Xcode transmettra CoreLocation -weak_framework à l'éditeur de liens, et votre application se chargera sur tous les systèmes 10.5 et 10.6, que CoreLocation soit présent ou non. C'est à vous de vous assurer de ne pas appeler de méthodes CoreLocation sauf si vous utilisez réellement 10.6.

+0

C'est -weak_framework, plutôt que -weak-framework – AlBlue