Eine rückwärtskompatible OS X-App erstellen, wenn eine neue API vorhanden ist?

8

Ich versuche, eine App ( Clarke ) zu aktualisieren, um Kompatibilität mit 10.6 zu gewährleisten.

Ich plane, abhängig von der verwendeten OSX-Version zwei verschiedene Codepfade zu verwenden.

Unter 10.5 wird ein Controller verwendet, der vollständig benutzerdefinierten Code enthält, der nicht von einer bestimmten Cocoa-API abhängig ist. Am 10.6 wird es einen anderen Controller verwenden, der die neue CoreLocation API in einer identischen Schnittstelle umschließt, basierend auf derselben abstrakten Klasse. Zur Laufzeit wechselt die App zwischen den Controllern, indem sie die Betriebssystemversion erkennt.

Dies funktioniert gut mit 10.6, das für das 10.6 SDK erstellt wurde, aber der selbe Build explodiert auf 10.5 mit:

%Vor%

Wenn ich für 10.5 SDK baue, kann das CoreLocation-Zeug natürlich nicht kompiliert werden.

Ich hatte gehofft, eine einzige Binärdatei für diese Anwendung bereitstellen zu können. Gibt es eine Möglichkeit, die CoreLocation API von 10.5 zu "verstecken"?

    
tomtaylor 10.09.2009, 17:35
quelle

2 Antworten

4

Sie können dieses Problem lösen, indem Sie die Build-Einstellungen Ihres Ziels ändern:

  1. Setzen Sie das Base SDK auf 10.6
  2. Setzen Sie das Deployment SDK auf 10.5
Markus Müller 10.09.2009, 17:43
quelle
5

Der Trick mit dem Implementierungs-SDK funktioniert nur, wenn Sie auf beiden Plattformen das gleiche Framework, aber im neueren Framework über neue Aufrufe verfügen. Für CoreLocation fehlt das gesamte Framework in Version 10.5, sodass Ihre App nicht geladen werden kann, da sie nicht dynamisch an das Framework binden kann.

Sie müssen die obigen Schritte durchführen und CoreLocation als schwaches Framework hinzufügen. Wählen Sie die Build-Phase Link-Frameworks und Binaries aus, suchen Sie CoreLocation in der Detailansicht und ändern Sie in der mittleren Spalte "Erforderlich" in "Schwach".

Wenn Sie Ihre App erstellen, übergibt Xcode CoreLocation -weak_framework an den Linker und Ihre App wird auf alle 10.5- und 10.6-Systeme geladen, unabhängig davon, ob CoreLocation vorhanden ist. Es liegt an Ihnen, sicherzustellen, dass Sie keine CoreLocation-Methoden aufrufen, es sei denn, Sie laufen tatsächlich auf 10.6.

    
cdespinosa 22.09.2009 04:33
quelle