Несовместимость Xcode 4.5 и iOS 4.2.1

Последние заметки о выпуске указывают, что 4.2.1 и ниже не будут поддерживаться, теперь мы должны использовать 2 версии Xcode для разработки при поддержке старых устройств. Это будет трудно поддерживать старые устройства, если мы хотим разработать iOS6 и поддержку 4.2 и ниже.

Я не думаю, что Xcode 4.4 будет поддерживать iOS6. Так что это проблема. Как разработчики могут легко поддерживать эти платформы без особых хлопот?

6 ответов

Решение

Вы можете сделать это, но это требует небольшого взлома Xcode и некоторых жертв. В зависимости от того, что вы подразумеваете под "поддержкой iOS 6", этого может быть или не быть достаточно для вас. Если вы просто хотите, чтобы ваше приложение работало на iOS 6, то это должно сработать. Если вам также нужно, чтобы ваше приложение включало новые функции iOS 6, оно не будет.

(Примечание для тех, у кого нет проблем с использованием нескольких версий XCode: на этот похожий вопрос есть ответы, которые позволяют вам также использовать новые API iOS 6 и напрямую ориентироваться на armv7s)

Смотрите основные инструкции в блоге chpwn здесь (но прочитайте и остальную часть этого ниже!)

По сути, вы можете использовать Xcode 4.5 для сборки под iOS 4 и выше, но тогда вы не сможете воспользоваться преимуществами только новых функций iOS 6. Итак, вы действительно разрабатываете для iOS 4 и 5 и предполагаете, что приложение будет нормально работать на iOS 6 (что должно быть правдой, но вам нужно будет проверить это самостоятельно).

Вам нужно будет скопировать папку iOS 5 SDK

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.*.sdk

от старой установки XCode (которую вы должны будете кратко сохранить или переустановить в нестандартное место). Затем вы установите для параметра " Развернуть цель" в настройках сборки значение iOS 4.0 (или любую другую минимальную ОС, которую вы хотите). Вам может понадобиться открыть project.pbxproj файл в текстовом редакторе, чтобы установить это вручную:

IPHONEOS_DEPLOYMENT_TARGET = 4.0;

Вы также должны будете установить Архитектуры в armv6 а также armv7, Вы не можете напрямую нацеливаться armv7s, Но это не значит, что ваше приложение не будет работать на iPhone 5. armv7 исполняемые файлы должны запускаться на iPhone 5, просто без каких-либо оптимизаций, добавленных в armv7s, Просто совместимость не работает в другом направлении (например, armv7 исполняемые файлы не работают на armv6 iPhone 3G).

Там также может быть необходимым шаг, который не упоминается в блоге chpwn. Вы можете получить эти предупреждения (которые действительно являются ошибками, потому что XCode не будет генерировать ваш исполняемый файл должным образом):

предупреждение: нет правила для обработки файла '$(PROJECT_DIR)/main.m' типа sourcecode.c.objc для архитектуры armv6

Чтобы это исправить, вам нужно установить собственное правило сборки для вашей цели, которое говорит Xcode использовать LLVM GCC 4.2 для генерации кода armv6. Определите правило для файлов, соответствующих шаблону *.[mc]:

Это будет компилятор, отличный от Xcode по умолчанию, и вам может потребоваться настроить синтаксис в коде Objective-C. Хотя многие люди, желающие сделать это, вероятно, написали свои приложения до ARC, важно отметить, что LLVM gcc 4.2 не поддерживает ARC.

Наконец, вы, вероятно, по-прежнему будете видеть предупреждения от XCode о целях развертывания iOS менее 4.3, и armv6 не поддерживается Те, которые я обнаружил, не были проблемами и могли быть проигнорированы:

Бег lipo -info в моем приложении исполняемый файл после этого показывает желаемый результат:

lipo -info MyAppName
Architectures in the fat file: MyAppName are: armv6 armv7 

Xcode 4.5 делает iOS 4.3 самой ранней из поддерживаемых операционных систем, которая эффективно теряет оригинал iPhone и 3G.

Если вы хотите поддерживать версии iOS более ранние, чем 4.3, вам нужно будет поддерживать версию Xcode 4.4.

Чтобы быть немного понятнее: вы не можете легко (что означает, что XCode не из коробки) поддерживает устройства до 4.3 и использовать функции iOS 6 в том же приложении. Это связано с тем, что для функций iOS 6 требуется XCode 4.5, который также устанавливает iOS 4.3 в качестве минимально поддерживаемой ОС.

Итак, у вас есть 3 варианта:

  1. Продолжайте использовать XCode 4.4. Вы сможете использовать iOS до 4.3. Вы не сможете воспользоваться функциями iOS 6, но ваше приложение должно нормально работать на нем, если вы выполняете адекватное тестирование на реальных устройствах iOS 6.
  2. Перейдите на XCode 4.5. Вы не сможете настроить таргетинг на iOS до версии 4.3, но сможете воспользоваться функциями iOS 6.
  3. Сделайте две версии своего приложения. Постройте одну версию с XCode 4.4 (как в варианте 1), а другую - с 4.5 (как в варианте 2). С точки зрения распространения, это будут 2 отдельных приложения, каждое из которых будет иметь свой собственный идентификатор пакета и т. Д. У вас будет две записи в магазине приложений.

Если вам удобно выходить за рамки того, что поддерживается непосредственно XCode, см. Ответ Нейта.

Я предполагаю, что отказ от поддержки iOS 4.2.1 не является основной проблемой. На самом деле я попытался обойти это и сделать следующее:

  • Создайте приложение с помощью iOS 6 SDK, установив цель развертывания на iOS 4.2.1 (что работает).
  • Упакуйте приложение для специальной установки и установите приложение на устройство iOS 4.2.1 (iPod touch 2G).
  • Протестируйте приложение.

Однако установка не удалась. Причина здесь - afaik - не версия для iOS. Причина в архитектуре. XCode 4.5 больше не позволяет строить для armv6. Он собирается только для armv7. С другой стороны: все устройства с armv7 или выше могут работать под управлением iOS 5. Единственными устройствами, которые не поддерживают armv7, являются iPhone, iPhone 3G, iPod touch 1G и iPod touch 2G.

Так что для меня вопрос: вы можете собрать для armv6 с XCode 4.5 и iOS 6 в качестве базового SDK?

Изменить: что вы не можете сделать, потому что базовый SDK для iOS 6 не доступен для armv6. Правильно?

Оригинальные iPhone и iPhone 3G - единственные устройства, которые не поддерживают iOS 5. Сейчас iPhone 3G уже 4 года. Возможно, вы захотите отказаться от поддержки iOS 4. Если вы не хотите этого делать, я думаю, вам придется разрабатывать две разные версии Xcode.

Попробуйте установить настройки проекта вручную, используя IPHONEOS_DEPLOYMENT_TARGET=4.0, Тем не менее, я не знаю, есть ли побочный эффект.

Я думаю, что нацеливание на 4.3 - лучший выбор, согласно статистике версий ios

Другие вопросы по тегам