Создание обратно совместимого приложения OS X, когда появится новый API?
-
05-07-2019 - |
Вопрос
Я пытаюсь обновить приложение ( 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?
Решение
Вы сможете решить эту проблему, изменив настройки сборки своей цели:
<Ол>Другие советы
Уловка Deployment SDK работает только в том случае, если у вас одинаковая платформа на обеих платформах, но новые вызовы на более новой. В CoreLocation вся среда отсутствует на 10.5, поэтому ваше приложение не сможет загрузиться, поскольку оно не может динамически привязываться к среде.
Вы должны сделать выше, а также добавить CoreLocation в качестве слабой структуры. Выберите фазу сборки Link Frameworks и Binaries, найдите CoreLocation в подробном представлении и в средней колонке измените " Требуется " «Слабый». Р>
Когда вы создаете свое приложение, Xcode передает -weak_framework CoreLocation компоновщику, и ваше приложение будет загружаться на все системы 10.5 и 10.6 независимо от того, присутствует ли CoreLocation. Однако вы должны убедиться, что не вызываете какие-либо методы CoreLocation, если вы на самом деле не работаете на 10.6.