# Lunavect: перенос исправлений Android на iOS

Актуальный пакет от 15 сентября 2026. Сначала прочитайте этот файл; старый CODEX_MAC_ASO_HANDOFF.md относится к оформлению App Store и не является отчётом о текущем релизе.

## Задание для Codex на Mac

Сравни этот пакет с текущим проектом на Mac и перенеси исправления, сохранив более новые изменения iOS, Apple Team, настройки подписи, Firebase и локальные секреты. Не заменяй существующий проект вслепую. Bundle ID остаётся com.lunavect.puzzle, Apple App ID 6809827853. Не отправляй приложение в App Review в рамках этого задания.

Установи зависимости через npm ci, запусти npm test. Для проверки production-конфигурации используй 3_PREPARE_PRODUCTION_IOS.command: он выполняет mobile:sync с настройками CAS и публичным ключом Adapty. Обычный 1_PREPARE_ON_MAC.command создаёт тестовую конфигурацию; после него нельзя считать production-рекламу и подписку настроенными. Перед загрузкой проверь фактический runtime-config.js в собранном приложении. Выбери номер build выше последнего загруженного в App Store Connect, не используй старое значение 1 автоматически.

## Уже перенесено в общий код

- src/i18n.js, src/shape-names.js, src/runtime-copy.js: названия фигур и пропущенные строки больше не должны оставаться русскими при английском языке. Для недостающих переводов других языков используется английский fallback; это не полный перевод всех строк на все языки.
- styles.css: нижняя подсказка и ссылка рекордов скрыты во время игры; поле занимает освободившуюся высоту. Верхняя панель сохранена. Отключены выделение текста, подсветка касания и hover-эффект на сенсорных устройствах.
- src/app.js: снижена частота обновления HUD, упрощён SVG-фон; сохранение кампании при уходе в фон и восстановление после перезапуска.
- src/ads.js: предзагрузка рекламы, показ только готового interstitial, ограниченная проверка готовности, отмена позднего показа после ухода с экрана результата.
- src/audio.js: остановка музыки и эффектов при скрытии и событиях паузы, восстановление выбранной музыки после возврата.
- sw.js и scripts/build-web.mjs: новые файлы включены в сборку и версионирование кэша.

## Что проверить и исправить именно на iOS

1. Языки: переключить RU → EN, перезапустить приложение, открыть карту, несколько уровней, результат, настройки и магазин. Проверить другие доступные языки, длинные строки и RTL. Заполнять недостающие переводы, не объявлять английский fallback полной локализацией.
2. Ориентация: Info.plist уже ограничивает iPhone портретом; iPad разрешает также перевёрнутый портрет. Проверить фактическую ориентацию на обоих устройствах. По запросу владельца игра должна оставаться в обычном портрете, включая iPad; проверить требования полноэкранного режима и настройки Xcode, затем устранить поворот.
3. Музыка: Capacitor 8.5.1 уже задаёт mediaTypesRequiringUserActionForPlayback = []. Но Android MainActivity дополнительно посылает arrows:native-pause/resume, а iOS AppDelegate пока содержит стандартные пустые lifecycle-обработчики. Проверить WKWebView visibilitychange/Cordova pause/resume на устройстве. При необходимости добавить iOS-мост к существующим событиям паузы/возобновления, не допуская двойного воспроизведения или возобновления во время рекламы. Проверить запуск без первого тапа, Home, блокировку, Control Center, звонок и повторный возврат.
4. Поле: весь доступный экран ниже HUD должен быть игровым, без нижней подсказки/рекордов и синего выделения стрелок. Проверить safe area на iPhone с вырезом и iPad.
5. Реклама: пройти уровень 10 при быстрой и медленной сети, нажать Next и возврат на карту. Не должно быть 10-секундного зависания или позднего объявления на карте. Проверить переход из рекламы в App Store и обратно, закрытие, no-fill, отсутствие сети. Если ОС выгрузила процесс, восстановить кампанию; гарантировать, что iOS никогда не выгрузит процесс, невозможно.
6. Подписка: Android-настройка не подтверждает работоспособность Apple. Проверить продукт lunavect_club_monthly в App Store Connect и привязку iOS-продукта/placement/access level premium в Adapty, StoreKit Sandbox/TestFlight, покупку и restore. Согласованная цена — USD 9.99 в месяц; сначала проверить текущую цену iOS. Последний известный серверный статус Apple verification был неактивен, перепроверить и настроить безопасно. Ключи App Store Server API хранятся только на сервере, не в приложении и не в ZIP.
7. Производительность: измерить frame time, память и повторные загрузки на старом физическом iPhone через Instruments. Не считать уменьшение DOM/SVG доказательством отсутствия лагов.

## Приёмка

Собрать и проверить именно итоговый iOS Archive/TestFlight на физическом устройстве. Записать модель, iOS, версию/build, результаты пунктов выше и оставшиеся ограничения. На Windows native iOS-сборка и эти сценарии не проверялись. Android-отчёт ANDROID_FIXES_2026-09-14.md приложен как история общих исправлений.

Архив включает исходники обеих платформ, поскольку текущий mobile:sync и configure-cas-native.mjs обрабатывают Android и iOS вместе. Android signing keys, базы игроков, node_modules и локальные учётные данные не включены.
