Создание обратно совместимого приложения OS X, когда появится новый API? - PullRequest
8 голосов
/ 10 сентября 2009

Я пытаюсь обновить приложение ( Clarke ), чтобы обеспечить совместимость с 10.6.

Мой план состоит в том, чтобы использовать два разных пути кода в зависимости от используемой версии OSX.

На 10.5 он будет использовать один контроллер, который состоит из полностью пользовательского кода, который не зависит от какого-либо конкретного API Какао. На 10.6 он будет использовать другой контроллер, который упаковывает новый API CoreLocation в идентичный интерфейс, основанный на том же абстрактном классе. Во время выполнения приложение будет переключаться между контроллерами, определяя версию ОС.

Это прекрасно работает на 10.6, собранной для 10.6 SDK, но та же самая сборка взорвана на 10.5 с:

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 

Если я соберу для 10.5 SDK, он не сможет скомпилировать CoreLocation, очевидно.

Я надеялся, что смогу предоставить один двоичный файл для этого приложения. Есть ли способ «спрятать» CoreLocation API от 10.5?

Ответы [ 2 ]

5 голосов
/ 22 сентября 2009

Уловка Deployment SDK работает только в том случае, если у вас одинаковая платформа на обеих платформах, но новые вызовы на более новой. В CoreLocation вся среда отсутствует на 10.5, поэтому ваше приложение не сможет загрузиться, поскольку оно не может динамически привязываться к среде.

Вы должны сделать вышеупомянутое, плюс добавить CoreLocation как слабый фреймворк. Выберите фазу сборки Link Frameworks и Binaries, найдите CoreLocation в подробном представлении и в средней колонке измените «Обязательно» на «Слабый».

Когда вы создаете свое приложение, Xcode передает -weak_framework CoreLocation компоновщику, и ваше приложение будет загружаться на все системы 10.5 и 10.6 независимо от того, присутствует ли CoreLocation. Однако вы должны убедиться, что не вызываете какие-либо методы CoreLocation, если вы на самом деле не работаете на 10.6.

4 голосов
/ 10 сентября 2009

Вы сможете решить эту проблему, изменив настройки сборки вашей цели:

  1. Установите базовый SDK на 10,6
  2. Установите для пакета развертывания 10,5
...