Простой способ определить, использую ли я фреймворк, недоступный для старых iOS

После сеанса марафонского кодирования, когда я добавил слишком много кода, не отслеживая все, у меня теперь есть приложение, которое, вероятно, имеет некоторые перечисления, вызовы и инфраструктуры для iOS 5.0 и 5.1, однако я хочу, чтобы мое приложение поддерживало iOS вернуться к 4.3.

Я надеялся, что существует простой способ настроить Xcode для компиляции так, как если бы он компилировался для iOS 4.3, чтобы я мог получать ошибки для всего кода, вызывающего сбой, который необходимо обработать и /или альтернативно закодировать , для старых iOS.

Я думал, что получу это, используя опцию компилятора:

-D__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_3

но это приводит к генерации ошибки в системных заголовочных файлах, а не в моем коде.

Учитывая, что доступность большинства перечислений и сред включена в заголовочные файлы, я должен думать, что есть простой способ сделать то, что мне нужно.

Кому-нибудь удалось сделать это, не прибегая к загрузке старых кодов X со старыми SDK? Там я могу столкнуться с проблемой X-кодов, которые не будут работать должным образом под Lion (это то, что я запускаю).

ОБНОВЛЕНИЕ: кажется, что я не могу установить Xcode 3.2.6 на Lion. Теперь мне нужно будет найти Snow Leopard Mac, если только я не найду способ использовать параметры компилятора или заставить Xcode использовать старые SDK ...

Вот пример того, что ответ @ mattjgalloway сделал для меня:

Lumin App Group

/Users/mz/Dev/Working/Lumin/Lumin/MyUIScreen.m

  • «Яркость» устарела: СЛИШКОМ НОВЫЙ!
  • «Яркость» устарела: СЛИШКОМ НОВЫЙ!
  • «Яркость» устарела: СЛИШКОМ НОВЫЙ!
  • «Яркость» устарела: СЛИШКОМ НОВЫЙ!

/Users/mz/Dev/Working/Lumin/Lumin/LuminViewController+Share.m

  • «TWTweetComposeViewController» устарела: СЛИШКОМ НОВОЕ!
  • «TWTweetComposeViewController» устарела: СЛИШКОМ НОВОЕ!
  • «TWTweetComposeViewController» устарела: СЛИШКОМ НОВОЕ!

/Users/mz/Dev/Working/Lumin/Lumin/LuminViewController.m

  • «scrollView» устарела: СЛИШКОМ НОВОЕ!
  • 'connectionWithMediaType:' устарело: СЛИШКОМ НОВОЕ!
  • 'connectionWithMediaType:' устарело: СЛИШКОМ НОВОЕ!
  • «AVCaptureDeviceSubjectAreaDidChangeNotification» устарело: СЛИШКОМ НОВОЕ!
  • 'setSubjectAreaChangeMonitoringEnabled:' устарело: СЛИШКОМ НОВОЕ!

Очень мило.

Я поместил следующее в файл моего проекта .pch и планирую сделать это для всех проектов:

#if DEBUG
#define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_OS_VERSION_MIN_REQUIRED
#import "MJGAvailability.h"
#endif

Теперь для любого проекта я автоматически отслеживаю проблемы с SDK на основе самой ранней версии iOS, на которую я нацеливался. Хотя все еще могут быть изменения в SDK, о которых я должен беспокоиться, по крайней мере, я знаю о большинстве дополнений фреймворка, которые недоступны в более старых версиях iOS.

7 голосов | спросил mahboudz 16 PMpMon, 16 Apr 2012 14:25:09 +040025Monday 2012, 14:25:09

2 ответа


0

Посмотрите на мой MJGAvailability.h здесь, на GitHub . По сути, он определяет правильный препроцессор #define, чтобы новые API выглядели как устаревшие, поэтому вы получите предупреждение компилятора. В верхней части файла есть некоторая документация, но в основном вы просто делаете это в своем файле PCH:

#define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_4_3
#import "MJGAvailability.h"

Если вы хотите поддерживать до iOS 4.3.

Это, конечно, не на 100% надежно, но я считаю, что это невероятно полезно для выполнения того, что вы просите.

Если вы хотите отключить предупреждение, потому что, возможно, вы знаете, что использовать этот API можно (вы окружили его respondsToSelector например) тогда вы можете сделать что-то вроде этого:

UINavigationBar *navBar = self.navigationController.navigationBar;
if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    [navBar setBackgroundImage:[UIImage imageNamed:@"navbar_bg.png"] forBarMetrics:UIBarMetricsDefault];
#pragma clang diagnostic pop
}
ответил mattjgalloway 18 AMpWed, 18 Apr 2012 01:33:05 +040033Wednesday 2012, 01:33:05
0

К сожалению, полностью взорвал этот ответ в первый раз. Давайте попробуем это снова ...

  • Deployment Target устанавливает самую низкую версию ОС, с которой вы будете работать.
  • SDK устанавливает максимальную версию ОС, с которой вы будете работать

Между Deployment Target и SDK вы должны условно проверить API. См. Руководство по совместимости SDK для подробности об этом.

Возможно, вы просто хотите использовать старый SDK.

Самый простой способ использовать старые SDK с более новыми версиями - сохранить копию каталога .sdk и скопировать его в новую версию при обновлении.

Тем не менее, вы также можете скачать старые материалы. Apple просто скрывает это. Начните с загрузок для разработчиков Apple . Найдите копию Xcode, которую вы хотите. Загрузите Xcode 4.1 для Snow Leopard; это включает iOS SDK 4.3. Вы можете установить его параллельно с Xcode 4.3, но это не обязательно. Смонтируйте диск. Откройте терминал (так проще). Перейдите в /Volumes /Xcode /Packages. Там вы найдете все SDK.

Вы можете попробовать установить его напрямую, и это может или не может работать для вас. Вы также можете распаковать .pkg и получить нужные файлы. Обычно я использую программу под названием Unarchiver . Он может распаковывать что угодно. Это даст вам каталог, который включает в себя файл под названием «Полезная нагрузка». Если дважды щелкнуть по нему, он развернется (это просто tar.gz, в который расширение не включено). Это даст вам каталог платформ. Скопируйте это в каталог Платформ в своей копии XCode, и Вы должны быть золотыми.

После всего сказанного, когда у меня достаточно хорошо работает система, я обычно возвращаюсь к компиляции с последним и использованию цели развертывания. Это облегчает сотрудничество с другими, у которых нет старого SDK. И Apple может или не может отклонить из-за связи со старым SDK. Они сделали это в прошлом; Я не знаю текущей ситуации там (не имел это придумало некоторое время). Но я бы порекомендовал представить что-то построенное против последних.

ответил Rob Napier 18 AMpWed, 18 Apr 2012 01:39:39 +040039Wednesday 2012, 01:39:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132