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

StackOverflow https://stackoverflow.com/questions/1406645

Вопрос

Я пытаюсь обновить приложение ( 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.

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

Это было полезно?

Решение

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

<Ол>
  • Установите базовый SDK на 10,6
  • Установите для пакета развертывания 10,5
  • Другие советы

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top