Оживил iPhone 4S в 2026 году: как я запустил нативный Google Gemini на iOS 6.1.3
Привет, DTF! Я мастер по ремонту электроники, в программировании до этого лета был полным нулём и даже не джуном. Но когда в руки попадает идеальный, тяжелый стеклянный кирпичик iPhone 4S на «той самой» ламповой iOS 6.1.3, в голове неизбежно щёлкает идея: а что, если заставить эту классику общаться с передовым ИИ современности?
Не через тормозящий ретро-браузер, а в виде полноценного, быстрого нативного приложения с той самой объемной клавиатурой, мягкими тенями и анимациями 2012 года.
С июля мы с нейросетью шаг за шагом проходили этот хардкорный квест. Делюсь историей цифровой археологии, граблями, бессонными ночами и выкладываю всё в открытый доступ.
Верстак и тулчейн: добро пожаловать в 2012 год
Разрабатывать под современную iOS легко: Swift, SwiftUI, горы документации и автоматическая верстка. Но для iOS 6 такой стек не существует — здесь безраздельно правит Objective-C и совершенно другие законы сборки.
Современные Mac напрочь отказываются собирать бинарники под SDK древних систем. Пришлось собирать аутентичный инженерный стенд:
- Mac Mini 2009 года (разогнанный до максимума: SSD + 8 ГБ оперативки).
- Чистая система OS X Mavericks (10.9).
- Xcode 6.2 с таргетом строго под iOS 6.0 SDK.
- И подопытный — черный iPhone 4S на чистой 6.1.3 с джейлбрейком и твиком AppSync.
Грабли сетевого слоя: когда Google не признает тебя за своего
Первая и главная стена — старая система просто не умеет общаться с современными веб-стандартами. По умолчанию iOS 6 использует TLS 1.0, который сегодняшние серверы Google сбрасывают ещё на этапе рукопожатия.
Когда сетевой стек на кастомных библиотеках всё же удалось завести, начались фокусы самого API:
- Война за заголовки: Запросы шли через эндпоинт v1beta/openai/chat/completions. Но Google наотрез отказывался принимать специфический заголовок x-goog-api-key, возвращая 404 Requested entity was not found. Пришлось вручную пересобирать метод авторизации на классический Authorization: Bearer <ключ>, чтобы сервер признал нас.
- Падения из-за формата данных: При парсинге ответов приложение мгновенно падало с ошибкой unrecognized selector sent to instance. Оказалось, в ряде сценариев Google возвращает массив NSArray там, где клиент ждал словарь NSDictionary. Пришлось переписать логику обработки под универсальный id, чтобы отлавливать любые капризы JSON на лету.
- Геоблок за одну минуту: API периодически выдавало ошибку недоступности региона (User location is not supported). Вместо поднятия громоздких прокси проблема решилась прописыванием Xbox SmartDNS прямо в настройках Wi-Fi на iPhone.
Падения интерфейса: клавиатура-убийца и потерянные чаты
Когда сеть наконец ожила, начался второй круг ада — интерфейс UIKit эпохи iOS 6.
- Вылет при первом открытии: При нажатии на строку ввода API-ключа на экране приветствия приложение намертво падало — класс просто не реализовывал методы делегата UITextFieldDelegate.
- Краш из-за клавиатуры: Как только в основном чате поднималась нативная клавиатура, бинарник вылетал: контроллер подписался на системные уведомления UIKeyboardWillShowNotification, а самих методов анимации в коде физически не было!
- Уехавший тулбар: Когда анимацию добавили, нижняя панель с полем ввода и кнопкой Send вообще улетела за пределы экрана из-за жесткой привязки к высоте экрана вьюхи.
Всё это отлаживалось ночами через консоль Xcode, пока каждый элемент не встал пиксель-в-пиксель на свои координаты.
Динамический селектор моделей прямо в шапке
Google регулярно закрывает старые ревизии моделей. За время нашей разработки линейка 1.5 и 2.0 успела уйти в архив, а 2.5-flash-lite жестко резалась по лимитам. Зашивать имена моделей в системный файл настроек приложения было неудобно: при каждом изменении приходилось бы пересобирать проект.
Поэтому я реализовал динамический выбор моделей прямо в чате:
- По тапу на название модели под словом «Chat» приложение делает быстрый асинхронный запрос через NSURLConnection к эндпоинту v1beta/models, парсит список и выводит в нативном ретро-меню UIActionSheet только живые генеративные модели.
- Добавил кнопку ручного ввода имени модели через нативный скевоморфный алерт UIAlertView: можно вбить любое экспериментальное имя руками прямо с клавиатуры телефона.
- Стилизовал шрифты по канонам системы: темно-серый текст с аккуратным нижним белым тиснением со смещением в 1 пиксель.
- Перерисовал весь визуал под стиль Gemini: объемные иконки с неоновой звездой, градиенты и фирменные цвета.
Итог
Когда после двух месяцев проб, ошибок и правок кода на экране iPhone 4S с мягким щелчком клавиатуры появляется рассуждение новейшей модели о 2026 годе — это неописуемый инженерный кайф. Старое «теплое» железо снова стало полезным карманным компаньоном.
Я выложил проект в открытый доступ, чтобы любой желающий мог пощупать код или поставить готовый бинарник:
- Репозиторий на GitHub: github.com/guzhoffivan-hue/Gemini-for-iOS-6
- Готовый .ipa: лежит во вкладке Releases (ставится в пару кликов через 3uTools или iFile при наличии AppSync).
- Ключ API: бесплатный, берется в Google AI Studio за минуту.
Базовую основу сетевого стека я почерпнул из открытого проекта клиента ChatGPT от bag.xml, а также вдохновлялся здешней статьей про аналогичный запуск на 3GS, развив идею под iPhone 4S и актуальный API Gemini.
Если у кого-то лежит без дела старый 4S — доставайте, он ещё на многое способен!