Как обновиться до SDK 58

Источник: Expo Blog•

Как обновиться до SDK 58

Обновите свое приложение с SDK 57 до SDK 58 с помощью вашего агента кодирования и навыка expo-upgrade или вручную, а также ознакомьтесь с критическими изменениями, которые с наибольшей вероятностью могут на него повлиять.

Вышел SDK 58, в котором появилась поддержка iOS 27 и React Native 0.88. Полную информацию о релизе можно найти в журнале изменений SDK 58.

Давайте обновим ваш SDK 57! Самый быстрый способ — поручить обновление вашему агенту кодирования с помощью навыка Expo upgrade, поэтому мы начнем с этого. Если вы предпочитаете сделать это вручную, ниже приведены инструкции, а затем перечислены изменения, которые с наибольшей вероятностью повлияют на ваше приложение.

Рекомендуется: обновите с помощью агента кодирования

Навык — это набор инструкций, которые ваш агент кодирования может прочитать при выполнении задачи. Навык expo-upgrade содержит рекомендации по обновлению SDK, включая проверку зависимостей и миграцию, такую как удаление больше не нужных патчей и удаленных API.

Следуйте документации по установке навыков Expo, чтобы настроить навыки для вашего агента кодирования. После этого зафиксируйте изменения в системе контроля версий и скажите своему агенту: «Обнови этот проект до последней версии Expo SDK». Он загрузит навык и сделает все остальное.

Обновление вручную

Чтобы вручную обновиться до последних пакетов SDK 58, выполните следующие команды:

Первая команда обновляет expo и приводит остальные зависимости в соответствие с SDK 58. Вторая проверяет наличие распространенных проблем в проекте.

Обязательно изучите журнал изменений, чтобы ознакомиться с полным списком изменений и устаревших функций, которые могут повлиять на ваше приложение.

Если вы не используете генерацию нативных файлов (Continuous Native Generation) и коммитите папки android и ios в систему контроля версий, обязательно обновите и эти нативные проекты. Воспользуйтесь нашим помощником по обновлению нативных проектов, чтобы увидеть, что именно изменилось. Это руководство включает в себя промпт для вашего агента, позволяющий автоматизировать обновление, а также полный дифф между вашей текущей и целевой версиями SDK.

Сборки EAS и Expo Go

В EAS Build псевдонимы образов sdk-58 и latest iOS теперь указывают на образ Xcode 27.1. Если вы установили конкретный образ в eas.json, замените его на один из них. Либо удалите его и используйте значение по умолчанию. В справочнике по инфраструктуре сборки перечислены все образы.

Новый Expo Go появится в App Store и Google Play в ближайшие несколько недель, и он поддерживает только SDK 58. Команда npx create-expo-app рекомендует SDK 58, поэтому используйте сборку для разработки (development build) для запуска вашего нового проекта. Если вы хотите остаться на Expo Go до выхода новой версии, выберите SDK 57, когда об этом спросит команда. Если вы выпускаете продакшн-приложение, вам в любом случае следует использовать сборку для разработки.

Заметные изменения

Типы React Native и удаленные API

В SDK 58 React Native обновлен с версии 0.86 до 0.88, поэтому он включает изменения из React Native 0.87 и React Native 0.88.

