Как собрать для архитектур armv6 и armv7 с iOS 5

96

В iOS5 Apple отказывается от архитектуры armv6 из ARCHS_STANDARD_32_BIT .

Чтобы сохранить поддержку iPhone3G, я все еще хочу скомпилировать в armv6 даже в iOS5.

Кто-нибудь нашел для этого решение?

iGranDav
источник

Ответы:

96

Я только что построил что-то сегодня, указав цель развертывания iOS 4.0. Поскольку в «Архитектурах» указан только armv7, Xcode предупредил меня, что для поддержки чего-либо ниже iOS4.2 мне пришлось включить armv6 в «Архитектуры». Просто отредактируйте это поле, нажмите кнопку «+», когда появится диалоговое окно, и введите буквальное «armv6».

В моем случае мы хотим, чтобы наше приложение работало под iOS4 и iOS5. Нам пришлось внести некоторые изменения, чтобы он работал правильно под iOS5, но все эти изменения были сделаны с помощью изменений кода, удобных для iOS4.

Мы также добавили некоторые специфические возможности iOS5 таким образом, чтобы приложение могло работать без сбоев под iOS4. В частности, мы протестировали возможности iOS5, прежде чем пытаться их использовать, и связали библиотеки только для iOS5 в качестве необязательных.

Таким образом, поддержка iPhone3G в мире iOS5 может так же легко означать «мы хотим, чтобы наше приложение работало на iOS4 и выше (независимо от использования какой-либо функции iOS5)», а не «мы хотим убедиться, что наше приложение работает на более старом устройстве под управлением iOS5. ". Здесь есть разница; подумай об этом. :-)

В любом случае, вернуть поддержку armv6 очень просто. И я предполагаю, что суть в следующем: в какой-то момент, когда не будет больше устройств armv6, о которых можно было бы беспокоиться (по какой-либо причине), вам не придется для этого создавать. Apple считает, что всем следует как можно скорее перейти на новейшее оборудование. Таким образом, в этом мире нет необходимости в инструментах по умолчанию, кроме самых последних и лучших. :-) К счастью (или нет), мы, разработчики, живем в реальном мире и понимаем, что вы должны какое-то время поддерживать старые вещи. И я думаю, что команда разработчиков Xcode тоже это знает, поэтому вы можете довольно просто добавить поддержку armv6.

Марк Гранофф
источник
3
Спасибо за точный ответ :-) Действительно, я хочу иметь возможность запускать свое приложение на iPhone 3G с iOS 4.2.1 или ниже (с ограничением до 4.0) и иметь некоторые особенности iOS 5 для текущих устройств. Я не пробовал просто добавлять «armv6» в архитектуру, я искал переменную окружения, например ARCHS_STANDARD_32_BIT, и я только что нашел ARCHS_UNIVERSAL_IPHONE_OS, но, похоже, это не сработало.
iGranDav
3
Хотел добавить, что многие решения предполагают, что он должен сказать «armv6 armv7» - это не сработало для меня. В настоящее время для меня работает только «armv6 $ (ARCHS_STANDARD_32_BIT)», то есть не избавляйтесь от того, что там есть, просто добавьте «armv6» в настройку «Архитектуры»
brack
1
Я сделал все это, и моя сборка все еще терпела неудачу - причина была в том, что у меня была (неиспользованная) сборка Release, установленная для цели развертывания iOS 5.0, а для Debug and Distribution было установлено значение 3.0, и это, похоже, останавливает сборку xcode для armv6. Установка цели развертывания на 3,0 для всех сборок устранила проблему.
Саймон Ист
6
У меня это не сработало (даже после добавления armv6). Приложение даже не появилось на моем iPod touch. Но потом я обнаружил, что в разделе «Необходимые возможности устройства» (на вкладке «Информация») есть armv7. Я просто удалил его, и он начал отлично работать
Erpheus
1
Обычно я использую $ (VALID_ARCHS), который у меня работает. Я только что обнаружил, что новые проекты также добавляют требование возможностей «arm7». Я просто удалил это, и все работает нормально.
Гордон Дав
51

Простой ответ заключается в том, что вам нужно изменить текущие настройки со «Standard (armv7) - $ (ARCHS_STANDARD_32_BIT)» на просто «armv6» и «armv7». См. Изображение ниже. Чтобы она заработала, необходимо удалить строку с предыдущими настройками.

Правильные настройки для armv6 и armv7

адвилли
источник
3
Спасибо, что объяснили это изображением - оно действительно прояснило.
radven 03
11

также убедитесь, что вы установили это в Project AND Targets ... стоило мне часа, чтобы понять это. установил его для одного, но не для другого. надеюсь это поможет. GLTA

Уберт
источник
Кроме того, если у вас есть какие-либо библиотеки, вы должны установить их в проекте и указать там цели.
Уильям Джокуш
9

Я думаю, что есть причина, по которой Apple отказалась от стандартной настройки armv6.

Я скомпилировал armv7 / armv6 с iOS5 SDK, однако компилятор armv6 выдал неправильный код в режиме выпуска. После нескольких часов поиска обходного пути (пробуя llvm или gcc с разными уровнями оптимизации) я сдаюсь.

Итак, я возвращаюсь к iOS SDK 4.x, если я поддерживаю старые устройства armv6.

Пример кода:

// myView center=(160, 100)
CGPoint p=myView.center;  
// now p=(100,100) (what the heck?)
p.x=myView.center.x;
p.y=myView.center.y;
// now p=(160,100) 
p.y+=100;
// now p =(200,200) (what the heck?)

Возможно, у меня есть какое-то повреждение памяти, однако на компиляторе armv7 и на iOSSDK <5.0 он ведет себя так, как ожидалось.

С уважением

Jfieres
источник
Я также вижу странные ошибки в сборках armv6 на старых устройствах. Вы поняли это или действительно вернулись к более раннему XCode? Также отмечу, что они больше не позволяют загружать старые SDK!
Craig McMahon
19
Это известная проблема со структурами LLVM Compiler 3.0 в Xcode 4.2 и CGPoint / CGSize: devforums.apple.com/thread/122059?tstart=15 . Отключение сборки для Thumb на armv6 предотвращает подобные ошибки.
Брэд Ларсон
Вот Это Да! Я так рада твоему ответу, это тоже происходит со мной.
Clafou
7

Не уверен, что это на самом деле решение, но я обнаружил, что замена определенной строки в «архитектурах», которая была $ (ARCHS_STANDARD_32_BIT), на «armv6 armv7» позволила мне скомпилировать с iOS5 в качестве основы и iOS4 в качестве развертывания target и пройти проверку.

Я не использую какие-либо эксклюзивные библиотеки или вызовы для IOS5, но собираюсь использовать их в следующем выпуске.

Питер Джонсон
источник
1

Мне не нужно было заменять $ (ARCHS_STANDARD_32_BIT) только на armv7, чтобы приложение скомпилировалось и было загружено в App Store.

Как предложил МаркГранофф, я просто добавил armv6 как обычный текст, нажав плюс и просто набрав его во второй строке.

Йохан
источник