Многие считают, что Flutter сокращает время выхода на рынок за счет единого кода, но на этапе публикации в сторы кроссплатформенность перестает работать: вам все равно придется проходить два разных цикла модерации с разными требованиями к безопасности и UI. Ошибка в конфигурации одного файла .plist или build.gradle может отбросить релиз на неделю назад.
Оптимизация размера бандла и AOT-компиляция
Flutter компилирует код в машинный код через AOT (Ahead-of-Time), что дает производительность, но увеличивает размер приложения по сравнению с нативными решениями. Для Google Play критически важно использовать App Bundle (.aab), а не APK, чтобы стор генерировал оптимизированные сеты ресурсов под конкретные архитектуры процессоров пользователей.
Кейс: приложение с тяжелыми ассетами (иконки, шрифты) может вырасти до 100 МБ. Решение — перенос тяжелого контента на CDN и использование сжатия в формате WebP. Это позволяет удержаться в рамках комфортного размера для скачивания через мобильный интернет.
Вывод: всегда собирайте релиз через команду flutter build appbundle для Android, чтобы минимизировать вес приложения для конечного пользователя.
Специфика подписи приложений и сертификатов
Самый «узкий» момент в деплое — управление ключами подписи. Для iOS требуется создание Distribution Certificate и Provisioning Profile в Apple Developer Portal, а для Android — создание upload key и использование Google Play App Signing. Потеря keystore-файла для Android-приложения без включенного App Signing делает обновление приложения невозможным — придется выпускать новый пакет с новым ID.
Пример: разработчик хранил .jks файл локально на ноутбуке, который вышел из строя. Итог — полная перерегистрация приложения в Google Play и потеря всех текущих установок.
Вывод: храните ключи подписи в защищенном облачном хранилище или корпоративном менеджере секретов, а не в корне проекта или на локальном диске.
Прохождение модерации: Human Interface и Material
Apple часто отклоняет Flutter-приложения по пункту Guideline 4.0 (Design), если интерфейс выглядит как «копия Android». Использование стандартных Material-виджетов на iOS без адаптации под Cupertino-стиль — прямой путь к режекту. Важно настраивать адаптивность не через разные экраны, а через проверку платформы в коде или использование библиотек-адаптеров.
Кейс: приложение с навигацией через BottomNavigationBar в стиле Android было отклонено App Store за несоответствие стандартам навигации iOS. Исправление потребовало замены элементов управления на нативные аналоги для iOS-версии.
Вывод: для успешного прохода модерации Apple внедряйте платформенные проверки для ключевых элементов UI (кнопки «Назад», селекторы дат, переключатели).
Конфигурация разрешений и Privacy Manifest
С 2024 года Apple требует заполнения Privacy Manifest, где четко указаны причины использования каждого API. В Flutter это означает необходимость детального описания в Info.plist для каждого разрешения (камера, микрофон, геолокация). Общие фразы вроде «Приложению нужен доступ к камере для работы» приведут к отклонению заявки.
Пример: если вы используете плагин для выбора фото из галереи, но не прописали NSPhotoLibraryUsageDescription в Info.plist, приложение упадет при попытке доступа на iOS, что станет причиной автоматического режекта при тестировании модератором.
Вывод: формулируйте причины запроса разрешений максимально конкретно, описывая ценность функции для пользователя.
Автоматизация деплоя через CI/CD пайплайны
Ручная сборка через Xcode и Android Studio для каждого минорного обновления — это риск человеческой ошибки и потеря времени. Профессиональный подход подразумевает использование Fastlane или GitHub Actions для автоматизации сборки, подписи и загрузки артефактов в TestFlight и Google Play Console.
Кейс: переход с ручного деплоя на Fastlane сократил время выпуска хотфикса с 4 часов до 20 минут, исключив ошибки в версии сборки (build number) и конфигурации окружения.
Вывод: внедряйте автоматизацию деплоя сразу после стабилизации основного функционала, чтобы не тратить ресурсы команды на рутинные операции перед каждым релизом.
Вывод
Публикация Flutter-приложения — это не технический клик по кнопке «Build», а процесс синхронизации двух разных экосистем. Чтобы избежать режектов и потери данных, начинайте с настройки CI/CD и строгого разделения конфигураций для iOS и Android. Избегайте использования чистого Material Design для Apple Store и никогда не храните ключи подписи без бэкапа. Оптимальный путь: сборка в .aab для Android, адаптивный UI для iOS и автоматизированный деплой через Fastlane.
