Узнайте, как команда Flutter работает с WWDC, бета-версиями и применяет проактивную разработку для обеспечения поддержки iOS в день релиза (Day 0).
25 авг. 2026 г. · Время чтения: 7 мин.
Будучи разработчиком на Flutter, вы можете по-разному относиться к каждой из шести основных поддерживаемых платформ Flutter (не говоря уже о платформах из расширенной вселенной, таких как webOS). Что касается платформы, на которой работает телефон в вашем кармане, вы, возможно, следите за мероприятиями по релизам и с энтузиазмом воспринимаете каждое анонсирование. Что же до других платформ, то здесь остается лишь скрещивать пальцы в надежде, что ежегодные изменения не помешают вам запустить flutter build [platform] и выпустить приложение. К счастью, независимо ни от чего, вы получаете выгоду от работы команды ориентированных на платформы разработчиков из команды Flutter, чья задача — разобраться в каждом анонсе и устаревании за вас.
Рабочий процесс каждой платформо-специфичной подкоманды адаптирован под то, как развивается эта платформа, и в случае Apple он обычно вращается вокруг одной недели в июне, когда взгляды технологического мира устремляются в Купертино, штат Калифорния.
Главное мероприятие Apple — WWDC
Каждый июнь Apple проводит мероприятие под названием WWDC, чтобы показать, как будет развиваться их программное обеспечение в предстоящем году. Обычно это не связано с анонсами оборудования, которые появляются в течение остальной части года. На WWDC главными действующими лицами выступают многочисленные операционные системы Apple (iOS, macOS, watchOS и другие).
Если вы когда-нибудь смотрели WWDC, то знаете его общий формат после COVID: сначала основной доклад (keynote), затем «Платформенное состояние дел» (Platform State of the Union) и, наконец, огромный поток тематических видеороликов. В 2026 году на WWDC было представлено более 145 технических сессий, помогающих сообществу разработчиков Apple понять, чего ожидать. Это, безусловно, невероятный ресурс, но в то же время слишком большой объем контента для ручного просмотра.
Вы уже догадываетесь, к чему все идет. Нам даже не обязательно писать следующее предложение, чтобы вы поняли его истинность, но мы все равно напишем:
В 2026 году команда Flutter начала использовать ИИ для категоризации каждой технической сессии.
Начиная с этого года, небольшой фрагмент кода на Dart сначала извлекал транскрипты из каждого видео. Затем Gemini ранжировал и категоризировал каждую сессию на основе следующих критериев:
- Важность для контрибьюторов Flutter (внутри и за пределами Google)
- Область влияния
- Рекомендуемые действия
Вместо того чтобы смотреть 145 (пусть и очень качественных) технических сессий, к закату в день выхода видео мы получили подготовленный Gemini документ с предварительным анализом каждой сессии. Например, наша система распознала, что мы можем в значительной степени проигнорировать сессию SwiftData, поскольку Flutter обрабатывает персистентность иначе. Отдельно она отметила доклад «Модернизация вашего приложения UIKit» как критически важный [1] для команды Flutter Engine, так как в нем описывались обязательные изменения в API жизненного цикла UIScene [2].
[1] Чтобы не пропустить ничего важного для Flutter, мы действительно запасаемся попкорном и смотрим каждую сессию, которую Gemini отмечает таким образом. [2] Подробнее об API UIScene мы расскажем позже!
[1] Чтобы не пропустить ничего важного для Flutter, мы действительно запасаемся попкорном и смотрим каждую сессию, которую Gemini отмечает таким образом. [2] Подробнее об API UIScene мы расскажем позже!
К утру следующего дня команда Flutter iOS официально вступила в период интенсивной работы. Между WWDC в июне и финальными стабильными релизами в сентябре проходит три месяца, поэтому это гонка со временем, наполненная спринтами и поиском багов для обеспечения своевременного соответствия требованиям. Это огромный объем работы, но команда Flutter стремится всегда обеспечивать поддержку Day 0 для каждого крупного релиза iOS. Чтобы следить за нашим прогрессом в поддержке iOS 27, посмотрите соответствующий проект на GitHub.
Эта система кода на Dart и рабочих процессов Gemini обрабатывает всю WWDC, на которую приходится подавляющее большинство изменений от Apple. Однако «подавляющее большинство» и «абсолютно все» — это разные вещи; и иногда критическое ломающее изменение кроется в чем-то столь безобидном, как примечания к выпуску минорного патча.
Бета-релизы, которые услышала вся команда Flutter
Шел 2024 год, и только что вышла бета-версия iOS 18.2 для разработчиков с множеством обновлений, касающихся, в частности, обработки жестов и событий указателя. Днями позже мы получили тревожный отчет об ошибке: после клика по виджету, расположенному над веб-представлением (webview), последующие жесты или клики по расположенному под ним веб-представлению переставали вызывать события onClick.
Это было не просто плохо. Нет, это был красный уровень тревоги, пожар по высшему разряду, поскольку на веб-представлениях завязана реклама, а лишение разработчиков даже единого доллара выручки абсолютно недопустимо.
Первопричина баги поначалу была неочевидной, но в лучших традициях отладки технологий один из членов команды додумался «выключить и снова включить» устройство, так сказать. Мы обнаружили, что замена одного из распознавателей жестов в стеке веб-представления при каждом клике решает проблему. Этим решением никто не был особо доволен, но это было решение, причем незаметное для конечных пользователей.
Перенесемся в август 2025 года и бета-версию iOS 26: казалось бы, несвязанные изменения столкнулись с нашим трюком по переключению распознавателей жестов, что привело к более серьезной регрессии, при которой система блокировки касаний и жестов во Flutter полностью вышла из строя. Не имея других вариантов, мы откатили предыдущий временный фикс… и сразу же столкнулись со старой ошибкой не реагирующего на нажатия веб-представления.
Попытки расследовать эту аномалию со стороны Flutter не принесли результатов, поэтому нам пришлось все упростить. Команда создала тестовый проект на чистом Swift. Без Flutter, без Dart, только стандартное родительское представление UIKit, нативный распознаватель жестов и автономное веб-представление — и мы увидели то же самое ошибочное поведение.
Это была огромная победа! Имея на руках четкий сценарий воспроизведения, мы отправили отчет об ошибке и рекомендуемое исправление в Apple, которая не потеряла времени даром на выявление и устранение проблемы. Начиная с iOS 26.4, клики по веб-представлениям снова стали вести себя так, как и ожидалось, независимо от того, использовал проект Flutter или нет.
Множество исправлений с разных сторон
Дополнением к этому счастливему концу стало то, что в то же время команда Flutter была занята миграцией всего нашего кода Dart с отдельного «потока пользовательского интерфейса» (UI thread) обратно на основной «платформенный поток» (как их называют во Flutter). Это означало, что код Dart мог синхронно общаться с платформенным кодом, таким как Swift и Objective-C для iOS, что открыло двери для других модернизаций, таких как внедрение синхронной системы для hit-тестирования. Эти рефакторинги еще больше улучшили поведение жестов на iOS за счет устранения задержек микрозадач и других источников сбоев.
В совокупности эти изменения привели к серьезному повышению стабильности как для приложений Flutter, работающих на iOS, так и для нативных приложений iOS.
Иногда мы бываем и проактивными
Анонсы WWDC и отчеты об ошибках по определению являются реактивными маневрами, но иногда команда Flutter действительно опережает события. Весной 2025 года Apple выпустила iOS 18.4, которая вызывала следующее предупреждение в приложениях Flutter:
CLIENT OF UIKIT REQUIRES UPDATE: Этот процесс не использует жизненный цикл UIScene. В будущей версии это станет утверждением (assert).
CLIENT OF UIKIT REQUIRES UPDATE: Этот процесс не использует жизненный цикл UIScene. В будущей версии это станет утверждением (assert).
"Будущая версия" звучит расплывчато, но команда Flutter не собиралась откладывать работу над вашими приложениями в долгий ящик, поэтому мы взялись за дело раньше намеченного срока. К сожалению, предполагаемое изменение оказалось масштабным.
Чтобы понять почему, нужно вспомнить, как сильно изменился мир мобильных устройств с момента создания Flutter в 2014 году. Когда-то Flutter работал только на iOS и Android, полностью занимал эти экраны и имел фиксированные размеры окон. Теперь, в 2026 году, Flutter работает на других платформах, поддерживает многооконность, встраивается в приложения, написанные не на Flutter, и может складываться пополам в любой момент. Эти изменения усложнили некогда простые вопросы вроде "Каков размер окна?" или "Находится ли приложение в фоновом режиме?", а также затруднили внедрение UIScene!
Затем на конференции WWDC в 2025 году в рамках одного из технических докладов прозвучала важнейшая фраза:
В релизе, следующем за iOS 26, любое приложение UIKit, собранное с последним SDK, будет обязано использовать жизненный цикл UIScene, иначе оно не запустится.
В релизе, следующем за iOS 26, любое приложение UIKit, собранное с последним SDK, будет обязано использовать жизненный цикл UIScene, иначе оно не запустится.
Слава богу, что наша система приема и (тогда еще ручной) процесс приоритизации вовремя зафиксировали этот доклад!
Мы потратили третий квартал 2025 года на проектирование и реализацию, а уже к четвертому кварталу проводили бета-тестирование нашей реализации UIScene. Экспериментальный флаг открыл к ней доступ для самых смелых разработчиков на Flutter, и мы выражаем огромную благодарность всем, кто испытал ее в деле, ведь вы помогли нам обнаружить критические крайние случаи, проблемы с таймингами и другие особенности.
К январю 2026 года мы переключили внимание на помощь экосистеме в обновлении плагинов для iOS, так как их поддержка также была необходима для работоспособности приложений. Перенеся каждый плагин, который мы поддерживаем напрямую, мы начали заводить тикеты для плагинов от сообщества. К счастью, авторы плагинов со всего мира отреагировали очень оперативно, и мы получили колоссальную поддержку и командный дух при обновлении всего необходимого!
Выпуск функции
Полная поддержка API UIScene от Apple появилась в стабильном релизе Flutter 3.41 в феврале 2026 года. И если вы никогда не слышали о UIScene и в общем-то не понимаете, о чем речь — отлично! Нашей целью было сделать так, чтобы большинство разработчиков на Flutter запустили flutter upgrade, продолжили писать код на Dart и никогда не задумывались об этом. (Некоторым продвинутым пользователям, например тем, кто использует сценарии add-to-app, все же пришлось пройти короткую ручную процедуру миграции.)
Эта проактивная работа принесла огромные плоды, потому что Apple превратила это предупреждение в ошибку в бета-версии iOS 27, как и обещала. Но благодаря нашим ранним усилиям Flutter был готов к iOS 27 за несколько месяцев до ее официального анонса.
Мы потели над задачей — вы пожинаете плоды
Цель команды Flutter остается неизменной: разобраться со скучными аспектами разработки приложений, чтобы вы могли сосредоточиться на веселых — создании функций, повышении радости пользователей и выпуске отличных релизов. Бу то iOS, Android или любая другая из множества платформ, на которых работают приложения на Flutter, мы хотим, чтобы ваши цели сборки оставались лишь деталью реализации на пути к созданию потрясающих продуктов, которые радуют ваших пользователей.
Для получения дополнительной информации о Flutter посмотрите видеоверсию этой записи в блоге, ознакомьтесь с нашей документацией, зайдите на наш канал YouTube или найдите нас в соцсетях. А до тех пор нам не терпится увидеть, что вы создадите!












