Оживил iPhone 4S в 2026 году: как я запустил нативный Google Gemini на iOS 6.1.3

Привет, DTF! Я мастер по ремонту электроники, в программировании до этого лета был полным нулём и даже не джуном. Но когда в руки попадает идеальный, тяжелый стеклянный кирпичик iPhone 4S на «той самой» ламповой iOS 6.1.3, в голове неизбежно щёлкает идея: а что, если заставить эту классику общаться с передовым ИИ современности?

Не через тормозящий ретро-браузер, а в виде полноценного, быстрого нативного приложения с той самой объемной клавиатурой, мягкими тенями и анимациями 2012 года.

С июля мы с нейросетью шаг за шагом проходили этот хардкорный квест. Делюсь историей цифровой археологии, граблями, бессонными ночами и выкладываю всё в открытый доступ.

Оживил iPhone 4S в 2026 году: как я запустил нативный Google Gemini на iOS 6.1.3

Верстак и тулчейн: добро пожаловать в 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.
Оживил iPhone 4S в 2026 году: как я запустил нативный Google Gemini на iOS 6.1.3

Грабли сетевого слоя: когда Google не признает тебя за своего

Первая и главная стена — старая система просто не умеет общаться с современными веб-стандартами. По умолчанию iOS 6 использует TLS 1.0, который сегодняшние серверы Google сбрасывают ещё на этапе рукопожатия.

Когда сетевой стек на кастомных библиотеках всё же удалось завести, начались фокусы самого API:

  1. Война за заголовки: Запросы шли через эндпоинт v1beta/openai/chat/completions. Но Google наотрез отказывался принимать специфический заголовок x-goog-api-key, возвращая 404 Requested entity was not found. Пришлось вручную пересобирать метод авторизации на классический Authorization: Bearer <ключ>, чтобы сервер признал нас.
  2. Падения из-за формата данных: При парсинге ответов приложение мгновенно падало с ошибкой unrecognized selector sent to instance. Оказалось, в ряде сценариев Google возвращает массив NSArray там, где клиент ждал словарь NSDictionary. Пришлось переписать логику обработки под универсальный id, чтобы отлавливать любые капризы JSON на лету.
  3. Геоблок за одну минуту: API периодически выдавало ошибку недоступности региона (User location is not supported). Вместо поднятия громоздких прокси проблема решилась прописыванием Xbox SmartDNS прямо в настройках Wi-Fi на iPhone.
Оживил iPhone 4S в 2026 году: как я запустил нативный Google Gemini на iOS 6.1.3

Падения интерфейса: клавиатура-убийца и потерянные чаты

Когда сеть наконец ожила, начался второй круг ада — интерфейс 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 году: как я запустил нативный Google Gemini на iOS 6.1.3

Итог

Когда после двух месяцев проб, ошибок и правок кода на экране 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 — доставайте, он ещё на многое способен!

77
11