
Согласно политике Apple, компания чётко разграничивает время жизни тех или иных версий iOS. Обычно, уже через 3-4 года определенная версия iOS считается устаревшей и публиковать новые версии приложений с её поддержкой больше нельзя. Однако в ходу всё ещё «старые», но по настоящему трушные и любимые многими «пятёрки», «четвёрки», а среди коллекционеров — и «тройки»! Способ, о котором я расскажу в статье, раскопали ещё «олды», однако он позволяет запускать и отлаживать «хоумбрю» приложения на старых айфонах, потенциально принося им новую жизнь с кастомными приложениями! Интересно? Тогда добро пожаловать под кат!
❯ Предисловие
После серии статей и видео из моей рубрики «сам себе экосистема», где я использую диковинные девайсы прошлых лет и пишу для них клиенты нужных мне сервисов (ВК, YouTube и Telegram), люди часто стали писать в комментариях и личку мол, «автор, когда под iOS 6 что-то будет!?». Безусловно, я люблю «яблочки», читатель даже дарил мне коробочный iPhone 2G с его родной симкой AT&T, но если разработка и отладка под Android вопросов не вызывает (современная документация актуальная и её легко найти, приложения разрабатываются на любимом мной Java), под Windows Phone тоже (для деплоя и дебага под WP достаточно лишь разблокировать загрузчик и сделать Interop Unlock), то с айфоном уже есть определенные нюансы, а именно — Objective C и отвратительная политика Apple касательно «старых» девайсов.

К Obj-C претензии всегда стандартны: нелогичный синтаксис, худшая, по сравнению с C или адекватными плюсами читаемость (хотя код STL уже переплюнул любой код на ObjC), на язык может быть проблематично переучиться после относительно большого опыта с C/C++. Apple, конечно, придумали решение в виде Swift, однако этот язык, к сожалению, нам недоступен: писать приложения на свифт можно с iOS 7.0 и выше!

А с политикой Apple всё очевидно. XCode поддерживает определенную версию iOS несколько лет, после чего — всё, смартфоны на условной iOS 12 (5s, iPad Air) уже превратились в тыкву, не говоря уже об 32х-битных устройствах на iOS 10 (5, iPad 4), нормально деплоить новые приложения туда возможности нет. Но выход есть: на старых айфонах вполне можно отлаживать приложения при условии наличия джейлбрейка. И вот с джейлом всё особенно хорошо на «старых» тройках и четверках, где хак перманентный и не сбрасывается после перезагрузки.
Способ древний, придуман ещё в конце позапрошлого десятилетия, но о нём почему-то многие забыли…
❯ Деплоим
Для разработки под старые версии iOS, нам потребуется древний XCode, который работает только на древней версии OS X. Поэтому решения два: хакинтош в VMWare (тормозно из-за отсутствия дров на GPU, но работать будет), или на реальной машине с Ivy Bridge/Core 2 Duo, либо покупка трушного, настоящего мака тех лет, с поддержкой нужной версии OS X. Мне давно хотелось пощупать макбук, поэтому я купил себе Early 2008 — A1181, вполне годная машинка, пусть и кажется слабоватой.

Для охвата почти всех «старых» версий iOS, нам нужен OS X 10.7 Lion и XCode 4.5.2 (нужен Appe ID для скачивания. Аккаунт разработчика не нужен). Накатываем IDE, запускаем и видим, что всё работает… Но при попытке развернуть приложение на настоящем устройстве, а не в симуляторе, XCode просит нас ввести данные от Apple ID для подписывания приложения нашим сертификатом. У нас его, конечно же, нет :)

Сначала нам понадобится накатить джейлбрейк на наше устройство (для каждой версии системы и устройства разный джейл, до 10-ки все версии системы джейлятся очень легко и прямо с ПК на Windows) и специальный патч, позволяющий запускать крякнутые и неподписанные приложения — AppSync. Этот патч можно установить как из Cydia, так и в один клик с помощью 3u Tools.

Дальше необходимо отредактировать файл SDKSettings.plist, который можно найти по пути /Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/. Где этот файл находится, зависит от версии XCode. Он может находится как в /Developer/, так и в самом пакете XCode (нажимаем в финдере шестеренку -> просмотреть содержимое пакета и там увидим папку Developer).
Устанавливаем свойства AD_HOC_CODE_SIGNING_ALLOWED, ENTITLEMENTS_REQUIRED в YES, а CODE_SIGNING_REQUIRED в NO. Теперь XCode не будет валится с ошибкой проверки подписи, но приложение пока не запустится.

Теперь заходим в настройки проекта, жмём на Target с именем проекта и переходим в Build Settings. Разворачиваем все опции (нажимаем All вместо Basic) и и меняем опции на Ad-hoc Code Sign. После этого, приложение можно развернуть с помощью кнопки Run, но отладчик к нему не сможет подключиться. Для отладки нам нужно создать файл Entitlements.plist и добавить одну единственную опцию — «Can be debugged» с значением YES и установить значение Code Signing Entitlements в Entitlements.plist.


После этого мы сможем запустить приложение с отладчиком и всё будет работать без проблем :)
Если же вы не перевариваете ObjC и подходы Apple к разработке приложений, и это для вас единственное препятствие — то возможностей разработки под 15-летние айфоны несколько. Если вы пишите или портируете игру — никто вам не мешает писать основную логику на плюсах, создавая в ObjC-коде лишь контекст OpenGL и коммутировать события в основную логику. Для приложений на C++ доступен полноценный GLES и OpenAL для звука, ну а прослойку для того, чтобы ловить события с тачскрина, думаю, вы и сами осилите.
Потенциально есть возможность пропатчить Xamarin для сборки приложений на iOS 6, но у меня пока не получилось :(
Ну а для «просто» приложений есть, конечно же, PWA :) Никто не мешает реализовать UI на веб-стеке технологий (с учетом того, что браузер в iOS 5 всё ещё HTML4), а часть логики — на тех же плюсах, благо частичная возможность прокинуть собственные методы в UIWebView есть. Так что, самый первый айфон ещё будет жить?
❯ Заключение
Вот таким нехитрым способом можно деплоить приложения на «старые» айфоны с джейлбрейком и снова продлить им жизнь. Да, на более свежих версиях системы есть возможность самоподписи на 7 дней, но он требует переустановки приложения каждую неделю, да и пользователей обычно больше интересуют «трушные» iOS 4/iOS 6 с тем самым скевоморфизмом, нежели, например, iOS 10.
Понравился материал? Подписывайтесь на меня и ТаймВеб на Хабре, а если вам нравится тематика моддинга, ремонта и программирования под гаджеты прошлых лет — подписывайтесь на мой канал в Telegram. Всем спасибо :)