Новости и разборы
Xcode 27, Expo SDK 58 и React Native 0.88: как планировать обновления приложения компании
Xcode 27 убрал Simulator.app, Expo SDK 58 и React Native 0.88 вышли под iOS 27 и iPhone Duo. Что это значит для приложения компании и как я закладываю обновления в план.
За одну неделю октября Apple выпустила Xcode 27 и складной iPhone Duo, React Native вышел в версии 0.88, а Expo в SDK 58. Для разработчика это обычный осенний цикл. Для владельца компании, у которой есть своё приложение для сотрудников или клиентов, это напоминание: приложение нельзя сделать и забыть, раз в год его нужно пересобирать под новую платформу, и это стоит заложить в бюджет заранее. День, когда у менеджера обновился телефон, для этого поздний.
Что вышло
Expo 20 октября описал, как Xcode 27 убрал Simulator.app и заменил его на Device Hub. Любой инструмент, который открывал симулятор по имени приложения, перестал работать, и Expo CLI был одним из них. Исправление вышло в двух частях: CLI теперь видит Device Hub как цель и выводит нужное устройство на передний план через ссылку devices://. Отдельно появился expo-device-hub, плагин с панелью в браузере: живое видео симуляторов и эмуляторов, тап и ввод текста, графики CPU и памяти. Плагин пока не дошёл до версии 1.0.
Expo 21 октября выпустил руководство по переходу на SDK 58. Он приносит поддержку iOS 27 и React Native 0.88, то есть изменения сразу двух версий, 0.87 и 0.88. Strict TypeScript API стал умолчанием, глубокие импорты из react-native/Libraries теперь ошибки типов. React Native убрал InteractionManager, Touchable как экспорт, свойство animated у Modal и несколько свойств StatusBar. Prebuild генерирует SceneDelegate.swift, в Android по умолчанию включён R8 в релизных сборках, а новый Expo Go поддерживает только SDK 58.
Expo 23 октября выпустил руководство по iPhone Duo, первому складному iPhone Apple, который вышел в тот же день. У него компактный внешний экран и большой внутренний, системные панели в большинстве положений уезжают в вертикальную рейку сбоку, а приложение можно открыть рядом с другим в Split View. Совет Expo: отдать навигацию системе через Stack и NativeTabs в Expo Router, закрыть содержимое SafeAreaView и проверить каждое положение корпуса в симуляторе. Нужны SDK 58 и Xcode 27.1.
React Native 19 октября выпустил 0.88, третий релиз без ломающих изменений для пользователей, после 0.83 и 0.86. События теперь идут через стандартный W3C EventTarget, как в браузере, в Text и TextInput появились переменные шрифты. На iOS начиная с iOS 27 SDK Apple требует жизненный цикл UIScene, и UIKit-приложения, собранные Xcode 27 без него, не запускаются. React Native 0.88 добавил поддержку SceneDelegate как дополнение, старый путь через AppDelegate сохраняется.
Что это значит для приложения компании
Возьмём прокат. Приложение для выдачи машин работает полтора года, менеджеры довольны, разработчик занят другим проектом. Осенью выходит новый iPhone, часть сотрудников обновляет телефоны, и приложение нужно пересобрать новым Xcode. Если в проекте старый жизненный цикл и зависимости, которые полтора года не трогали, то «пересобрать» превращается в неделю работы, которую никто не планировал.
Вывод: у приложения есть годовой цикл, заданный Apple и Google, и он не зависит от того, нужны ли вам новые функции. Дешевле всего проходить его по шагу в год, пока изменения маленькие.
Как это устроено у меня
У PDR-компании в США, где я технический партнёр с 2021 года, суперапп на React Native мы делаем вместе с разработчиками компании. Он приходит на смену AppSheet, им уже пользуются офис, продавцы и собственник. Приложение опубликовано в TestFlight, готовится выпуск в App Store, для Android собирается APK. Построено offline first: продавец на выезде отмечает точку на карте, делает фото и ведёт лида без связи. Рядом кабинет клиента с онлайн-таймлайном по заказу, подписью документа пальцем и выпуском PDF, на английском и испанском. Обновление стека под новые версии iOS и React Native я для этого приложения закладываю в сопровождение как плановую работу.
У компании по аренде автомобилей в ЮАР, с которой я работаю с октября 2024 года, внутреннее приложение для менеджеров сделано на FlutterFlow с бэкендом на Firebase. Его в основном делал другой разработчик, я связывал его с AmoCRM, сайтом и бизнес-логикой. Сейчас система работает, машины выдаются, с моей стороны сопровождение без активной разработки. Платформенные обновления там касаются и FlutterFlow, и магазинов приложений, и это тоже часть сопровождения.
Что я бы сделал
Записать в договор сопровождения ежегодное обновление стека: SDK, зависимости, сборка под новый Xcode и Android. Разовые доработки у меня стоят около $80 в час, постоянное сопровождение оформляем отдельным соглашением, и обновление платформы я в него закладываю.
Перед обновлением прогнать проверку типов и список убранных API из руководства Expo. На SDK 58 это InteractionManager, Touchable, свойства StatusBar. Лучше увидеть ошибки на своей машине, чем в магазине.
Не рисовать свою навигацию на JavaScript, если можно отдать её системе. На iPhone Duo панели сами переезжают в рейку, за это отвечает iOS.
Проверить приложение на новых формах экрана: сложенный и раскрытый Duo, Split View, изменяемый размер окна на iOS 27. Хватит Xcode 27.1 и симулятора в Device Hub.
Знать, каким образом сборки собирается приложение. У Expo алиасы sdk-58 и latest теперь указывают на Xcode 27.1, и это стоит проверить до релиза.
Связанные материалы
О планировании первой версии клиентского приложения, с ролями и одним полным сценарием, я писал в статье Как спланировать первую версию клиентского портала. Направления: приложение под ваш клиентский сценарий и клиентский продукт, связанный с бизнесом. Кейсы: суперапп и кабинет клиента у PDR-компании и прокат в ЮАР с приложением для менеджеров. Из других обзоров: переезд на новую систему без остановки работы и кабинет клиента с подписью пальцем и вторым языком. Раньше я писал, как выбрать мобильный стек с учётом стоимости поддержки. Если у вас есть приложение, которое никто не обновлял больше года, расскажите, на чём оно сделано и кто его сопровождает. Обсудить задачу.