Строгий API TypeScript теперь используется по умолчанию. Глубокие импорты из react-native/Libraries/* теперь будут отображаться как ошибки типов, а рефы должны использовать типы экземпляров, такие как ViewInstance и TextInputInstance. Запустите проверку типов как можно раньше. В руководстве по строгому API TypeScript описаны все изменения, а работу можно поручить вашему агенту с помощью навыка migrate-to-strict-api.

Некоторые API были удалены, в том числе:

  • InteractionManager. Вместо него используйте requestIdleCallback.
  • Корневой экспорт Touchable. Используйте ViewProps, если вы расширяли Touchable в качестве типа.
  • Свойство animated в компоненте Modal.
  • Свойства backgroundColor, translucent и networkActivityIndicatorVisible в компоненте StatusBar. Они уже были устаревшими.

ImageBackground устарел в пользу View с изображением с абсолютным позиционированием.

SDK 58 пока не поддерживает macOS. Поддержка вернется, когда react-native-macos будет обновлен по меньшей мере до React Native 0.86.

Жизненный цикл сцен и ориентация в iOS

Новый SDK iOS 27 вносит значительные изменения для поддержки новых форм-факторов, таких как iPhone Duo, и Expo SDK 58 к этому готов. Команда npx expo prebuild была обновлена для поддержки требуемого жизненного цикла на основе сцен UIKit и теперь генерирует файл SceneDelegate.swift и запись UIApplicationSceneManifest в Info.plist, причем делегат сцены создает окно вместо didFinishLaunchingWithOptions. Expo пересылает события URL, пользовательской активности, Handoff, жизненного цикла и быстрых действий в ExpoAppDelegate.

Если вы поддерживаете каталог ios вручную, используете голое приложение React Native (bare React Native app) или переопределяете методы делегата приложения в AppDelegate.swift, следуйте руководству по миграции жизненного цикла сцен. Если вы включили ios.enableSceneSupport с помощью expo-build-properties в SDK 57, удалите это свойство. SDK 58 включает поддержку сцен.

iOS 27 также делает приложения для iPhone изменяемыми по размеру. requireFullScreen больше не отключает эту функцию для вашего приложения, а ScreenOrientation.lockAsync может не работать, пока приложение изменяет размер. Если вы полагаетесь на фиксированную ориентацию, прочитайте раздел об ограничении ориентации в iOS 27 и более поздних версиях.

Expo Router

Ядро навигации было переработано, и большинство приложений этого не заметит. Если вы создали собственный навигатор или делаете импорт из expo-router/react-navigation, некоторые API были перемещены или удалены, а новые навигаторы должны использовать createStandardRouterNavigator или integrateWithRouter вместо withLayoutContext.

Другие изменения, которые стоит проверить:

  • Импорт нативных вкладок: expo-router/unstable-native-tabs теперь называется expo-router/native-tabs.
  • Вывод сервера: когда web.output не задан, проекты используют значение "server", которое рендерит HTML при каждом запросе. Чтобы сохранить поведение SDK 57, установите web.output в значение "static" и включите опцию apiRoutes в плагине конфигурации expo-router.
  • Асинхронные роуты в веб: файлы маршрутов разбиваются на отдельные чанки. Установите asyncRoutes: { web: false }, чтобы отключить это поведение.
  • Хедер стека в iOS 26 и новее: хедер по умолчанию является прозрачным с эффектом Liquid Glass, а содержимое экрана заходит под него. См. раздел «Проверка внешнего вида хедера в iOS» в руководстве.
  • Необязательные зависимости: expo-symbols и @expo/ui являются необязательными опциональными зависимостями (peer dependencies). На Android установите expo-symbols, если вы используете NativeTabs.Trigger.Icon со свойством md, и @expo/ui, если вы используете Stack.Toolbar.

Руководство по миграции Router охватывает все изменения, включая метаданные статического экспорта, пользовательские роутеры и удаленные экспорты expo-router/react-navigation. Прочитайте его, даже если вы используете только встроенные навигаторы.

Релизные сборки для Android

Шаблон Android теперь по умолчанию включает R8 в релизных сборках. Некоторые из вас могли уже включить его для устранения предупреждений при публикации в Play Store. Вы можете отключить его, установив android.enableMinifyInReleaseBuilds в значение false с помощью expo-build-properties. Настройки по умолчанию должны отлично работать для большинства приложений, однако приложениям, использующим библиотеки на основе рефлексии, могут потребоваться правила сохранения ProGuard, которые также можно настроить через expo-build-properties.

Новые значения отпечатков (fingerprint) по умолчанию для сокращения числа нативных пересборок

Изменение версии или файлов внутри node_modules больше не приводит к генерации нового отпечатка. В SDK 58 для отпечатков по умолчанию используется сбалансированный пресет (balanced preset). Он игнорирует распространенные случаи, когда раньше вам мог потребоваться пропуск исходного кода (например, обновление версии в app.json), и вычисляет хэш нативных модулей по имени пакета и версии вместо их файлов и директорий. Узнайте больше о пресетах отпечатков, если вам нужен другой баланс.

Если что-то пошло не так

Начните с раздела Устранение неполадок при обновлении SDK, а затем обратитесь к руководствам по устранению неполадок для конкретной проблемы, с которой вы столкнулись. Исправление неудачной сборки требует иного подхода, чем устранение зависаний или медленной работы приложения.

Для сбоев нативные логи обычно объясняют, что произошло. Прочитайте их с помощью ADB Logcat на Android или Console на macOS для устройств iOS. Еще до того, как вы найдете причину, эти логи полезно предоставить при запросе помощи.

Расскажите нам, как все прошло

Если вы столкнулись с ошибкой, создайте проблему на GitHub, приложив небольшой проект, воспроизводящий ее. Начните с npx create-expo-app и добавьте ровно столько кода, сколько необходимо для демонстрации проблемы. Включите ссылку на репозиторий и точные версии используемых пакетов. Небольшой пример для воспроизведения помогает нам подтвердить исправление, а его создание часто позволяет выявить причину, так как в коде проще разобраться.

Если вы все еще пытаетесь понять, в чем проблема, спросите в Discord, где по средам в 12:00 по тихоокеанскому времени мы также проводим часы вопросов и ответов. Поделитесь ошибкой, затрагиваемой платформой и шагами, которые к ней приводят. На нашей странице поддержки вы найдете больше способов получить помощь.

Если навык обновления пропустил миграцию или внес ненужные изменения, сообщите об этом в репозитории навыков Expo.

Успешного обновления!

О чём эта статья

Ещё в разделе «Разработка ПО»

Все →

Ещё от Expo